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

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

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

Чем предметно-ориентированные языки отличаются от «настоящих» языков программирования?

Предметно-ориентированные языки обычно не такие сложные, как языки общего назначения, например Java, C или Ruby. Как правило, предметно-ориентированные языки разрабатываются в сотрудничестве со специалистами в той сфере деятельности, для которой проектируется язык. Зачастую для использования таких языков не требуется квалификация разработчика и на них программируют люди, хорошо разбирающиеся в предметной области.

В чем преимущество предметно-ориентированных языков? Зачем они нужны?

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

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

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

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

Каким образом код на предметно-ориентированных языках интегрируется с обычным кодом?

Существует два принципиально разных способа интеграции DSL-кода и традиционного кода. Первый подразумевает хранение DSL-кода и обычного кода в отдельных файлах. Впоследствии DSL-код либо преобразуется в код на обычном языке с помощью автоматизированного генератора кода, либо загружается самой программой для последующего выполнения. Языки, использующие данный подход, при котором код на языках общего назначения (General Purpose Languages, GPL) отделен от DSL-кода, называются внешними DSL. Примером внешнего DSL можно считать SQL.

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

Стоит отметить, что некоторые языки общего назначения больше подходят для расширения, чем другие.

MPS поддерживает оба подхода, так как каждый из них может быть полезен в разных ситуациях.

До появления MPS структура и синтаксис DSL-языка определялись путем написания кода на языке, в который предполагалось встраивать DSL-код. Из-за того, что в IDE, как правило, отсутствовала поддержка DSL, разработчику не был доступен ряд возможностей, таких как автодополнение кода, специализированная проверка на ошибки и т. д. MPS предоставляет фреймворк с собственными специализированными DSL для разработки языков, позволяющий вам создавать языковые расширения. Благодаря этому IDE может обрабатывать DSL-код, и таким образом система предоставляет полную поддержку встраиваемых предметно-ориентированных языков со стороны IDE.

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

Термин «языково-ориентированное программирование» был предложен Сергеем Дмитриевым, основателем и первым CEO JetBrains и «отцом» MPS, в статье 2004 года «Языково-ориентированное программирование: следующая парадигма» (Language-Oriented Programming: The Next Programming Paradigm). Похожие подходы под разными названиями разрабатывались и другими специалистами. Например, Чарльз Симони предложил концепцию ментального программирования, а Мартин Фаулер описал этот подход в статье 2005 года «Языковой инструментарий: новая жизнь языков предметной области» (Language Workbenches: The Killer-App for Domain Specific Languages?).

Основная идея заключается в том, чтобы при разработке программного обеспечения использовать не один универсальный язык, а использовать те языки, которые наилучшим образом подходят для решения конкретных задач. В отличие от программирования на разных языках, которое, на первый взгляд, следует подобным принципам, важным аспектом языково-ориентированного программирования является создание разработчиками собственных DSL и расширение существующих языков с помощью концепций, характерных для конкретной предметной области. Чтобы это стало возможным, в реализации языково-ориентированного подхода важную роль играют языковые инструменты, такие как MPS.

С помощью MPS вы можете самостоятельно создавать редакторы для DSL, чтобы упростить использование нового языка. Даже специалисты, которые не знакомы с традиционным программированием, могут легко работать в MPS, используя языки, созданные на основе специализированной терминологии конкретной предметной области.

Следующее видео демонстрирует, как с помощью MPS был создан интерактивный автоответчик. В данном случае, предметно-ориентированный язык предназначен для использования людьми нетехнических специальностей, и механизм взаимодействия с пользователем адаптирован соответствующим образом.