Страницы

Показаны сообщения с ярлыком "Восток". Показать все сообщения
Показаны сообщения с ярлыком "Восток". Показать все сообщения

воскресенье, 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 не всё будет работать хорошо из-за того, что имена файлов регистронезависимые. Над этим ещё нужно поработать.

понедельник, 14 ноября 2016 г.

Скорость ООП сортировки вставками на Oberon, Objective-C, C++, Go

Продолжаю тестировать транслятор Оберона из проекта "Восток". На сей раз мой взор пал на производительность при использовании объектно ориентированного подхода. Ранее я уже проводил сравнение для Си, Objective-C, C++ на примере сортировки вставками. Недостатком того воплощения было то, что в нём испытывался только вызов виртуального метода, а безопасного приведения от общего типа к расширенному не было. Для Си это требовало написания большего количества текста, чем нужно, поэтому и для остальных языков оно было исключено. Теперь, когда у меня есть транслятор Оберона в Си, эту возможность задействовать куда проще, поэтому я соответствующим образом подправил тест, также заменив Си на Оберон.

Результаты интересные, судите сами.

воскресенье, 13 ноября 2016 г.

Скорость пузырьковой сортировки на Oberon, C++, Go, Rust

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

Одним из преимуществ использования транслятора Оберона перед непосредственным написанием кода на C/C++ является лёгкая возможность добавления проверок границ массива и использования неинициализированных переменных. Современные компиляторы Си тоже не так просты и позволяют добавлять некоторые проверки (-fsanitize), впрочем, рассматриваемые авторами больше как отладочная возможность. Сравним эти возможности.

четверг, 20 октября 2016 г.

Проект Восток. Поехали

Выложил на github исходный код проекта "Восток", который представляет из себя транслятор Оберона. Это нулевая версия, и пока весьма нестабильная. Впрочем, транслятор может не так уж и мало - собрать сам себя, так как в лучших паскалевских традициях написан на собственном входном языке - Oberon-07.

Проект задумывался для возможности партизанского программирования в тылу у противника - коммерчески востребованных языков программирования, используя его как генератор C, C++, Javascript, Java кода и других. Для этого у Oberon есть все предпосылки: язык достаточно прост, чтобы его транслятор можно было создать 1-му человеку, отсутствие навороченных абстракций и низкоуровневых возможностей на уровне ядра языка позволяет относительно легко отображать его на другие языки программирования - как низкоуровневые, так и высокоуровневые, и при этом сам язык достаточно мощен, гибок и защищён от ошибок, чтобы программирование на нём было вполне удобным. Практический смысл этого - возможность использовать один и тот же код на самых разных платформах. Ранее для такой цели я использовал C, но было сложно назвать это удобным и надёжным.

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

Но пока предстоит немало потрудиться над стабильностью транслятора и над качеством производимого C-кода, поэтому о других целях говорить рано.

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

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