Страницы

Восток. 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 Андроид, предоставляющие в Обероне доступ к возможностям мобильной ОС существенно неполны, по сути, являясь минимальными обвязками для указанных выше примеров.

Восток. Java

Сообщения о трансляторе переехали в отдельный блог.

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

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

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

Язык C безопаснее Java из-за неопределённого поведения

Неопределённое поведение в стандарте языка C принято считать злом, делающие программы на C более опасными, но полезной стороной которого является свойство, позволяющее компилятору создавать более эффективный код. Надо сказать, что это верно лишь отчасти, но указать на это, похоже, некому, так как обильное количество материалов на эту тему пересказывает, по большому счёту, одну и ту же точку зрения. А тут есть что возразить.

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

Сообщения о трансляторе переехали в отдельный блог.

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

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

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

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

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