-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Собрать Рефалом-05 (прямо или косвенно) некоторые программы для Рефала-5 #28
Comments
Обнаружилась программа с функциями https://groups.google.com/d/msg/refal/Bc429ngDJf4/1LsOCFieBwAJ |
Модульный Рефал использует следующие встроенные функции:
От функции |
Ранее она использовалась в целевом .ref-файле back-end’а Рефала-5, причём по незначительному поводу.
Слабое место функции Зерном является значение текущего времени. Поэтому, если программа начинается, например, с |
Теперь Рефал-05 при компиляции Модульного Рефала жалуется на необъявленные идентификаторы. |
Для совместимости профиля Рефала-5 с Рефалом-05 добавлена генерация функций для идентификаторов, создаваемых для АДТ и идентификаторов Модульного Рефала. Функция имеет вид Имя { Explode = 'Квалифицированное::Имя::Сущности'; } Так что такие имена можно вызывать как <Mu s.Name Explode> и получать их текстовое представление. Если это, конечно, когда-нибудь понадобится.
Подавляющее большинство необъявленных функций укрощено предыдущим коммитом — для имён скобок и идентификаторов генерируются функции. Но есть некоторое количество идентификаторов, явно описанных в нативных вставках:
При этом «системными» являются Есть синтаксис
и через него, в частности, объявлены
К слову, если развивать совместимость Модульного Рефала с Рефалом-05, то FS-Extent можно подключать как внешнюю RSL-ку — для целевой компиляции в Рефал-05 она будет нормальным исходником на Си, реализующим функции файловой системы. |
Можно определять функции-псевдонимы, для которых нужно автоматически создать $EXTERN. Для этого вместо ALIAS нужно написать EXTERN. Коммит также относится к Mazdaywik/Refal-05#28, поскольку идея расширить нативные определения возникла при обеспечении совместимости с Рефалом-05.
Модульный Рефал собрать удалось! Т.е. файл Цели обеспечить поддержку Рефала-05 на back-end’е Модульного Рефала пока не ставится. Хотя можно добавить параметр конфигурации, предписывающий вызывать не Во всяком случае цель собрать Рефалом-05 Модульный Рефал выполнена. На одну галку меньше. |
Но вместе с |
Функции RMCC перенести удалось. Потребовались следующие правки:
Они вызываются всего в двух местах. В принципе, можно было бы исправить программу так, чтобы они были уже не нужны. Но я принципиально не менял логику, да и лениво было разбираться. К слову, нашлась программа, на которой классическая реализация быстрее:
Т.е. в Рефале-05 медленные циклы по открытым переменным и сопоставления с повторными t-переменными. Первое ожидаемо: язык сборки образцов унаследован от Простого Рефала. А вот повторные переменные реализуются кодом на Си: Lines 366 to 398 in a908b36
Возможно, он написан неэффективно, функции r05_empty_seq() , move_left() , equal_nodes() следовало вручную заинлайнить.
Кстати, компиляция с
Но важен сам факт: RMCC работает. |
Генератор случайных программ Немытых (тот, который включён в Рефал-5λ):
Функция Корректные значения идентификаторов для корректности программы не так важны. Достаточно чтобы функция реализовывала взаимно однозначное отображение строчек символов на символы. Поэтому можно просто написать фальшивую |
Возник любопытный момент: программа Поэтому предлагается наделить функции Для функции умножения расширять семантику не надо — это неоправданно сложно. |
Удалось перенести генератор случайных программ Немытых. Я его приложу к комментарию (random-ported-to-05.ref.txt). Правки вполне предсказуемые:
Самое важное: уточнилась семантика |
Сделал черновую попытку собрать MSCP-A. Предсказуемо потребовалось добавить enum’ы, их набралось около 200. Но выявились и более существенные проблемы.
Есть предложение добавить Предлагается следующая семантика. Если образ символа, возвращаемый И это очередное тонкое отличие от Рефала-5. В Рефале-5 можно записать
и вызвать функцию с заданными именем. В Рефале-05 предыдущий код будет работать только если |
Поддержку Удалось скомпилировать MSCP-A с исправлением особых ошибок Рефала-05, часть тестов запускаются, часть валятся. Валятся они так:
Похоже, что нужно реализовывать знаковую арифметику, как минимум, для функций
Если удастся запустить все тесты, то нужно будет сравнить быстродействие Рефала-05 с Рефалом-5. @TonitaN, самый медленный тест — |
Из этих да, именно он. |
А у меня как раз
|
Аргументы функций не могут содержать несколько макроцифр, результат может — поэтому «полудлинная».
Окончания теста
Первый скомпилирован при помощи Второй скомпилирован при помощи Рефала-05 (актуальные коммиты d5bb601 и Mazdaywik/refal-5-framework@171a994), компилятор языка Си — BCC 5.5.1 без флагов оптимизации (командная строка Расхождения в числе шагов связаны с тем, что условия и блоки рассахариваются до базисного Рефала. При реализации #35 производительность может измениться как в ту, так и в другую сторону. Интересно то, что замеры времени почти совпадают:
Откомпилировал с созданием профиля (опция
Целиком: __profile-05.txt. Функции с суффиксом Чтобы увидеть результат рассахаривания, нужно собрать рассахариватель из папки rlmake -d ..\lib -o desugar.exe main.ref Затем перенести файл desugar.exe WordEquations.ref WordEquations-desugar.ref |
Преамбула
Очевидно, напрямую можно компилировать только программы, входящие в общее подмножество. Но таковых почти нет: сам Рефал-05 и какие-то крохотные тестовые примерчики, не использующие символы-слова.
Если в программу добавить псевдокомментарии
*$ENUM
/*$EENUM
и дополнительные$EXTERN
’ы, то класс допустимых программ можно расширить практически до базисного подмножества Рефала-5 (с исключениями для несовместимого использованияMu
). И это всё.Но у нас есть препроцессор, которым можно преобразовывать программы на полном Рефале-05 к его базисному подмножеству: 5-to-basis. И он умеет сохранять псевдокомментарии. С его помощью можно расширить класс программ, к которым применим Рефал-05.
Задача
Задача состоит в том, чтобы при помощи
5-to-basis
и дополнительной разметки псевдокомментариями собрать некоторые сторонние программы, при необходимости расширить набор встроенных функций. Некоторые встроенные функции добавить не получится в принципе, прежде всего, этоImplode
.Предлагается перенести следующие программы:
Собственно, 5-to-basis. С ней не должно быть больших трудностей. В её репозитории уже создана заявка Собираться при помощи Рефала-05 refal-5-framework#3 (Суметь собрать 5-to-basis #37).
Модульный Рефал, скомпилированный в Рефал-5.
Модульный Рефал поддерживает только базисное подмножество, соответственно, компилируется в базисное подмножество Рефала-5 (в том числе).
Проблемы могут возникнуть с функциями, описанными при помощи нативных вставок, в них могут быть условия и блоки. Тут два решения проблемы: либо сконвертировать при помощи
5-to-basis
, либо переписать нативные вставки в исходниках.Возникнет проблема с идентификаторами, которые потребуется объявить как
*$ENUM
. Их можно добавить либо вручную (что дофига), либо автоматически, модифицировав back-end. Автоматический вариант проще.Другая проблема будет в том, что Модульный Рефал использует статические ящики → скомпилированный код использует копилку. Что с этим делать — пока не очевидно, придумаю в процессе. Может быть, добавлю копилку.(См. обновление #27)RMCC Скоробогатова. Тут без
5-to-basis
не обойтись.Генератор случайных программ на Рефале А. П. Немытых. Опять, конвертируем при помощи
5-to-basis
.Попробовать откомпилировать и запустить основной проход SCP4.
На сколько я понял из исходников, функция
Implode
, которую невозможно добавить в Рефал-05, в SCP4 используется преимущественно во front-end’е (inref4
иmst
), основная фаза преобразований её почти не использует. Однако, основная фаза используетXxin
(илиSysfun
) для загрузки сериализованных объектных выражений, где неявно создаются новые идентификаторы. Что можно сделать?Implode
и как её можно обойти.Xxin
/Sysfun
просто захардкодить некий константный граф для запуска тестового примера.Понятно, что запуск косвенный после препроцессирования в базисное подмножество.
Здесь, кстати, аналогичная проблема с копилкой.(См. обновление #27)Какие-нибудь ещё программы, которые мне попадутся.
The text was updated successfully, but these errors were encountered: