Александр, Вы правы в том, что для собственно анализа и компиляции метакод-А удобнее. Я даже предпочел бы (обычно так и делал) переменные изображать термами (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*
