Теория языков программирования

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?

Связанные уроки

  • fl-03-grammars
Domain-Specific Languages

0

1

Войти