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

«Есть такая ± известная штука как METAII и очень удобная реализация в онлайн:
http://www.bayfronttechnologies.com/mc_workshop.html»

Посмотрел я сегодня эту META II. Любопытно. Спасибо.

Для тех, кому лень разбираться, кратко напишу, о чём это. Это одна из 
простейших реализаций синтаксически управляемой трансляции. Того, что 
реализуется в Bison, ANTLR, PEG и прочих подобных инструментах. Т.е. когда в 
описываемую грамматику добавляются семантические действия, выполняемые по ходу 
разбора.

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

Самоприменимый метакомпилятор (как его называет автор) транслирует грамматику с 
семантическими действиями в «ассемблер предметной области», выразительных 
средств которого достаточно для записи рекурсивного спуска. Что, кстати, 
интересно — какой набор элементарных команд достаточен для рекурсивного спуска. 
Автору хватило 17 операторов (причём в самоприменимом метакомпиляторе 
используется только 15) и 2 псевдооператора.

Автор в работе берёт самоприменимый метакомпилятор из работы 1964 года и 
начинает процесс раскрутки.

Сначала он переформатирует исходный текст к более читабельному виду.

Затем заменяет оператор «.,» (точку и запятую) на «;» (точку с запятой).

Потом делает «семантическое» изменение — незначительно модифицирует язык 
сборки. Вместо вывода меток (строк без отступа) и остальных строк (с 
обязательной табуляцией в начале) вводятся более тонкие операции печати — явная 
печать табуляции, перевода строки и дефолтового отступа, который можно 
инкрементировать и декрементировать. Исходный метакомпилятор предназначался для 
печати ассемблерных листингов, раскручиваемый будет использоваться для 
формирования листингов языков высокого уровня, которые красиво форматировать с 
отступами.

После этого автор делает первую попытку трансляции в JavaScript — вот тут уже 
пригождаются отступы.       Но эта трансляция больше напоминает псевдокод — 
есть подразумеваемые процедуры рантайма, которые, однако, не реализованы.

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

Лексика позволяет более тонко работать со входным языком, автор в язык 
добавляет комментарии.

На предпоследнем шаге реализуется окончательная трансляция в рабочий 
JavaScript, с полной реализацией рантайма, всё как положено.

Последним шагом в язык добавляется семантика отката — уже больше не 
накладывается на входной язык жёсткого ограничения LL(1).

Потом автор показывает, как встроить получившийся язык в web-страницу и на 
улучшенном метакомпиляторе реализует входной язык метакомпилятора одной из 
первых стадий.

 

Но вот что так и не понял, что же такое метакомпилятор и чем эта META II 
принципиально отличается от других синтаксически управляемых DSL’ей (Bison и 
другие).

 

«Не реализовывал ли кто-то что-то подобное для Рефал и JavaScript (или JS 
assembly)?»

Ну, автор для JavaScript подобное и реализовал вообще-то. Или имелось ввиду 
что-то другое?

Для Рефала? А что имеется ввиду для Рефала? Описать транслятор с Рефала в RASL 
(ассемблер Рефала) при помощи META II? Боюсь, что очень сложно будет описать 
трансляцию рефал-образцов синтаксически-управляемым образом. Реализовать META 
II на Рефале? Для этого достаточно написать реализацию 17 операторов ассемблера 
META II. Это несложно, особенно на Рефале-2 (на Рефале-5 и других придётся 
делать явные циклы там, где Рефал-2 обходится спецификаторами).

Или опять, Вы имеете ввиду что-то другое?

 

«Было бы здорово иметь похожую реализацию-учебник по Рефалу.»

Некоторым учебником по написанию транслятора Рефала может служить диссертация 
Романенко:

https://pat.keldysh.ru/~roman/doc/1978-Romanenko--Mashinno-nezavisimyj_kompilyator_s_yazyka_rekursivnyx_funkcij--PhD_thesis.pdf
 (скан, медленно грузится)
https://pat.keldysh.ru/~roman/doc/1978-Romanenko--Mashinno-nezavisimyj_kompilyator_s_yazyka_rekursivnyx_funkcij--PhD_thesis--LaTeX.pdf
 (переписано в LaTeX, быстро грузится)

А что нужно? Учебник «Как написать компилятор Рефала на Рефале с нуля»? Может 
быть, когда-нибудь напишу, если набежит такое вдохновение.

 

«Попробовал набросать что-то подобное по трехоконной схеме на базе PEG.js»
«PEG-транслятор в крайне зачаточном варианте: 
http://leafy-oxide-211212.appspot.com/ »

А получилась демонстрашка для PEG.js. Вроде этой: https://pegjs.org/online

Близко к META II, но что-то не то.

 

«PSS: после того как пощупал METAII в этом туториале, наконец, понял, в каком 
именно виде задумывался РЕФАЛ — метаязык для создания source-to-source 
трансляторов»

Не только компиляторов, но и интерпретаторов. А также инструментов для 
символьных преобразований (алгебраические выкладки, преобразования программ и 
т.д.). Я затрудняюсь сходу назвать философские основы Рефала. О них можно 
прочитать в первых работах Турчина:

https://pat.keldysh.ru/~roman/doc/Turchin/1968-Turchin--Metaalgoritmicheskij_yazyk--ru.pdf
 (эту статью читать сложнее)
https://pat.keldysh.ru/~roman/doc/Turchin/1971-Turchin--Programmirovanie_na_yazyke_refal_1_Neformal'noe_vvedenie_v_programmirovanie_na_yazyke_refal.pdf
 (эту статью читать проще)

Либо спросить у учеников Турчина, которые есть в этой рассылке.

 

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

 

 

From: Dmitry Ponyatov < <mailto:[email protected]> [email protected]>
Date: сб, 28 июля 2018, 6:48
Subject: Реализация REFAL/js в online варианте (Google Cloud/VDS/standalone 
javascript)
To: < <mailto:[email protected]> [email protected]>

 

Добрый день

 

Есть такая +/- известная штука как METAII и очень удобная реализация в онлайн:

http://www.bayfronttechnologies.com/mc_workshop.html

 

Не реализовывал ли кто-то что-то подобное для Рефал и JavaScript (или JS 
assembly)?

Было бы здорово иметь похожую реализацию-учебник по Рефалу.

 

Попробовал набросать что-то подобное по трехоконной схеме на базе PEG.js, 

получается интересная игрушка для экспериментов в т.ч. на мобильном телефоне в 
дороге:

- на PEG описывается синтаксис и семантика через вызовы произвольного JS-кода,

- команды пользователя могут быть в совершенно произвольном настраиваемом 
синтаксисе

- HTML дает неплохие возможности визуализации и интерфейса

- и без проблем работает на любом мобильнике без каких-либо доп.приложений

- платформенно-независимо, а

- с применением backend-сервера возможна коллективная работа 

 

PS: браузер с поддержкой компиляции из JS Assembly даст очень хорошую скорость

PSS: после того как пощщупал METAII в этом туториале, наконец понял в каком 
именно виде задумывался 

РЕФАЛ -- метаязык для создания source-to-source трансляторов

 

------------------------------
С уважением, Понятов Дмитрий, Icbcom, инженер IoT/embedded, тел. +7 917 10 10 
818
With best regards, Dmitry Ponyatov, Icbcom, IoT/embedded engineer, tel. +7 917 
10 10 818

Ответить