Андрей!

По поводу минималистичности META II. Это самоприменимый компилятор языка, 
который даже не полон по Тьюрингу!

Да, композиции в META II нет — он за один проход сразу порождает ассемблерный 
листинг.

А в чём смысл такого ограничения на e-переменные? По-моему, оно большого 
упрощения не даёт, а только затрудняет программирование. В частности, сквозной 
проход по скобочному выражению («мультискобки») уже так красиво не напишется. 
Для минималистичной реализации я бы предложил вернуться к допотопному 
синтаксису:

§ 1.1 K 'Fab' EX A EY = EX B K 'Fab' EY •
§ 1.2 K 'Fab' EX = EX

Вернее, к его идеям. Программа — не набор функций, а набор предложений. Каждое 
предложение имеет вид

<левая-часть> = правая-часть;

Например,

<Fab e.X 'A' e.Y> = e.X 'B' <Fab e.Y>;
<Fab e.X> = e.X;

По своему опыту я заметил, что студентам такой синтаксис был бы понятнее, 
нежели синтаксис Рефала-5

Fab {
  e.X 'A' e.Y = e.X 'B' <Fab e.Y>;
  e.X = e.X;
}

А второе упрощение, вытекающее из этого синтаксиса — можно вообще отказаться от 
функций. Для активной пары угловых скобок последовательно перебираются левые 
части всех предложений. То, что после < обязательно должно быть имя функции — 
лишь соглашение, но не требование. Можно писать вот так:

<e.X 'A' e.Y baF> = e.X 'B' <e.Y baF>
<e.X baF> = e.X

но это конечно надуманный пример. Можно определить арифметические операции в 
формате <s.X '+' s.Y>, что уже более реалистично.

У Турчина изначально в Рефале ведь так и предполагалось (см. первую книгу 
<https://pat.keldysh.ru/~roman/doc/Turchin/1971-Turchin--Programmirovanie_na_yazyke_refal_1_Neformal'noe_vvedenie_v_programmirovanie_na_yazyke_refal.pdf>
  пятитомья). Но из соображений производительности он сразу вводил 
«детерминанты» — символы справа от левой скобки конкретизации, набор 
предложений с одним символом образовывал функцию с данным именем.

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

Сам хотел летом написать интерпретатор Рефала, работающий в браузере, но руки 
так и не дошли.

 

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

 

From: Arkady Klimov <[email protected]> 
Sent: Wednesday, August 8, 2018 3:06 PM
To: [email protected]
Subject: Re: Реализация REFAL/js в online варианте (Google Cloud/VDS/standalone 
javascript)

 

Чем этот METAII замечателен? По-видимому тем, что он минималистичен. Автор 
попытался вложить минимум, достаточный для осуществления компиляции как его 
самого, так и классических языков типа Алгол.

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

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

Здесь тип входных данных - только строка, а ее структура в соответствие с 
синтаксисом определяется на лету. В рефале эту функциональность придется 
программировать. Но для работы с промежуточными структурами это уже не нужно.

 

Я согласен с Дмитрием, что подобная экспозиция рефала была бы интересной. Но не 
"при помощи METAII", а при помощи самого рефала. В частности, в ней юзер мог бы 
использовать разные диалекты языка, и даже определять свой. Может, для начала 
есть смысл упростить рефал, отказавшить от е-переменных в образцах, кроме 
стоящих в концах подвыражений (то есть допускать только в конце образца или 
перед закрывающей скобкой) и выкинуть т-переменные. Это даже более чем 
ограниченный. А потом потихоньку расширять.

И будет наверно правильно для рефала в левом окне (исходная строка) помещать не 
просто строку, а рабочее выражение (без переменных, но с вызовами функций). 
Только придется, наверно, ввести кнопочку "метакодовое преобразование"

И полезно иметь еще отладочное окно, где показывать трассу вычислений с разной 
степенью детальности.

Такая штука могла бы наверно помочь "нести рефал в массы".

 

С уважением,

Аркадий Климов

 

30 июля 2018 г., 22:57 пользователь Alexander Konovalov aka Маздайщик 
<[email protected] <mailto:[email protected]> > написал:

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

«Есть такая ± известная штука как 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

 

 

Ответить