PLComp
Языки и компиляторы: вопросы реализации от входного синтаксиса до порождения машинного кода. Авторы: @vekazanov @igorjirkov @true_grue @clayrat @eupp7 @alexanius @AntonTrunov @GabrielFallen @graetestofnoldor
إظهار المزيد- المشتركون
- التغطية البريدية
- ER - نسبة المشاركة
جاري تحميل البيانات...
جاري تحميل البيانات...
— Этот доклад является первой частью цикла докладов, посвященных обзору советских достижений из области компиляции, метавычислений и синтеза программ. Речь идет о тех теоретических результатах, которые, по мнению докладчика, и сегодня не утратили своей актуальности. Рассматривается самый, пожалуй, плодотворный период с 50-х по 70-е годы. Изложение иллюстрируется рядом практических примеров. Первая часть называется "Программирующие программы (50-е годы)" .
Запись лекции «Перспективные технологии создания компиляторов для спецпроцессоров» Петра Советова, известного российского специалиста по DSL-компиляторам. Л...
(define-peg arith-expr (=> (seq (: e1 term) (* (seq (: op* (alt "+" "-")) (: e* term)))) (left-associate-binops e1 op* e*)))идентификаторы
op*
и e*
связываются со списками операторов и термов соответственно (так как находятся "под звёздочкой"), в то время как e1
связывается с одним термом.
По сравнению со стандартным связыванием имён в функциях или let
-выражениях такие связывания работают "шиворот навыворот", а потому требуют реализации "руками". В данном примере такая реализация написана авторами PEG DSL на макросах хост-языка, но если мы хотим чтобы пользователи DSL могли запрограммировать binding constructs по собственному вкусу, нам придётся предоставить им развитую макро-систему поверх нашего DSL.
Вторая причина связана с тем, что авторы называют "hosted DSL". Мне кажется, иначе это можно было бы назвать "deeply embedded DSL". Суть в том, что DSL, который мы реализуем на макросах, является не просто синтаксическим сахаром, а требует полноценного конвейера компиляции, начиная (потенциально) с парсера вводимого нами синтаксиса, продолжая специфическим разрешением имён, нетривиальными binding context и scoping rules, возможно, проверкой типов или другим статическим анализом корректности программ, и заканчивая полноценным IR и оптимизациями. Для того чтобы дать пользователям писать макросы для такого DSL с помощью макро-системы хост-языка, нам придётся открыть доступ к внутренностям нашего компилятора чтобы пользователи могли порождать AST или даже IR нашего DSL, и "скармливать" его далее компилятору. В противном случае макросы смогут порождать только разрозненные куски (скомпилированного) DSL, связанные между собой вызовами анонимных (или не очень) функций хост-языка, которые компилятор нашего DSL проанализировать и оптимизировать уже не сможет.
Так вот, чтобы получить преимущества и того, и другого, нам придётся предоставить отдельную макро-систему поверх нашего hosted DSL. А поскольку реализовать хорошую макросистему (гигиеничную, с разделением фаз и интегрирующуюся с системой модулей хост-языка) очень непросто, было бы полезно переиспользовать возможности macro-expander хост-языка. Статья предлагает API, позволяющий это сделать.
#scheme #racket #macros #dsl