Добрый вечер, Дмитрий! «Есть такая ± известная штука как 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
