Актуальные реализации и текущее состояние.

9 views
Skip to first unread message

Mike Potanin mpotanin_AT_gmail.com

unread,
Oct 10, 2021, 8:32:24 AM10/10/21
to re...@botik.ru
Добрый день!
Рефалом заинтересовался мой друг, мантейнер пакетов Nix и кофаундер хакспейса.
Он спрашивает какие версии наиболее актуальны, чтобы сделать для них пакеты в Nix
(желательно работающие под Linux и хранящиеся не в zip-архиве, а в системе контроля версий,
позволяющей сослаться на конкретный коммит ;-)) и предлагает как-нибудь собраться у него
в хакспейсе (https://t.me/undefspace), чтобы кто-нибудь рассказал про текущее состояние
Рефала и обсудить, куда двигаться.

С уважением,
Михаил Потанин

Александр Коновалов a.v.konovalov87_AT_mail.ru

unread,
Oct 10, 2021, 9:34:02 AM10/10/21
to re...@botik.ru

Добрый день, Михаил!

На данный момент в системе контроля версий, на сколько мне известно, живут интерпретатор Рефала-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?

 

С уважением,
Александр Коновалов

Dr Mikhail Kovtun, Ph.D. mikhail.kovtun_AT_duke.edu

unread,
Oct 10, 2021, 10:56:35 AM10/10/21
to re...@botik.ru
Добрый день!

Это очень впечатляет -- "мантейнер пакетов Nix и кофаундер хакспейса". Нет уж, я лучше пойду "в мокроступах по топталищу на позорище"...

По делу: последнее время стало модным распространять программы через GitHub. Очень "удобно": программа установки сама, не спрашивая тебя ни слова, полезет на интернет, все найдет, и установит в лучшем виде... Только вот беда -- а как устанавливать такую программу на машине без соединения с интернетом? Мне приходится работать на такой машине (что поделать -- данные, связанные с людьми, очень секретные, и приходится принимать все меры безопасности...). Для установки программы на такой машине мне нужно загрузить архив (*.tar.gz желательно) на машине, подсоединенной к интернету, переслать его на машину без соединения, и там установить. Все работает хорошо, пока установка программы не лезет в интернет... Поэтому обращаюсь (к Рефал-компании) -- думайте и о людях, работающих на машинах без соединения с интернетом.

Best regards,
Mikhail Kovtun

Andrei Klimov andrei_AT_klimov.net

unread,
Oct 10, 2021, 4:37:09 PM10/10/21
to re...@botik.ru
On Sun, 10 Oct 2021 at 17:56, Dr Mikhail Kovtun, Ph.D. mikhail.kovtun_AT_duke.edu <re...@botik.ru> wrote:
Поэтому обращаюсь (к Рефал-компании) -- думайте и о людях, работающих на машинах без соединения с интернетом.

Миша, я в чем проблема? Ценный несекретный софт может лежать в двух видах: как в интернет-системах, так и устанавливаться без оного. До сих пор много десятилетий, мы считали нормальным готовить дистрибутивы без связи с интернетом по привычкам, сложившимся в доинтернетовские времена. А сейчас, как я понял, поступил запрос сделать в том числе и интернетовский дистрибутив в ДОПОЛНЕНИЕ к старым традициям. 

Однако сейчас наша реальная проблема – другая: далеко не все существующие Рефалы имеют нормальные классические дистрибутивы. Нужно ковыряться, чтобы что-то заработало.

Всего наилучшего,
Андрей Климов

Александр Гусев gusev_aleksandr_AT_mail.ru

unread,
Oct 11, 2021, 5:52:52 AM10/11/21
to re...@botik.ru, mpot...@gmail.com
Добрый день!
 
У меня следующие вопросы
  1. Нужно вопрос поконкретнее, о чём речь: собранные исполняемые файлы, дистрибутив в исходниках или дистрибутив с открытой лицензией? Первое — несколько проще, второе и третье могут по сложности поспорить с самой разработкой компилятора, если такой способ распространения не был задуман и заложен с систему изначально;
  2. Интересен компилятор сам по себе или речь идёт о возможности встраивания его в другой софт для расширения возможностей софта?
  3. Как я понимаю, основные существующие компиляторы Рефала придерживаются «классической» схемы: исходник — программа-компилятор — исполняемый модуль — программа-интерпретатор (я имею право ошибаться!). И всё в текстовом режиме командной строки. Кто нашёл время, тот настроил умный редактор для выполнения функций IDE и более комфортной работы. Это то, что требуется?
Вопрос об установке непосредственно с Github вызван, думаю, тем, что большинство современны программных продуктов используют множество внешних библиотек сторонних разработчиков, которые только так и можно собрать в актуальном комплекте. Для удовлетворения требования автономной работы должна быть возможность переноса собранного таким образом исполняемого кода на автономную (без сети) машину. Думаю, что в большинстве случаев это возможно, хотя и не обязано удовлетворяться автоматически для всех средств распространения пакетов.
 
Я, в свою очередь, тоже некоторое время назад озадачился созданием Рефал-среды «с нуля», используя достаточно свежие технологии и средства. Поэтому всякие там Github и UTF-8 поддерживаются естественным образом. А собственно сам мой компилятор пока принципиально уступает по производительности существующим «монстрам» (в позитивном смысле!) с 30-летней историей развития. Есть много принципиально новых идей относительно как Рефала, так и среды его исполнения, на реализацию которых, даже эскизную, не хватает пока что ресурса.
 
Если «пообщаться», то удалённо, так как я не в Москве. Возможно, это было бы интересно.
Воскресенье, 10 октября 2021, 15:32 +03:00 от Mike Potanin mpotanin_AT_gmail.com <re...@botik.ru>:
 
 
С уважением,
Александр Гусев
gusev_a...@mail.ru
 

Mike Potanin mpotanin_AT_gmail.com

unread,
Oct 11, 2021, 6:03:13 AM10/11/21
to re...@botik.ru
On Sun, Oct 10, 2021 at 5:56 PM Dr Mikhail Kovtun, Ph.D. mikhail.kovtun_AT_duke.edu <re...@botik.ru> wrote:
Добрый день!

Это очень впечатляет -- "мантейнер пакетов Nix и кофаундер хакспейса". Нет уж, я лучше пойду "в мокроступах по топталищу на позорище"...
Ладно, "участник процесса поддержки системы создания и распространения установочных образов программ Nix и
сооснователь клуба интересующихся не получившими широкое распространения технологиями и персональными проектами" ;-)

По делу: последнее время стало модным распространять программы через GitHub. Очень "удобно": программа установки сама, не спрашивая тебя ни слова, полезет на интернет, все найдет, и установит в лучшем виде... Только вот беда -- а как устанавливать такую программу на машине без соединения с интернетом? Мне приходится работать на такой машине (что поделать -- данные, связанные с людьми, очень секретные, и приходится принимать все меры безопасности...). Для установки программы на такой машине мне нужно загрузить архив (*.tar.gz желательно) на машине, подсоединенной к интернету, переслать его на машину без соединения, и там установить. Все работает хорошо, пока установка программы не лезет в интернет... Поэтому обращаюсь (к Рефал-компании) -- думайте и о людях, работающих на машинах без соединения с интернетом.

Естественно, Nix поддерживает и установку предкомпилированных бинарных образов, при этом аккуратно отслеживая зависимости. Про возможность установить без доступа к интернет только нужный пакет с минимальными зависимостями я спрошу.

Mike Potanin mpotanin_AT_gmail.com

unread,
Oct 11, 2021, 6:11:35 AM10/11/21
to re...@botik.ru
Спасибо!
Рефал-5λ можно ограничить (например, опцией командной строки), чтобы он поддерживал
только то, что понимает суперкомпилятор? Научить суперкомпилятор функциям высших порядков
будет не просто, а сделать еще пакет для суперкомпилятора было бы полезно.

Можно, конечно, и по Zoom или совместить offline и online, какое-то оборудование для видеоконференций там есть.

Mike Potanin mpotanin_AT_gmail.com

unread,
Oct 11, 2021, 6:31:01 AM10/11/21
to Александр Гусев, re...@botik.ru
On Mon, Oct 11, 2021 at 12:52 PM Александр Гусев <gusev_a...@mail.ru> wrote:
Добрый день!
 
У меня следующие вопросы
  1. Нужно вопрос поконкретнее, о чём речь: собранные исполняемые файлы, дистрибутив в исходниках или дистрибутив с открытой лицензией? Первое — несколько проще, второе и третье могут по сложности поспорить с самой разработкой компилятора, если такой способ распространения не был задуман и заложен с систему изначально;
 Nix (https://nixos.org/) старается делать воспроизводимые сборки, то есть их одних исходников с одними зависимостями должно получаться бинарно одно и тоже. Хотя он позволяет очень гибко кустомизировать сборку, для распространенных конфигураций обычно устанавливаются предкомпилированные пакеты (воспроизводимость сборки это позволяет). Nix умеет устанавливать и проприетарные пакеты, но лучше, чтобы исходники были легко доступны - доверие к таким пакетам выше.
  1. Интересен компилятор сам по себе или речь идёт о возможности встраивания его в другой софт для расширения возможностей софта?
Как минимум компилятор. Если есть еще что - можно сделать отдельные пакеты.
  1. Как я понимаю, основные существующие компиляторы Рефала придерживаются «классической» схемы: исходник — программа-компилятор — исполняемый модуль — программа-интерпретатор (я имею право ошибаться!). И всё в текстовом режиме командной строки. Кто нашёл время, тот настроил умный редактор для выполнения функций IDE и более комфортной работы. Это то, что требуется?
Для меня лично поддержка в IDE не актуально (я ими так и не научился пользоваться), но если будет какой-нибудь плугин к vscode, будет хорошо - многие интересные технологии не получают распространения из-за IDE.

Вопрос об установке непосредственно с Github вызван, думаю, тем, что большинство современны программных продуктов используют множество внешних библиотек сторонних разработчиков, которые только так и можно собрать в актуальном комплекте. Для удовлетворения требования автономной работы должна быть возможность переноса собранного таким образом исполняемого кода на автономную (без сети) машину. Думаю, что в большинстве случаев это возможно, хотя и не обязано удовлетворяться автоматически для всех средств распространения пакетов.

Управление зависимостями - сильная сторона Nix. Он умеет связывать инсталяцию ровно с теми библиотеками, с которыми она собрана.

 
Я, в свою очередь, тоже некоторое время назад озадачился созданием Рефал-среды «с нуля», используя достаточно свежие технологии и средства. Поэтому всякие там Github и UTF-8 поддерживаются естественным образом. А собственно сам мой компилятор пока принципиально уступает по производительности существующим «монстрам» (в позитивном смысле!) с 30-летней историей развития. Есть много принципиально новых идей относительно как Рефала, так и среды его исполнения, на реализацию которых, даже эскизную, не хватает пока что ресурса.

Nix в таких задачах помогает. Установка пакета доступна непривелигированному пользователю, что очень удобно, если хочется что-то "попробовать".

Dr Mikhail Kovtun, Ph.D. mikhail.kovtun_AT_duke.edu

unread,
Oct 11, 2021, 10:54:13 AM10/11/21
to re...@botik.ru
Да если "в дополнение" -- все прекрасно. Вот только есть люди, которые понимают это как "вместо". И вот тогда начинаются кошмары (у меня есть куча примеров)...

Best regards,
Mikhail Kovtun

Александр Коновалов a.v.konovalov87_AT_mail.ru

unread,
Oct 11, 2021, 12:39:49 PM10/11/21
to re...@botik.ru

Добрый вечер, Михаил!

В своём ответе также отвечу на несколько соседних писем.

 

По поводу установки онлайн и офлайн. Для разработки доступ в интернет требуется, т.к. сборочные скрипты 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, а на Win9command.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, только в них нужно заменить srefcrlc, srmakerlmake.)

 

«Научить суперкомпилятор функциям высших порядков будет не просто…»

Я об этом как-то делал доклад в ИПМ имени Келдыша РАН. Там возникают всякие сложности со ссылочной эквивалентностью замыканий, когда вложенные функции начинают специализироваться. Да, там всё непросто, если стремиться к действительно эквивалентным преобразованиям. Однако, если забить на нарушение инвариантов, которые в Рефале должны быть незыблемыми, то всё становится проще.

 

«а сделать ещё пакет для суперкомпилятора было бы полезно»

На эту тему лучше напрямую списаться с Андреем Петровичем Немытых: nemy...@math.botik.ru.

 

«Можно, конечно, и по Zoom или совместить offline и online, какое-то оборудование для видеоконференций там есть.»

Могу приехать и выступить. Так даже интереснее.

Andrei Klimov andrei_AT_klimov.net

unread,
Oct 11, 2021, 3:16:30 PM10/11/21
to re...@botik.ru
On Mon, Oct 11, 2021 at 1:11 PM Mike Potanin mpotanin_AT_gmail.com <re...@botik.ru> wrote:
Научить суперкомпилятор функциям высших порядков 
будет не просто, а сделать еще пакет для суперкомпилятора было бы полезно.

Суперкомпилировать язык с функциями высшего порядка – в первом приближении нет проблем: можно это делать «в лоб», держа в голове какие-нибудь представление замыканий на языке первого порядка, либо даже скомпилировать высший порядок в первый и применить старый суперкомпилятор. На хлеб мазаться...[зачеркнуто] Суперкомпилировать будет.

Однако, используя такой суперкомпилятор, заметите одну проблему: обобщение по наивному краскаллическому свистку будет часто казаться преждевременным. Возникнет соблазн сделать его более «тонким», пореже сваливая в одну кучу слишком разные конфигурации с замыканиями. Попытавшись сделать свисток более «тонким», будем сваливаться в незавершаемость.

И тут вам в помощью диссертация и соответствующая серия статей Ильи Ключникова под рук. Сергея Романенко. См. публикации на странице Ильи:
Илья получил удивительный результат: 
  • Предложил свисток на достаточно естественном «более тонком» гомеоморфном вложении, которое по классической теории не является well-quasi-order, то есть согласно ей такой свисток не является завершающим. 
  • Обнаружил и доказал, что в множестве конфигураций, возникающих в процессе прогонки в суперкомпиляторе, этот свисток является завершающим.
Мне в этом результате нравится, что он получен там, где предшественники не задумываясь считали, что ничего не получится. В истории науки такие примеры – самые красивые и интригующие.

Всего наилучшего,
Андрей Климов

Александр Коновалов a.v.konovalov87_AT_mail.ru

unread,
Oct 19, 2021, 1:42:43 PM10/19/21
to re...@botik.ru

Добрый вечер всем!

Коллега Михаила Потанина уже начал готовить сборку пакета для пакетного менеджера 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: Актуальные реализации и текущее состояние.

 

 

 

On Mon, Oct 11, 2021 at 12:52 PM Александр Гусев <gusev_a...@mail.ru> wrote:

Reply all
Reply to author
Forward
0 new messages