Теория языков программирования
Domain-Specific Languages
SQL написан в 1970-х и остаётся главным языком для работы с данными. CSS специфицирует дизайн без программирования. GraphQL изменил как фронтенд получает данные. DSL - не экзотика, это языки в ежедневном использовании разработчика.
- **Terraform HCL**: декларативный DSL для инфраструктуры. HashiCorp создала язык которым управляют AWS, GCP, Azure ресурсами. 10M+ пользователей
- **Kubernetes YAML/Jsonnet**: декларативные DSL для оркестрации контейнеров. Jsonnet - DSL для генерации JSON/YAML конфигураций
- **dbt (data build tool)**: SQL DSL для трансформаций в data warehouse. Добавляет модульность, тестирование, документацию к SQL
Internal DSL
Internal DSL - DSL реализованный средствами host-языка. Выглядит как специализированный код, но это обычные функции/методы. Преимущества: IDE поддержка, интеграция с инфраструктурой, нет отдельного компилятора. Gradle, RSpec, Ktor routing - примеры.
Главное преимущество internal DSL перед external?
External DSL
External DSL - отдельный язык с собственным парсером. SQL, CSS, регулярные выражения, YAML, Protocol Buffers - примеры. Преимущества: может иметь любой синтаксис, может использоваться не-программистами, легче версионировать.
Почему SQL остаётся наиболее используемым external DSL, хотя существует 60+ лет?
Embedded DSL
Embedded DSL - external DSL встроенный в host язык через специальный синтаксис или библиотеку. Template Haskell quasiquotes, inline SQL в Rust через sqlx!, regex литералы. Лучшее из обоих миров: удобство external + интеграция internal.
Что делает sqlx! макрос принципиально отличным от обычных строковых SQL запросов?
Language Workbenches
Language workbench - инструмент для создания DSL с IDE поддержкой из коробки. JetBrains MPS позволяет создавать language extensions с projectional editor. Xtext генерирует Eclipse plugin из EBNF грамматики.
DSL - это лишняя сложность. Лучше использовать general-purpose язык
DSL значительно снижает когнитивную нагрузку для специфической задачи. SQL читается лучше эквивалентного Python для реляционных запросов
Domain experts могут читать и писать DSL без знания general-purpose языка. SQL-разработчики не знают Python. Бизнес-аналитики пишут SQL, не Java. DSL снижает барьер входа для домена
Что такое projectional editing в JetBrains MPS?
Итоги
- **Internal DSL**: host-язык + API дизайн = DSL-like синтаксис. Gradle KTS, Ktor, RSpec. IDE поддержка бесплатно
- **External DSL**: отдельный парсер, свой синтаксис. SQL, GraphQL, CSS. Для domain experts, не только программистов
- **Embedded DSL**: external встроен в host через макросы/quasi-quoting. sqlx! SQL в Rust с compile-time проверкой
- **Language workbenches**: JetBrains MPS (projectional), Xtext (grammar -> IDE). Создание DSL с IDE поддержкой
Связанные темы
DSL применяют дизайн языков практически:
- Дизайн синтаксиса — DSL дизайн применяет принципы синтаксического дизайна для конкретного домена
- DSL компиляторы — Компиляция DSL в другой язык или машинный код
Вопросы для размышления
- Terraform декларативный DSL для инфраструктуры. Почему декларативность (что, а не как) особенно важна для infrastructure-as-code?
- SQL прожил 50+ лет без принципиальных изменений. Что в его дизайне настолько правильно, что пережило несколько поколений технологий?
- JetBrains MPS - projectional editor без текстового файла. Как это меняет git workflow, code review, merge conflicts?