Страницы

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/local/bin/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
Бывай.