Александр,
Вы правы в том, что для собственно анализа и компиляции метакод-А удобнее.
Я даже предпочел бы (обычно так и делал) переменные изображать термами (E
A), (S X), а обычный терм в скобках - (B ...). Занятно, что студентам он
тоже понятнее. Сам я свои первые программы в таком виде и писал: c _E, _S,
_W, _K и _. И мне это очень нравилось. На метакод-В переходил с трудом и
неудовольствием.

Зачем ограничение "e в конце"? Думаю, это все же может сократить и
программы обработки (для образцов - вдвое), вдвое уменьшит число операторов
отождествления. А для прогонки это будет еще заметнее - не надо будет
выбирать с какого боку продвигаться.

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

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



8 августа 2018 г., 16:05 пользователь Yandex Mail <[email protected]>
написал:

> Андрей!
>
> По поводу минималистичности 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]> написал:
>
> Добрый вечер, Дмитрий!
>
>
> *«Есть такая ± известная штука как METAII и очень удобная реализация в
> онлайн:http://www.bayfronttechnologies.com/mc_workshop.html
> <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/
> <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* <[email protected]>
> Date: сб, 28 июля 2018, 6:48
> Subject: Реализация REFAL/js в online варианте (Google Cloud/VDS/standalone
> javascript)
> To: <[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
>
>
>
>
>



-- 
_______________
*С уважением, *
*Аркадий Климов,*
*с.н.с. ИППМ РАН,*
*+7(499)135-32-95*
*+7(916)072-81-48*

Ответить