Страницы

воскресенье, 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
Бывай.

пятница, 25 января 2019 г.

Самотрансляция в Javascript

Генератор Javascript достиг того состояния, которое позволяет транслятору получить работоспособную версию себя в Javascript виде. Для этого понадобилось не так уж много после прохождения малых тестов, и основная часть проблем была связана с моим незнанием Javascript и библиотек для него.

Теперь предстоит поработать над улучшением диагностик некорректного выполнения, в частности, выхода за границы массива. Доработки требуются и для полной работы с многомерными массивами и некоторыми другими вещами.

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

Генератор Javascript кода

Сделан ещё один шаг в направлении многоцелевого транслятора Оберона - была добавлена возможность генерации кода в Javascript. Обеспечена возможность прохождения простых тестов, но для трансляции самого транслятора генератор кода предстоит доработать.

Генератор Javascript кода был был переделан из генератора Java кода, который в свою очередь был переделан из генератора C кода. Так что артефакты переделок продолжают накапливаться.

Модуль Оберона отображается на безымянную функцию, автоматическое исполнение которой приводит к появлению объекта модуля в специальном объекте o7, который, также, хранит дополнительные функции для более удобной поддержки языка. Как и для Java, переменные примитивных типов, участвующие как фактические параметры-переменные преобразовываются в одноэлементные массивы. Локальные и безымянные записи в духе прототипного ООП отображаются на функции-конструкторы. Для присваивания значения записей генерируются необходимые функции. Для кодирования типа CHAR используются целые числа.

Обновление: достигнута возможность самотрансляции

пятница, 14 сентября 2018 г.

Android

На днях cделал прототип сборщика простых приложений Android, написанных на Oberon. Работает он только под Ubuntu 18.04, так как в этой версии есть возможность установки Android SDK из стандартного репозитория, что позволяет легко ссылаться на нужные файлы без дополнительных действий.

Получить исполняемый файл сборщика можно из каталога транслятора командой:

 $ result/ost to-bin AndroidBuild.Go result/osa -infr . -m source 

При вызове

 $ result/osa install-tools 

сборщик выдаст команду, которую нужно выполнить для установки утилит, достаточных для сборки Android приложений с помощью него.

Apk файл для Android 2.3 можно собрать командой build:

 $ result/osa build ColorCells.Go result/cells.apk -infr . -m example/android 

Можно и сразу запустить приложение на телефоне:

 $ result/osa run ColorCells.Go -infr . -m example/android 

Данный пример создаёт такую картинку:

Второй пример создаёт приложение, рисующее звезду, количество лучей которой настраивается при сборке:

 $ result/osa run 'Star.Go(5, 0.38)' -infr . -m example/android 

Обёртки API Андроид, предоставляющие в Обероне доступ к возможностям мобильной ОС существенно неполны, по сути, являясь минимальными обвязками для указанных выше примеров.

К звёздам!
$ result/osa run Rocket.Fly -infr . -m example/android


Обновление: cборка на самом Android.

суббота, 18 августа 2018 г.

Java

Две недели назад добавил в транслятор Оберона возможность генерации Java кода, что является очередным шагом на пути по созданию многоцелевого транслятора. Работа далека от завершения — сейчас проходят лишь простые тесты. Еще предстоит доработать генерацию для возможности полной самотрансляции.

Модуль генерации Java был переделан из генератора C кода. Это позволило провести работу в полуавтоматическом режиме во время почти отдыха, но привело к наличию артефактов, специфичных для Си и не характерных для Java. Для упрощения генерации был создан модуль AstTransform, преобразовывающий переменные параметры, безымянные и локальные записи, и локальные подпрограммы в более близкий к Java Оберон-код.

Модуль Оберона отображается на класс в Java. Процедуры — статические методы. Процедурные переменные — это экземпляры-воплощения абстрактного класса с единственным виртуальным методом. Переменные примитивных типов, участвующие как фактические параметры-переменные преобразовываются в одноэлементные массивы. Локальные и безымянные записи становятся именованными статическими внутренними классами. Для присваивания значения записей генерируются соответствующие методы. CHAR и BYTE превращаются в byte, при вычислениях с которыми производятся преобразования, нацеленные на преодоления наличия знака у Java-byte.

воскресенье, 25 февраля 2018 г.

Подсчёт ссылок и кириллические имена

За последнее время я доработал освобождение динамической памяти при использовании подсчёта ссылок. Теперь при освобождении записи для неё вызывается функция очистки, которая зануляет входящие в неё указатели, благодаря чему стало возможным автоматическое освобождение цепочек, но, по-прежнему, без разрыва циклических связей. Остаются недоделки, связанные с локальными для подпрограмм записями.

Выбор подсчёта ссылок задаётся ключом -memng counter .

В нынешнем состоянии при сборке самого транслятора с подсчётом ссылок его время работы увеличивается в 1.6 раза.

Также, ощутимым нововведением стало сделанная на днях поддержка кириллических идентификаторов. Кириллица пока ограничивается современными алфавитами русского, украинского и белорусского языков. Имена со смешанным набором латиницы и кириллицы запрещены. Поддержка включается ключом -cyrillic .

Забавно, что внедрив транслитерацию при переводе в программу на Си, из-за допущенной ошибки, из-за которой имена переносились без преобразования, я случайно обнаружил, что в Си также есть поддержка идентификаторов с расширенным набором символов. С этим списком можно ознакомиться в приложении D стандарта языка ISO C99 или ISO C11. Поддержка есть в компиляторах tcc, gcc и clang, но во всех по-разному. В CompCert расширенный диапазон букв недоступен, поэтому транслитерация, всё-таки, пригодилась.


среда, 22 ноября 2017 г.

Поддержка работы в WINE

Обеспечена работа транслятора в WINE(в Windows не проверяю). В проект добавлен сценарий build.cmd, который с помощью Tiny CC собирает транслятор из предварительно сгенерированного C-кода, а затем тот собирает сам себя. Как и в GNU/Linux есть возможность сборки и исполнения модулей без промежуточных файлов, когда транслятор все необходимые действия производит сам.

В WINE не всё будет работать хорошо из-за того, что имена файлов регистронезависимые. Над этим ещё нужно поработать.

Расширение командного режима

Расширены возможности кода Oberon-команд в трансляторе Восток. Эти возможности являются альтернативой частным и в то же время однообразным р...