You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Суперкомпилятор 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 для полной перекомпиляции накладно. Вместо этого нужно предусмотреть или кэширование, или перекомпиляцию только изменившихся файлов (по временны́м штампам). Тогда повторные запуски будут выполняться быстрее.
The text was updated successfully, but these errors were encountered:
Можно сделать и ещё один шаг вперёд: написать обёртку-имитатор refc. Эта обёртка может вызывать и компилятор rlc-core, который создаёт файл .rasl, но с расширением .rsl. Но поскольку обёртка refgo всё равно вызывает компилятор и может учитывать ключи оптимизации, включая -OG, можно поступить проще. Можно просто копировать файл, добавляя в начале какой-нибудь псевдокомментарий вроде *$MOCK, чтобы можно было отличить исходник от настоящего двоичного файла по первой строчке.
Но, если просто копировать, при наличии синтаксических ошибок в исходном файле будут проблемы. Компилятор будет показывать на копию с расширением .rsl, что будет несколько неочевидно пользователю. Поэтому можно копировать файл только если синтаксических ошибок в нём нет.
Но, если проверено отсутствие синтаксических ошибок, значит, уже построено синтаксическое дерево. Зачем его отбрасывать? Можно в файл .rsl сериализовать дерево в формате XXIO. Но при этом нужно будет придумать, как отличать сериализованное дерево от двоичного файла Рефала-5 PZ. Но это вопрос технический.
Мотивация
Суперкомпилятор 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[.exe]
с именемrefgo[.exe]
. Если этот каталог находится вPATH
до каталога с настоящейrefgo[.exe]
, то скопированный файл его перекроет и будет вызываться обёртка.Утилита может не искать
.rsl
-ки. Вместо них она может сразу компилировать исходные.ref
-файлы. Такое поведение может задаваться какой-нибудь специальной опцией. Дополнительные опции могут находиться в конфигурационном файле или в переменной среды, т.к. командная строка для этой цели недоступна.При каждом запуске вызывать
rlc
для полной перекомпиляции накладно. Вместо этого нужно предусмотреть или кэширование, или перекомпиляцию только изменившихся файлов (по временны́м штампам). Тогда повторные запуски будут выполняться быстрее.The text was updated successfully, but these errors were encountered: