Страницы

воскресенье, 26 мая 2019 г.

She-bang для Oberon

В операционной системе Oberon в качестве скриптового языка используется одноимённый язык, на котором написана сама ОС, что в духе минимализма всей системы в целом и языка в частности. Для транслятора "Восток" я воплотил схожий способ запуск команд из модулей. Но если в ОС Оберон для запуска команды достаточно клика мыши на записи, состоящей из имени модуля, точки и имени экспортированной процедуры, например

Hello.Come
текст модуля
MODULE Hello;
  IMPORT Out;
  
  PROCEDURE Come*;
  BEGIN
    Out.String("Hello"); Out.Ln
  END Come;
  
  PROCEDURE Gone*;
  BEGIN
    Out.String("Bye"); Out.Ln
  END Gone;
END Hello.
то для запуска в GNU/Linux требуется запись такого рода в командной оболочке
result/o7c run Hello.Come -infr . -m example
Так как установка ранее не была предусмотрена, то требовалось указывать полное имя транслятора и пути к основным библиотекам.

Как показал опыт, некоторые люди даже знакомые с принципами ОС Оберон без чтения справки ожидали от транслятора поведения, схожего с компиляторами Си, которые работают с кодом в файлах, то есть, чего-то такого

result/o7c run example/Hello.mod -infr .

Я, наконец, решил улучшить интеграцию с GNU/Linux. Сначала добавил возможность установки с использованием в трансляторе пути к основным библиотекам по умолчанию. Для этого я внёс соответствующие изменения в код и добавил процедуры Install, InstallTo, Remove, RemoveFrom в сборочный модуль make.mod. Заодно переименовал исполняемый файл из o7c(Oberon-7 compiler) в ost(Oberon-seven translator). Чтобы установить транслятор нужно выполнить команду:

/usr/bin/sudo result/ost run make.Install -infr . -m source
После установки станет возможным запускать модули так:
ost run Hello.Come -m example

Следующим шагом я добавил режим запуска модуля с указанием одноимённого файла, в котором он находится

ost .Come example/Hello.mod
ost . example/Hello.mod Come
Если же автор поместил код для выполнения в секцию инициализации модуля, то запуск ещё упрощается
MODULE Hello;
IMPORT Out;
BEGIN
Out.String("Hello"); Out.Ln
END Hello.
ost example/Hello.mod
Мне такой подход не нравится, так как снижает гибкость запуска и требует написания разбора текстовых аргументов программы там, где может быть достаточно создания разных экспортированных процедур в коде модуля, но некоторым нравится из-за краткости.

Для всех типов запуска с указанием файла теперь есть возможность задействовать особенность POSIX систем - she-bang, позволяющий запускать скрипты любого языка без привязки иполнителя по расширению файла. Например:

#!/usr/bin/env -S ost .
Так как код на Обероне не привязан к понятию файла, а имеет чёткие границы,
то за пределами модуля можно писать разный текст, в том числе и she-bang
MODULE Hello;
  IMPORT Out;

  PROCEDURE Come*;
  BEGIN
    Out.String("Привет."); Out.Ln
  END Come;

  PROCEDURE Gone*;
  BEGIN
    Out.String("Бывай."); Out.Ln
  END Gone;

END Hello.
После придания файлу атрибута исполнимости:
chmod +x example/Hello.mod
Его можно запускать без обращения к транслятору напрямую:
example/Hello.mod Come
Привет.
example/Hello.mod Gone
Бывай.

Комментариев нет:

Отправить комментарий

Обработка ошибок

Тема корректной обработки ошибок в программе является довольно сложным вопросом в программировании. Отчасти от того, что и она сама являет...