Добрый день, Михаил!
На данный момент в системе контроля версий, на сколько мне известно, живут интерпретатор Рефала-2:
https://github.com/cmc-msu-ai/refal
и мой Рефал-5λ:
https://github.com/bmstu-iu9/refal-5-lambda
Первый уже 6 лет не обновляется, второй активно развивается.
Остальные лежат в zip-архивах на своих сайта.
Какая версия наиболее актуальна? Позволю себе быть необъективным и скажу, что моя. 😉 Рефал-5λ собирается и работает под тремя основными операционными системами: Windows, Linux и macOS, на процессорах с разрядностью 32 и 64 бита.
А собраться рассказать — это приехать на Воронцово поле (см. адрес по Вашей ссылке) или можно дистанционно через Zoom?
С уважением,
Александр Коновалов
Best regards, Mikhail Kovtun
Поэтому обращаюсь (к Рефал-компании) -- думайте и о людях, работающих на машинах без соединения с интернетом.
Воскресенье, 10 октября 2021, 15:32 +03:00 от Mike Potanin mpotanin_AT_gmail.com <re...@botik.ru>:
Добрый день!
Это очень впечатляет -- "мантейнер пакетов Nix и кофаундер хакспейса". Нет уж, я лучше пойду "в мокроступах по топталищу на позорище"...
По делу: последнее время стало модным распространять программы через GitHub. Очень "удобно": программа установки сама, не спрашивая тебя ни слова, полезет на интернет, все найдет, и установит в лучшем виде... Только вот беда -- а как устанавливать такую программу на машине без соединения с интернетом? Мне приходится работать на такой машине (что поделать -- данные, связанные с людьми, очень секретные, и приходится принимать все меры безопасности...). Для установки программы на такой машине мне нужно загрузить архив (*.tar.gz желательно) на машине, подсоединенной к интернету, переслать его на машину без соединения, и там установить. Все работает хорошо, пока установка программы не лезет в интернет... Поэтому обращаюсь (к Рефал-компании) -- думайте и о людях, работающих на машинах без соединения с интернетом.
Добрый день!У меня следующие вопросы
- Нужно вопрос поконкретнее, о чём речь: собранные исполняемые файлы, дистрибутив в исходниках или дистрибутив с открытой лицензией? Первое — несколько проще, второе и третье могут по сложности поспорить с самой разработкой компилятора, если такой способ распространения не был задуман и заложен с систему изначально;
- Интересен компилятор сам по себе или речь идёт о возможности встраивания его в другой софт для расширения возможностей софта?
- Как я понимаю, основные существующие компиляторы Рефала придерживаются «классической» схемы: исходник — программа-компилятор — исполняемый модуль — программа-интерпретатор (я имею право ошибаться!). И всё в текстовом режиме командной строки. Кто нашёл время, тот настроил умный редактор для выполнения функций IDE и более комфортной работы. Это то, что требуется?
Вопрос об установке непосредственно с Github вызван, думаю, тем, что большинство современны программных продуктов используют множество внешних библиотек сторонних разработчиков, которые только так и можно собрать в актуальном комплекте. Для удовлетворения требования автономной работы должна быть возможность переноса собранного таким образом исполняемого кода на автономную (без сети) машину. Думаю, что в большинстве случаев это возможно, хотя и не обязано удовлетворяться автоматически для всех средств распространения пакетов.
Я, в свою очередь, тоже некоторое время назад озадачился созданием Рефал-среды «с нуля», используя достаточно свежие технологии и средства. Поэтому всякие там Github и UTF-8 поддерживаются естественным образом. А собственно сам мой компилятор пока принципиально уступает по производительности существующим «монстрам» (в позитивном смысле!) с 30-летней историей развития. Есть много принципиально новых идей относительно как Рефала, так и среды его исполнения, на реализацию которых, даже эскизную, не хватает пока что ресурса.
Best regards, Mikhail Kovtun
Добрый вечер, Михаил!
В своём ответе также отвечу на несколько соседних писем.
По поводу установки онлайн и офлайн. Для разработки доступ в интернет требуется, т.к. сборочные скрипты bootstrap.bat и bootstrap.sh выкачивают подмодуль. Впрочем, разрабатывать без интернета не очень логично, т.к. исходники лежат в GitHub и новый код всё равно придётся туда коммитить.
Установка может проходить в нескольких вариантах:
https://github.com/bmstu-iu9/refal-5-lambda/releases/tag/3.3.1
На unix-подобных системах Linux и macOS можно использовать модный нынче способ установки curl -L … | bash. Но доступны и офлайн-варианты: распаковать архив и выполнить в нём ./bootstrap.sh (скрипт из скачанного архива соединения с интернетом не требует). Фактически, curl -L … | bash скачивает архив, распаковывает и вызывает в нём ./bootstrap.sh. На Windows используется классический setup.exe.
Под современными дистрибутивами Linux и в последних версиях macOS всё собирается без проблем. На старых дистрибутивах Linux, например, на Fedora 16, есть проблемы со сборкой, которые я пока не решил. Самая ранняя система Windows, на которой я регулярно собираю исходники — Windows 7. Однако, нет причин не собраться и на Windows XP, и возможно даже, Windows 2000, но там я не пробовал. На Windows 98 собрать не получится, т.к. батники написаны для cmd.exe, а на Win9x — command.com.
Вариант с curl -L … | bash ставит систему в домашний каталог (~/.local/share/refal-5-lambda), прописывает PATH в ~/.bashrc или в ~/.bash_profile. Setup.exe на Windows тоже ставит в профиль пользователя (%APPDATA%). Если скачивать архив и собирать из исходников, то куда захотите, туда и ставьте.
Установку в классические каталоги Linux (/usr/bin и прочие) я пока не поддерживаю, т.к. в этом не очень разбираюсь. Если Nix требует установки туда, то открывайте заявку в GitHub (https://github.com/bmstu-iu9/refal-5-lambda/issues), будем разбираться вместе.
По поводу интеграции с IDE. Есть плагин для IntelliJ IDEA, плагин умеет подсвечивать синтаксис, автодополнять имена и показывать на синтаксические ошибки. Есть поддержка нескольких текстовых редакторов: Vim, Far Colorer и VSCode.
«Рефал-5λ можно ограничить (например, опцией командной строки), чтобы он поддерживал только то, что понимает суперкомпилятор?»
Ну, для начала, SCP4 (я так понял, о нём идёт речь) сам по себе не очень полностью поддерживает Рефал-5. Например, не поддерживаются программы из нескольких файлов ($EXTERN в одном файле, $ENTRY в другом). С суперкомпиляцией программ, которые вызывают функцию Mu, есть некоторые сложности. SCP4 знает не все имена встроенных функций. SCP4 — это экспериментальный суперкомпилятор, но не промышленный.
Есть опция командной строки, которая ограничивает компилятор тем, что понимает классический Рефал-5 (т.е. запрещаются вложенные функции и другие расширения синтаксиса). Называется эта опция --classic. Об опции, которая ограничивала бы исходники тем, что поддерживает SCP4, я даже не задумывался. И мне не очевидны сценарии работы, где эта опция была бы полезна.
SCP4 после некоторой его доработки напильником может быть собран Рефалом-5λ. В его сборочном скрипте зашиты команды запуска refc и refgo. Сам суперкомпилятор многопроходный, проходы выделены в отдельные процессы, запускаемые последовательно. Управляющий компонент запускает эти процессы посредством того же refgo. Всё это можно переделать, чтобы собиралось при помощи Рефала-5λ, я это делал когда-то. (Есть адаптированные исходники: https://mazdaywik.github.io/direct-link/scp4_000925-srefc.zip, только в них нужно заменить srefc → rlc, srmake → rlmake.)
«Научить суперкомпилятор функциям высших порядков будет не просто…»
Я об этом как-то делал доклад в ИПМ имени Келдыша РАН. Там возникают всякие сложности со ссылочной эквивалентностью замыканий, когда вложенные функции начинают специализироваться. Да, там всё непросто, если стремиться к действительно эквивалентным преобразованиям. Однако, если забить на нарушение инвариантов, которые в Рефале должны быть незыблемыми, то всё становится проще.
«а сделать ещё пакет для суперкомпилятора было бы полезно»
На эту тему лучше напрямую списаться с Андреем Петровичем Немытых: nemy...@math.botik.ru.
«Можно, конечно, и по Zoom или совместить offline и online, какое-то оборудование для видеоконференций там есть.»
Могу приехать и выступить. Так даже интереснее.
Научить суперкомпилятор функциям высших порядковбудет не просто, а сделать еще пакет для суперкомпилятора было бы полезно.
Добрый вечер всем!
Коллега Михаила Потанина уже начал готовить сборку пакета для пакетного менеджера Nix:
https://github.com/bmstu-iu9/refal-5-lambda/pull/363
И выяснилась любопытная проблема — Рефал-5λ не совместим с утилитой strip:
https://github.com/bmstu-iu9/refal-5-lambda/issues/364
Утилита strip, я напомню, используется для удаления отладочной информации из исполнимых файлов, собранных компилятором GCC.
Дело в том, что Рефал-5λ создаёт довольно странные исполнимые файлы. Исполнимый файл состоит из интерпретатора байткода (RASL’а, как говорят рефальщики), в конец которого непосредственно приписан сам байткод. Интерпретатор после запуска открывает сам себя, находит там байткод (он начинается со специальной сигнатуры) и его выполняет.
Цели в этом случае достигаются следующие:
• Построенные файлы полностью автономны — это просто исполнимый файл ОС, запускаемый естественным образом. Никакой доустановки интерпретаторов или библиотек рантайма на машину не требуется.
• Компилятору Рефала для создания этих файлов не требуется компилятор C++ — в дистрибутиве уже лежит готовый интерпретатор, к которому нужно тупо прилепить байткод скомпилированной программы.
• Переносимость — работает на Windows, Linux и macOS.
Но оказалось, что утилита strip, когда применяется к исполнимому файлу, смотрит только на префикс-интерпретатор, его перестраивает и теряет весь приписанный в конец байткод.
Команда strip вызывается при сборке пакета для Nix. Сейчас в скрипте сборки пакета прописана команда, подавляющая вызов strip. Но это, понятное дело, не решение проблемы, а всего лишь обходной путь.
Можно ли достигнуть описанных выше целей и обеспечить совместимость со strip — не знаю.
С уважением,
Александр Коновалов
From: Mike Potanin mpotanin_AT_gmail.com <re...@botik.ru>
Sent: Monday, October 11, 2021 1:30 PM
To: Александр Гусев <gusev_aleks...@mail.ru>
Cc: re...@botik.ru
Subject: Re: Актуальные реализации и текущее состояние.