Страницы

суббота, 27 марта 2021 г.

Версия 0.0.4

Зафиксировал новые версии трансляторов и библиотеки. Со времени прошлого выпуска прошло больше года. Помимо исправления ошибок была усовершенствована генерация JavaScript-кода, а также был добавлен генератор Oberon-кода, позволяющий компилировать результат трансляторами Component Pascal и Active Oberon.

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

Telegram бот

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

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

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

  1. /LIST выводит список доступных модулей, правда, большинство из которых в режиме песочницы выступают лишь заглушками
  2. /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-команд в трансляторе Восток. Эти возможности являются альтернативой частным и в то же время однообразным р...