Страницы

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

среда, 6 декабря 2023 г.

Проверка пересечений ссылочных параметров в Oberon

В языке Oberon можно передавать переменные через ссылочные параметры процедур — параметры-значения[0] и параметры-переменные. Это удобно, потому что позволяет передавать ссылки на данные без обязательного размещения их в динамической памяти. Если же данные всё равно динамические, существует гарантия неутекания значений указателей с возможным побочным доступом к данным уже после вызова процедуры.

Но иногда возникает потребность в проверке того, не являются ли однотипные параметры на самом деле одним и тем же элементом, что может вызвать затруднение, так как в отличии от указателей сравнения параметров-ссылок в Oberon не предусмотрено. А это может быть важно, если как минимум один параметр — переменный(VAR), и его изменение может привести к нежелательному изменению другого параметра.

суббота, 23 июля 2022 г.

Web-среда 0.1 для транслятора Web-sandbox 0.1 for the translator

Доработана и обозначена как версия 0.1 написанная на Go и JavaScript web-среда(песочница) для взаимодействия с транслятором Восток. Среда позволяет редактировать модули на Обероне, запускать экспортированные процедуры, преобразовывать модули на другие языки программирования. Модули, доступные по умолчанию из окружения транслятора, ограничены в доступе к возможностям сервера.

The web-sandbox written in Go and JavaScript for interacting with the Vostok translator has been fixed as version 0.1. The sandbox allows you to edit modules on Oberon, run exported procedures, convert modules to other programming languages. Modules available from the default translator's environment have restricted access to server's resources.

воскресенье, 30 января 2022 г.

CASE для указателей и записей

Добавлена поддержка указателей и записей в CASE, введённой в пересмотре 2013 года сообщения о языке, и необходимой для эффективного перехода по указанным в ветвях типах.

вторник, 28 декабря 2021 г.

Псевдомодуль SYSTEM

Последствия неправильного применения SYSTEM могут быть
плохо предсказуемыми

Частично воплощена работа с опциональным псевдомодулем SYSTEM для низкоуровневой работы с памятью. Поддержаны основные процедуры - ADR, SIZE, BIT, GET, PUT, COPY. На данном этапе возвращаемый адрес помещается в INTEGER с контролем возможного переполнения, поэтому нормально работает это только в 32-битных системах. По умолчанию псевдомодуль недоступен, но включается при указании транслятору ключа -allow-system. В Java и JavaScript ADR выдаёт бессмысленный результат, а любая попытка чтения или записи памяти заканчивается аварией.

воскресенье, 14 февраля 2021 г.

Telegram бот

Вдобавок к демо-серверу, позволяющему в браузере запускать код на Обероне, сделал telegram-бота, позволяющего схожим образом запускать код прямо в чате.

В сообщении можно отсылать как текст модуля, который будет выполнен, так и скрипт с отдельными вызовами процедур. Чтобы бот получил сообщение в общем чате, в начало сообщения необходимо добавить косую черту, а для скриптового кода нужно указать ещё и сокращённое название языка программирования - /O7:. В индивидуальном чате с ботом дополнительных знаков не нужно.

Поддерживаются 2-е дополнительные команды:

  1. /LIST выводит список доступных модулей, правда, большинство из которых в режиме песочницы выступают лишь заглушками
  2. /INFO Module выводит список экспортированных процедур модуля

понедельник, 23 декабря 2019 г.

Генератор Оберон-кода

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

Сейчас это позволяет портировать код на Обероне-07 на A2OS, а в перспективе, по мере расширения поддержки разбора и генерации других диалектов Оберона, позволит конвертировать исходные коды в самых разных направлениях. Не исключено, что в скором времени транслятор Восток можно запустить как подсистему Blackbox Component Builder

понедельник, 17 июня 2019 г.

deb - пакеты

Добавил возможность сборки deb-пакетов для предоставления пользователю GNU/Linux более удобного способа установки транслятора.

Текущая сборка разбивается на 2-е части - исполняемый файл транслятора и первоначальная библиотека поддержки. Из-за того, что библиотека на текущем уровне развития доступна только на уровне исходного кода, то она не зависит от процессорной платформы. Транслятор же для повышения универсальности собирается для i386 со статическим связыванием со стандартной библиотекой. Если для этого вместо glibc использовать musl-libc или dietlibc, то размер выходного файла получается вполне приемлемым.

Для такой сборки я использовал следующую команду в каталоге проекта из 32-битной Ubuntu 18.04:

$ result/bs-ost run 'make.UseCC("musl-gcc -Os -flto -static"); make.Build; make.Deb' -infr . -m source
Предварительно нужно установить вспомогательные утилиты:
$ /usr/bin/sudo apt install hashdeep musl-tools 
И собрать раскруточную версию транслятора:
$ ./init.sh 
Под командой make.Deb скрываются команды оболочки sh:
для сборки vostok-deflib.deb
rm -r result/vostok-deflib
mkdir -p result/vostok-deflib result/vostok-deflib/DEBIAN result/vostok-deflib/usr/share/doc/vostok-deflib result/vostok-deflib/usr/share/vostok
cp -r library result/vostok-deflib/usr/share/vostok/
cp -r singularity result/vostok-deflib/usr/share/vostok/
cp package/DEBIAN/control-deflib result/vostok-deflib/DEBIAN/control
gzip -9cn package/DEBIAN/changelog-deflib > result/vostok-deflib/usr/share/doc/vostok-deflib/changelog.gz
cp package/DEBIAN/copyright-deflib result/vostok-deflib/usr/share/doc/vostok-deflib/copyright
cd result/vostok-deflib
md5deep -rl usr > DEBIAN/md5sums
cd ..
fakeroot dpkg-deb --build vostok-deflib
для сборки vostok-bin.deb
rm -r result/vostok-bin
mkdir -p result/vostok-bin/DEBIAN result/vostok-bin/usr/share/doc/vostok-bin result/vostok-bin/usr/bin
cp result/ost result/vostok-bin/usr/bin/
cp package/DEBIAN/control-bin result/vostok-bin/DEBIAN/control
gzip -9cn package/DEBIAN/changelog-bin > result/vostok-bin/usr/share/doc/vostok-bin/changelog.gz
cp package/DEBIAN/copyright-bin result/vostok-bin/usr/share/doc/vostok-bin/copyright
cp package/DEBIAN/ost.1 result/vostok-bin/DEBIAN/ost.1
cd result/vostok-bin
md5deep -rl usr > DEBIAN/md5sums
cd ..
fakeroot dpkg-deb --build vostok-bin

В результате сотрудничества с другими проектами на Обероне, deb-пакеты и их обновления доступны в общем репозитории https://wiki.oberon.org/repo

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

понедельник, 24 июля 2017 г.

Скриптовый режим

  1. 19 апреля я добавил в транслятор возможность генерации исполняемого файла и возможность его сразу же запустить
  2. 25 апреля добавил возможность указать команду модуля - экспортированную процедуру без параметров, что приблизило "Восток" к более удобному понятию программы в оригинальном Обероне в противовес традиционному пониманию программы с единой точкой входа.
  3. 5 июля была добавлено скриптовое исполнение, то есть, появилась возможность вызова последовательности экспортированных из разных модулей процедур с параметрами.
  4. 24 июля была добавлена опция командной строки -infr (инфраструктура), позволяющая для простых случаев сократить количество параметров, нужных для запуска кода на Оберон. Можно писать так:
    $VOSTOK/result/ost run "Out.Int(1234 * 4567 + 89ABH, 0); Out.Ln" -infr $VOSTOK
    Или, подготовив shell соответствующей функцией
    function ost { $VOSTOK/result/ost run "$1" -infr $VOSTOK; }
    писать так:
    ost "Out.Int(1234 * 4567 + 89ABH, 0); Out.Ln"

понедельник, 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-команд в трансляторе Восток. Эти возможности являются альтернативой частным и в то же время однообразным р...