Mazdaywik / Refal-05

Очень минималистичный компилятор Рефала
https://mazdaywik.github.io/Refal-05/
Other
4 stars 3 forks source link
compiler refal

Компилятор Рефала-05

О языке и компиляторе

Рефал-05 — минималистичный самоприменимый компилятор минималистичного диалекта Рефала, имеющий общее подмножество с классическим Рефалом-5. На этом подмножестве он и написан.

Ставились две цели разработки:

Удалось достичь объёма исходного кода примерно в 6000 строк, включая исходники компилятора, библиотеки встроенных функций, рантайма и скриптов сборки. И, по мнению автора, это минимум. Формально код можно уменьшить, сократив имена переменных и функций, но это пагубно сказалось бы на стиле исходного кода, ведь подразумеваемой целью были также понятные и прозрачные исходники.

Также целью было сделать не игрушку, вещь в себе, которая может только самоприменяться, но и сохранить возможности практического инструмента. Об этом в разделе «Установка и использование».

Разработка велась на основе старой версии Простого Рефала путём как отсечения избыточных возможностей, так и путём подгонки синтаксиса к Рефалу-5. Поэтому архитектурно и идейно он наследует Простой Рефал. Причём даже, по духу и идее он близок к Простому Рефалу версии 001, только при этом совместим с Рефалом-5 и в исходниках существенно меньше говнокода.

Особенности языка:

Особенности текущей реализации:

Из соображений минимализма оставлены только те функции, которые реально используются в компиляторе. Единственное исключение — функция Card. Потому что Рефал без поддержки перфокарт — это ущербный Рефал.

Установка и использование

Для раскрутки компилятора у Вас должен быть установлен Рефал-5 версии PZ Oct 29 2004, набор библиотек для Рефала-5 refal-5-framework, а также компилятор языка Си89.

Установка набора библиотек «refal-5-framework»

Установите библиотеки репозитория Mazdaywik/refal-5-framework согласно инструкции в его README.

Раскрутка на Windows

Раскрутка на POSIX (Linux, macOS)

Если у Вас установлен компилятор GCC (или Clang на macOS), то достаточно первого шага:

Если у Вас GCC не установлен, или для раскрутки желаете использовать другой компилятор, то нужно будет отредактировать файл c-plus-plus.conf.sh и запустить ./bootstrap.sh повторно.

Установка и конфигурирование

После раскрутки будет создана папка bin, в которой будет располагаться исполнимый файл refal05c.exe (или refal05c). Его уже можно запускать. Если его вызвать с именем исходного файла, он скомпилирует его в исходник на Си. Но, чтобы получать с его помощью получать исполнимые файлы, выполните следующие действия:

Примечание. На POSIX-системах (Linux или macOS) в переменную R05CCOMP желательно добавлять -DR05_POSIX (например, gcc -DR05_POSIX) — в этом случае функция System будет корректно возвращать код возврата. Без данного флага работать всё равно всё будет, только System будет возвращать сырое значение функции system языка Си, которое может отличаться от фактического кода возврата (см. man 2 wait для более подробных сведений).

Компиляция и запуск программ

Классический пример — Hello, World!:

$ENTRY Go {
  = <Prout 'Hello, World!'>
}

Сохраните этот текст в файл hello.ref и выполните в командной строке команду

refal05c hello refal05rts Library

Здесь hello — это имя нашего исходника (расширение .ref здесь можно не писать), refal05rts — библиотека поддержки времени выполнения (на жаргоне — «рантайм»), содержит функции, которые вызываются из сгенерированного кода, и Library — библиотека со встроенными функциями Рефала (той же Prout).

В результате в текущей папке должен появиться файлик hello.c — результат компиляции в Си и исполнимый файл, который, в зависимости от операционной системы и компилятора Си, может называться hello.exe, a.exe или a.out. Примечание. Некоторые компиляторы языка Си оставляют после себя мусор из объектных файлов (.obj) и других служебных файлов (.tds, .pch и т.д.), этот мусор можно (и нужно) удалять. Также можно удалить hello.c.

Теперь мы можем запустить программу и увидеть что-то вроде:

Hello, World!

Как-то так.

Замечание о дереве коммитов

За основу были взяты ранние коммиты Простого Рефала, но чутка переписаны.

Исходную историю и исходные коммиты можно найти в репозитории Рефала-5λ.

Лицензия

Компилятор распространяется по двухпунктной лицензии BSD с оговоркой относительно компонентов стандартной библиотеки и рантайма — их можно распространять в бинарной форме без указания копирайта. При отсутствии данной оговорки для скомпилированных программ пришлось бы указывать копирайт самого компилятора, что неразумно.