(Письмо немного автобиографичное и длинное. Сижу тут с температурой 38,2°, 
поэтому в письме ниже бред моего больного мозга. Но Дмитрию прочитать надо.)

Добрый вечер, Дмитрий!

Учебника по пошаговой реализации виртуальной машины Рефала (а её бессмысленно 
делать без синтаксического анализатора) нет, потому что его некому писать. 
Сообщество вокруг Рефала в действительности сейчас очень маленькое, и людей, у 
которых одновременно есть «свободное время, желание и способность доходчиво 
писать» сейчас нет. Потому что как минимум ни у кого нет свободного времени 
этим заниматься. Все мы занимаемся другими проектами, зачастую даже не 
связанными с Рефалом, потому что хотим кушать.

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

Первое время источником знаний для меня был сайт http <http://refal.ru> 
://refal.ru, где я прочёл учебник Турчина по Рефалу-5 
<http://refal.botik.ru/book/html/>  (устаревший русский перевод 
<http://refal.ru/rf5_frm.htm> ) и учебник Аркадия Климова 
<http://refal.ru/~arklimov/refal6/manual.htm>  по Рефалу-6 
<http://refal.ru/~arklimov/refal6/index.html> . Уже тогда я начал писать свой 
Модульный Рефал (сейчас он застыл на ранней стадии). Также осилил руководство 
по «архаичному» Рефалу-2 
<http://refal.ru/~belous/download/refal2/refal2-doc.zip> , в котором, однако, 
был описан интерфейс между Рефалом-2 и Си. Т.е. элементы деталей реализации: 
внутренние структуры данных и принцип работы виртуальной машины. Мне этого 
оказалось достаточно для написания собственного компилятора Рефала (это был 
Простой Рефал) в язык C++.

Компилятор Простого Рефала в ранней стадии его существования сравнительно 
неплохо документирован. Вот документация первым по четырём этапам его развития:

https://github.com/bmstu-iu9/simple-refal/blob/master/doc/historical/note000.txt
https://github.com/bmstu-iu9/simple-refal/blob/master/doc/historical/note001.txt
https://github.com/bmstu-iu9/simple-refal/blob/master/doc/historical/note002.txt
https://github.com/bmstu-iu9/simple-refal/blob/master/doc/historical/note003.txt

Но предупреждаю, писал я эту писанину для себя, это фактически сырой дамп моего 
мозга. Поэтому многое будет непонятно (надо сначала прочитать учебники по 
Рефалу-5, Рефалу-6 и Рефалу-2). Для начального ознакомления читать не 
рекомендую.

Рекомендую читать другой материал. Когда-то на кафедре, где я сейчас преподаю, 
я прочитал лекцию про устройство Простого Рефала. Лекция отражает состояние 
Простого Рефала на 2009 год:

https://github.com/bmstu-iu9/simple-refal/blob/master/doc/historical/Компилятор%20Простого%20Рефала.pdf

В ней как раз описана кодогенерация и детали внутреннего представления.

Уже позже, во всемирной паутине несколько лет назад появились коллекции сканов 
старых статей про Рефал и суперкомпиляцию:

На странице Сергея Романенко:
 <https://pat.keldysh.ru/~roman/doc/index.md> 
https://pat.keldysh.ru/~roman/doc/index.md
https <https://pat.keldysh.ru/~roman/doc/Turchin/index.md> 
://pat.keldysh.ru/~roman/doc/Turchin/index.md

На странице Института Рефала:
http://refal.botik.ru/library/library.htm

Много ссылок со второй страницы повторяют ссылки с первой. Но не все, есть и 
уникальные ссылки.

Если хотите увидеть Простой Рефал в том состоянии, которое описано в 
документации, выполните следующие команды в консоли:

git clone https://github.com/bmstu-iu9/simple-refal
cd simple-refal
git checkout 004

Объём исходников сравнительно небольшой, уже тогда я умел довольно читабельно 
программировать.

 

Есть старый учебник по Рефалу (по древнему Рефалу) с подробной документацией 
как самого языка, так и принципов его реализации: структуры данных, команды 
виртуальной машины (в псевдокоде), интерфейс с языком Фортран на разных ЭВМ:

https://pat.keldysh.ru/~roman/doc/1977___Bazisnyj_Refal_i_ego_realizaciya_na_vychislitel'nyx_mashinax__CNIPIASS.pdf

Написано там вполне доходчиво, даже не смотря на время написания (детали, 
касающиеся древних ЭВМ можно опустить). По этому учебнику Василий Стеллецкий 
когда-то давно даже написал свою реализацию Рефала/2 (на Си). У реализации 
исходники открытые, но читать их немного сложнее, чем мои. Субъективно сложнее. 
Для полноты картины ссылка на страничку Стеллецкого:

http://www.cnshb.ru/vniitei/sw/refal/

 

Первый раз я попал на сайт http <http://refal.ru> ://refal.ru по ссылке на 
книгу Турчина «Феномен науки» <http://refal.ru/turchin/phenomenon/> . Книга 
понравилась (рекомендую, кстати). Перейдя на главную страницу, увидел, что она 
про какой-то язык программирования Рефал. Открыл учебник Турчина и… ничего не 
понял. Странный непонятный синтаксис и вообще ничего непонятно. Я тогда 
признавал один язык — C++. Сайт refal.ru закрыл и продолжил углублённо изучать 
C++, благо там достаточно мозгоразрывающих вещей. И низкоуровневое 
программирование как в Си, и перегрузка операций, и ООП, и шаблоны. Тогда я 
читал книгу Андрея Александреску «Современное проектирование на C++», в которой 
как раз демонстрировалось, как можно на шаблонах вычислять во время компиляции. 
Например, построить список классов и отсортировать его топологически от 
производных классов к базовым. Метапрограммирование шаблонов фактически 
является функциональным языком, основанным на pattern matching’е, я его освоил 
и так проникся функциональным программированием. После этого случайно ещё раз 
зашёл на refal.ru и на этот раз не только понял, но и проникся Рефалом. До сих 
пор не отпустило.

 

Какая мораль? Если есть интерес к Рефалу, то во всём можно разобраться 
самостоятельно. Ни в какую секту вступать не нужно. Нужно некоторое количество 
соображалки и интереса к предмету. Или соображалки и упорства, если интереса 
нет.

 

Если Вы интересуетесь метапрограммированием на Рефале и хотите понять, как 
метапрограммирование и Рефал связаны, рекомендую почитать «пятикнижие» — пять 
книжек размером с методичку, где Турчин описывал своё ви́дение языка:

http://pat.keldysh.ru/~roman/doc/Turchin/1971-Turchin--Programmirovanie_na_yazyke_refal_1_Neformal%27noe_vvedenie_v_programmirovanie_na_yazyke_refal.pdf
http://pat.keldysh.ru/~roman/doc/Turchin/1971-Turchin--Programmirovanie_na_yazyke_refal_2_Formal%27noe_opisanie_i_principy_realizacii_refala.pdf
http://pat.keldysh.ru/~roman/doc/Turchin/1971-Turchin--Programmirovanie_na_yazyke_refal_3_Programmirovanie_na_bazisnom_refale.pdf
http://pat.keldysh.ru/~roman/doc/Turchin/1971-Turchin--Programmirovanie_na_yazyke_refal_4_Ispol%27zovanie_rekursivnyx_peremennyx_v_yazyke_refal.pdf
http://pat.keldysh.ru/~roman/doc/Turchin/1971-Turchin--Programmirovanie_na_yazyke_refal_5_Ispol%27zovanie_metafunkcij_v_yazyke_refal.pdf

Там есть и философия языка, и древний синтаксис Рефала, и приёмы 
программирования, и предполагаемые возможности изменения программы на лету, и 
простейшие функции высшего порядка.

 

По Вашей ссылке http://leafy-oxide-211212.appspot.com/FORTH.html почти тоже 
самое, что и по https://pegjs.org/online. Я догадываюсь, что цель была не 
повторить pegjs.org/online, а что-то другое.

Цель была — онлайн-инструмент для разработки интерпретаторов или компиляторов? 
Тогда нужно иметь интерфейс для закачивания пользовательских библиотек, либо в 
виде js-файлов, либо путём указания её URL’а. Но если мы закроем браузер, всё 
пропадёт. Нужно или хранить состояние на сервере (в облаке), или в локальном 
хранилище браузера. Также полезно иметь функцию экспорта наработок в файл — 
кнопку «сохранить».

Цель — интерпретатор Форта, доступный для модификации? Тогда надо эмбрион 
Форта, лежащий там по умолчанию, доработать до приемлемого состояния, чтобы 
можно было на нём писать какие-нибудь алгоритмы (хотя бы наименьший общий 
делитель и факториал). Вот, кстати, наши студенты-первокурсники что сделали год 
назад:

https://github.com/bmstu-iu9/utp2017-3-forth (небольшая справка в README.md)
https://bmstu-iu9.github.io/utp2017-3-forth/TESTS (примеры программ)
https://bmstu-iu9.github.io/utp2017-3-forth/index.html (сам интерпретатор)
https://bmstu-iu9.github.io/scheme-labs/lab4.html (источник вдохновения для 
задачи)



К сожалению, полноты по Тьюрингу там нету, поскольку нет команд PICK и ROLL 
(см. например здесь <http://www.codenet.ru/progr/other/forth/> ). Но такой 
задачи не ставилось — нужно было самостоятельно научиться программировать на 
JavaScript (после небольшой лекции) и научиться работать в команде.

Т.е. если Вы демонстрируете интерпретатор Форта, доступный для расширения, то 
сам код по умолчанию надо развить.

 

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

 

From: Dmitry Ponyatov [mailto:[email protected]] 
Sent: Wednesday, August 8, 2018 7:47 PM
To: [email protected]
Subject: Re: Реализация REFAL/js в online варианте (Google Cloud/VDS/standalone 
javascript)

 

Добрый день

Мне давно кажется, что было бы очень полезным реализовать Рефал или,
скажем, какой-то идейный костяк Рефала, в виде программной библиотеки
и без навязывания конкретного синтаксиса. 

 

Пожалуй более эффективным вариантом был бы учебник по пошаговой реализации 
виртуальной машины Рефала, на каком-то mainstream языке.  

 

К сожалению сколько не открывал мануалов по языку, везде ощущение "еще один 
brain@k", видимо в сообществе нет людей, у которых найдется время, желание и 
способность доходчиво писать, и Рефал так и останется сакральной вещью в себе 
для секты посвященных.

 

JS великолепный кандидат по распространенности и интеграции в существующую 
инфраструктуру - мне на андроид-телефоне не нужно делать никаких лишних 
кульбитов, достаточно открыть веб-страницу, и по желанию в меню ткнуть 
"добавить на главный экран".

 

Чисто для иллюстрации набросал вариант исполнения чего-то мета-подобного, 
завернутого на исполнение кусков JS через библиотеку PEG.js. Она отличается 
способностью строить парсер в рантайме на стороне клиента. 

 

Добавляя форму редактора 

грамматики на страницу, получаем возможность использовать произвольный 
синтаксис и дергать из парсера почти любой javascript код. Ваш вариант с 
рефал-машиной в виде библиотеки как раз идеально вписывается.

 

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

 

leafy-oxide-211212.appspot.com/FORTH.html 
<http://leafy-oxide-211212.appspot.com/FORTH.html> 

 

Ответить