Открыть сервис

Предметно-ориентированные языки программирования

Предметно-ориентированный язык программирования (англ. domain-specific language, DSL) — это язык программирования или формальная нотация, специализированная для решения задач в конкретной предметной области. В отличие от языков общего назначения (C, Java, Python), которые применимы для широкого круга задач, DSL ориентирован на узкий класс проблем и часто жертвует универсальностью ради выразительности, лаконичности и близости к понятиям самой предметной области.

Ключевые характеристики

Основное свойство DSL — ограниченная выразительность в сочетании с высокой специализацией. Такой язык использует словарь и конструкции, привычные специалистам конкретной сферы: например, правила фильтрации пакетов, нотацию описания музыкальных партитур или синтаксис разметки документов. Программы на DSL обычно короче и понятнее аналогов на языке общего назначения, но за пределами своей области неприменимы.

Классификация

DSL делят по нескольким основаниям.

По способу реализации

  • Внешние (external) — самостоятельные языки со своим синтаксисом и парсером. Примеры: SQL, HTML, CSS, регулярные выражения, язык описания аппаратуры Verilog.
  • Внутренние (internal, встроенные) — реализуются средствами языка-хозяина, используя его синтаксис. Примеры: библиотеки для построения запросов, фреймворки на Ruby, Scala, Kotlin.

По назначению

ТипНазначениеПримеры
Языки запросовИзвлечение данныхSQL, XPath, SPARQL
Языки разметкиОписание структуры документовHTML, XML, Markdown
Языки конфигурацииНастройка системYAML, JSON, TOML
Языки моделированияОписание моделейUML, MATLAB
Языки описания данныхСхемы и форматыProtocol Buffers, JSON Schema

История

Понятие DSL сформировалось в 1990-х годах, хотя специализированные нотации существовали раньше — например, языки управления станками и языки имитационного моделирования (GPSS, 1961). Термин популяризировали исследователи в области генеративного программирования и языковых инструментов. Развитие компиляторов и метапрограммирования сделало создание собственных DSL доступным для прикладных разработчиков.

Преимущества и недостатки

К достоинствам относят выразительность, снижение числа ошибок за счёт ограничения допустимых конструкций, улучшение коммуникации между программистами и экспертами предметной области, а также возможность автоматической генерации кода и документации.

Среди недостатков — стоимость проектирования и поддержки, риск «разрастания» языка, сложность интеграции с другими инструментами, а также необходимость обучения пользователей. Иногда DSL оказывается неоправданным, если задача решается стандартными средствами.

Применение

DSL широко используются в веб-разработке (HTML, CSS, шаблонизаторы), базах данных (SQL), системном администрировании (конфигурации, регулярные выражения), научных вычислениях, телекоммуникациях и встраиваемых системах. Внутренние DSL популярны в функциональном программировании, где средства языка позволяют строить предметные библиотеки с естественным синтаксисом.

Создание DSL

Разработка внешнего DSL включает проектирование грамматики, реализацию лексического и синтаксического анализа (часто с помощью генераторов парсеров, например ANTLR), построение семантической модели и генерацию целевого кода или интерпретацию. Внутренние DSL строятся на механизмах языка-хозяина: перегрузке операторов, макросах, неявных преобразованиях, предметных типах.

Связь с языками общего назначения

Граница между DSL и языками общего назначения условна. Некоторые языки развиваются от специализированных к универсальным (например, JavaScript изначально создавался для браузерных сценариев). Обратный процесс — выделение предметных подмножеств из больших языков — также встречается. В инженерии ПО DSL рассматривают как инструмент повышения уровня абстракции и автоматизации рутинных операций.

IRONLIVE — база данных и аналитика по компаниям России.

На главную IRONLIVE →