bmstu-iu9 / bmstu-iu9/refal-5-lambda

Обёртка-имитатор refgo

Open
#334 1 comment 0 reactions 1 assignee Claimed by @Mazdaywik View on GitHub
task
Dominant language
C++
Stars
97
Forks
40
PR merge metrics
No merged PRs in 30d

Description

Мотивация
========
Суперкомпилятор SCP4 крайне неудобно портировать на Рефал-5λ: его установка и выполнение ориентированы на использование классического Рефала-5. Установщик создаёт скрипты для запуска различных проходов суперкомпилятора (по отдельности либо вместе), в которых вызывается `refgo`, управляющая программа суперкомпилятора `main_scp.ref` также вызывает `refgo`.

Суперкомпилятор допускает расширение «плагинами» — в исходные файлы можно добавить `$EXTERN Func;` + `*$EXECUTABLE Func;`, `.rsl`-ку с функцией `Func` передать в командной строке суперкомпилятора как `+plugin.rsl` или `+plugin` (т.к. расширение подразумевается). Управляющая программа `main_scp` всё поймёт правильно и добавит плагины в командную строку вызова `refgo`.

Всё это приводит к трудностям в портировании SCP4 на Рефал-5λ. Впрочем, я уже проходил этот этап, по первому разу было интересно, но муторно.

Хотелось бы устанавливать и использовать SCP4 с Рефалом-5λ, не модифицируя исходный текст суперкомпилятора.

Кроме того, приближение по интерфейсу Рефала-5λ к классическому Рефалу-5 способно снизить порог для новых пользователей (я наивный оптимист).

Реализация
========
В поставку компилятора должна входить утилита `rl-refgo-wrapper`, которая ту же командную строку, что и классическая `refgo` (включая игнорирование ключей, начинающихся на `-`, для вызываемой программы) и имитирует её выполнение.

Утилита при запуске выполняет следующие действия:
* Анализирует свою командную строку, пытается разобрать её как строку интерпретатора `refgo`.
* Находит все `.rsl`-ки, указанные в командной строке (с учётом переменной `REF5RSL`, в частности).
* Вызывает компилятор `rlc` с указанием всех `.rsl`-ек, компилирует во временный `.rasl-module`.
* Загружает и вызывает этот `.rasl-module` (функцию `GO`, если нет — функцию `Go`).

Детали:
---------
Утилита не обязана принимать в точности только те командные строки, что и `refgo`. Допустимы и расширения.

Заменять вручную `refgo` на `rl-refgo-wrapper` не нужно. Можно предусмотреть команду
```
rl-refgo-wrapper --install 〈путь〉
```
где `〈путь〉­` — некий каталог. В этот каталог копируется исполнимый модуль `rl-refgo-wrapper[.exe]` с именем `refgo[.exe]`. Если этот каталог находится в `PATH` до каталога с настоящей `refgo[.exe]`, то скопированный файл его перекроет и будет вызываться обёртка.

Утилита может не искать `.rsl`-ки. Вместо них она может сразу компилировать исходные `.ref`-файлы. Такое поведение может задаваться какой-нибудь специальной опцией. Дополнительные опции могут находиться в конфигурационном файле или в переменной среды, т.к. командная строка для этой цели недоступна.

При каждом запуске вызывать `rlc` для полной перекомпиляции накладно. Вместо этого нужно предусмотреть или кэширование, или перекомпиляцию только изменившихся файлов (по временны́м штампам). Тогда повторные запуски будут выполняться быстрее.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.