Зафиксировал новые версии трансляторов и библиотеки. Со времени прошлого выпуска прошло больше года. Помимо исправления ошибок была усовершенствована генерация JavaScript-кода, а также был добавлен генератор Oberon-кода, позволяющий компилировать результат трансляторами Component Pascal и Active Oberon.
суббота, 27 марта 2021 г.
воскресенье, 14 февраля 2021 г.
Telegram бот
Вдобавок к демо-серверу, позволяющему в браузере запускать код на Обероне, сделал telegram-бота, позволяющего схожим образом запускать код прямо в чате.
В сообщении можно отсылать как текст модуля, который будет выполнен, так и скрипт с отдельными вызовами процедур. Чтобы бот получил сообщение в общем чате, в начало сообщения необходимо добавить косую черту, а для скриптового кода нужно указать ещё и сокращённое название языка программирования - /O7:. В индивидуальном чате с ботом дополнительных знаков не нужно.
Поддерживаются 2-е дополнительные команды:
/LISTвыводит список доступных модулей, правда, большинство из которых в режиме песочницы выступают лишь заглушками/INFO Moduleвыводит список экспортированных процедур модуля
пятница, 15 января 2021 г.
Проверка арифметического переполнения и инициализированности в JavaScript
Поправил до уровня работоспособности генерацию кода JavaScript для проверки арифметических ошибок и состояния инициализированности переменных. Генерация проверок включается и выключается отдельно для каждого вида, но они не являются полностью независимыми, так как проверка арифметики может быть выполнена заодно с инициализированностью.
Например:
r = a * b;
if (-0x80000000 < r && r < 0x80000000) {
...
Проверяемое условие не будет выполнено как в случае выхода за границы, так и в случае, если переменные будут заданы как NaN в качестве неиницилизированности, что позже может быть дополнительно проверено.
пятница, 8 января 2021 г.
Проверка границ массива в JavaScript
Добавил проверку индекса на выход за границы массива для кода, сгенерированного в JavaScript, что было анонсировано почти 2-а года назад. Применённая модель проверки, естественно, замедляет выполнение, но всё же не приводит к взрывной деградации скорости в современных браузерах и в node.js, как это бывает с исполнителями JavaScript.
Был применён такой подход:
array = new Array(len);
this.at = function(index) {
if (0 <= index && index < len) {
return array[index];
} else {
throw new RangeError();
}
};
..
a = arr.at(i);
len находится в контексте объемлющей функции и не меняется после установления, что позволяет jit-компилятору оптимизировать проверки вплоть до сравнения с константами, что может быть очень эффективным. Впрочем, накладные расходы на методы никуда не деваются, а Object.freeze для обеспечения гарантии отсутствия подмены методов и гипотетической возможности их встраивания не помог для оптимизации.
понедельник, 28 декабря 2020 г.
Создание rpm пакетов
Добавил в систему сборки возможность собирать rpm пакеты. Для пакетирования нужен установленный rpmbuild, который доступен не только в дистрибутивах, основанных на rpm, но и в Debian. В чистом каталоге проекта достаточно выполнить 3-и команды:
./init.sh && result/bs-ost run make.Build -infr . -m source result/ost run make.Rpm -infr . -m source
Сборка, как минимум, работает в Ubuntu 20.04 и в Alt Linux 9
Кроме установки в Alt попробовал устанавливать rpm пакеты и в Ubuntu. С помощью утилиты alien успешно преобразовал собранные rpm в deb. Полученные пакеты устанавливаются, и всё работает. Правда, у пакетов теряются прописанные зависимости, поэтому появляется возможность установить без них, что может отрицательно сказаться на работоспособности. К сожалению, надежда на возможность сборки только rpm-пакетов с последующим преобразованием в deb оправдалась не полностью.
В целом, rpm формат показался куда более проработанным, чем deb. Не удивительно, что его выбрали стандартом. Но до действительно хорошего уровня формату тоже далеко.
понедельник, 23 декабря 2019 г.
Генератор Оберон-кода
Добавлен генератор кода на Обероне. Сейчас поддерживается исходный же Оберон-07 и Активный Оберон на уровне, позволяющем транслировать полученный код соответствующими исполнителями.
Сейчас это позволяет портировать код на Обероне-07 на A2OS, а в перспективе, по мере расширения поддержки разбора и генерации других диалектов Оберона, позволит конвертировать исходные коды в самых разных направлениях. Не исключено, что в скором времени транслятор Восток можно запустить как подсистему Blackbox Component Builder
суббота, 13 июля 2019 г.
Проба создания привязки к коду на C++
Для примера я взял открытую C++ библиотеку Open Babel для работы с моделями молекул. API библиотеки необъятно, поэтому решено было сделать только ту привязку, которая необходима для тестовой задачи — чтения молекулы из файла и вывод координат её атомов. Так как для ввода Open Babel использует стандартные классы С++, то в привязку было добавлены функции открытия и закрытия std::ifstream
Расширение командного режима
Расширены возможности кода Oberon-команд в трансляторе Восток. Эти возможности являются альтернативой частным и в то же время однообразным р...
-
Добавлено свойство проверяемости при работе с низкоуровневыми адресами в процедурах из SYSTEM — ADR, BIT, GET, PUT, COPY. Прове...
-
На примере языка Oberon представлен общий подход [0] , позволяющий на основе высокоуровневых средств создать безопасную по памяти программну...
-
Воспользовавшись тестом на производительность с форума oberspace , реализованного для разных языков, проверил свой транслятор . ...
