Введение
Компьютерный язык, специализирующийся на определенном наборе требований или функциональности. Язык, специфичный для предметной области (DSL) – это компьютерный язык, специализирующийся на определенной области применения. Это отличается от языка общего назначения (GPL), который широко применим в различных областях. Существует большое разнообразие DSL, от широко используемых языков для распространенных областей, таких как HTML для веб-страниц, до языков, используемых только одним или несколькими программными продуктами, например, MUSH soft code. DSL можно дополнительно подразделять по типу языка и включают языки разметки, специфичные для предметной области, языки моделирования (в более широком смысле – языки спецификаций) и языки программирования, специфичные для предметной области. Специализированные компьютерные языки всегда существовали в эпоху компьютеров, но термин «язык, специфичный для предметной области» стал более популярным благодаря развитию доменного моделирования. Более простые DSL, особенно используемые одним приложением, иногда неформально называют мини-языками. Граница между языками общего назначения и языками, специфичными для предметной области, не всегда четкая, поскольку язык может иметь специализированные возможности для определенной области, но при этом быть применимым в более широком контексте, или, наоборот, теоретически быть способным к широкому применению, но на практике использоваться преимущественно для конкретной области. Например, Perl изначально разрабатывался как язык обработки текста и язык-связка, для той же области, что и AWK и shell-скрипты, но позже в основном использовался как язык программирования общего назначения. В отличие от этого, PostScript является языком, полным по Тьюрингу, и теоретически может использоваться для любой задачи, но на практике узко специализируется как язык описания страниц.
A domain specific language (DSL) is a computer language specialized to a particular application domain. This is in contrast to a general purpose language (GPL), which is broadly applicable across domains. There are a wide variety of DSLs, ranging from widely used languages for common domains, such as HTML for web pages, down to languages used by only one or a few pieces of software, such as MUSH soft code. DSLs can be further subdivided by the kind of language, and include domain specific markup languages, domain specific modeling languages (more generally, specification languages), and domain specific programming languages. Special purpose computer languages have always existed in the computer age, but the term "domain specific language" has become more popular due to the rise of domain specific modeling. Simpler DSLs, particularly ones used by a single application, are sometimes informally called mini languages. The line between general purpose languages and domain specific languages is not always sharp, as a language may have specialized features for a particular domain but be applicable more broadly, or conversely may in principle be capable of broad application but in practice used primarily for a specific domain. For example, Perl was originally developed as a text processing and glue language, for the same domain as AWK and shell scripts, but was mostly used as a general purpose programming language later on. By contrast, PostScript is a Turing complete language, and in principle can be used for any task, but in practice is narrowly used as a page description language.
Использование
Разработка и использование подходящих DSL является ключевой частью проектирования предметно-ориентированных систем, поскольку использование языка, соответствующего решаемой задаче – будь то существующий DSL или GPL, или разработка нового DSL – позволяет повысить эффективность. Языко-ориентированное программирование рассматривает создание специализированных языков для выражения проблем как неотъемлемую часть процесса решения задач. Создание языка, специфичного для определенной области (вместе с программным обеспечением для его поддержки), может быть оправдано, если этот язык позволяет более ясно и лаконично выражать определенный тип проблем или решений, чем существующие языки, и если подобные проблемы возникают достаточно часто. На практике DSL может быть специализирован для конкретной предметной области, способа представления задач, метода решения или других аспектов предметной области.
В проектировании и реализации
Доменные языки — это языки (или, чаще, декларируемые синтаксисы или грамматики) с очень специфическими целями при разработке и реализации. Доменный язык может быть представлен визуальным языком диаграмм, таким как языки, созданные Generic Eclipse Modeling System, программными абстракциями, например Eclipse Modeling Framework, или текстовыми языками. Например, утилита командной строки grep имеет синтаксис регулярных выражений для поиска шаблонов в строках текста. Утилита sed определяет синтаксис для сопоставления и замены регулярных выражений. Часто эти небольшие языки можно использовать совместно в оболочке для выполнения более сложных задач программирования. Граница между доменными языками и языками сценариев несколько размыта, но доменные языки часто лишены функций низкого уровня для доступа к файловой системе, управления процессами и других функций, характерных для полнофункциональных языков программирования, будь то скриптовые или нет. Многие доменные языки не компилируются в байт-код или исполняемый код, а в различные типы медиаобъектов: GraphViz экспортирует в PostScript, GIF, JPEG и т. д., Csound компилирует в аудиофайлы, а доменный язык трассировки лучей, такой как POV, компилирует в графические файлы.
Языки определения данных
Язык определения данных, такой как SQL, представляет собой интересный случай: его можно рассматривать как предметно-ориентированный язык, поскольку он предназначен для конкретной области (в случае SQL – доступ и управление реляционными базами данных) и часто вызывается из другого приложения. Однако SQL обладает большим количеством ключевых слов и функций, чем многие скриптовые языки, и часто воспринимается как самостоятельный язык, возможно, из-за широкого распространения манипулирования базами данных в программировании и уровня мастерства, необходимого для становления экспертом в этом языке. Еще больше размывая эту границу, многие предметно-ориентированные языки имеют открытые API и могут быть доступны из других языков программирования без прерывания потока выполнения или запуска отдельного процесса, что позволяет им функционировать как библиотеки программирования.
Инструменты программирования
Некоторые языки, специфичные для предметной области, со временем расширяются, включая полнофункциональные инструменты программирования, что еще больше усложняет вопрос о том, является ли язык действительно специфичным для предметной области. Хорошим примером служит функциональный язык XSLT, изначально разработанный для преобразования одного XML-графа в другой, который с момента своего появления был расширен, чтобы обеспечить (особенно в версии 2.0) различные виды взаимодействия с файловой системой, манипулирования строками и датами, а также типизацию данных. В моделируемой инженерии можно найти множество примеров языков, специфичных для предметной области, таких как OCL – язык для добавления утверждений к моделям, или QVT – язык трансформаций, специфичный для предметной области. Однако такие языки, как UML, обычно являются языками моделирования общего назначения. Чтобы подвести итог, может быть полезной аналогия: очень простой язык – это как нож, который можно использовать тысячами различных способов, от нарезки пищи до валки деревьев. Язык, специфичный для предметной области, похож на электрическую дрель: это мощный инструмент с широким спектром применения, но предназначенный для конкретной задачи – сверления отверстий. Язык общего назначения – это полноценная мастерская, оснащенная разнообразными инструментами для выполнения различных задач. Языки, специфичные для предметной области, должны использоваться программистами, которые, оценивая свой текущий набор инструментов, понимают, что им нужна более эффективная дрель, и обнаруживают, что конкретный язык для конкретной предметной области предоставляет именно такую возможность.
Языки, специфичные для внешнего и встроенного домена
DSL, реализованные с помощью независимого интерпретатора или компилятора, известны как внешние языки, специфичные для предметной области. Хорошо известные примеры включают LaTeX и AWK. Отдельная категория, известная как встроенные (или внутренние) языки, специфичные для предметной области, обычно реализуются внутри языка-хоста в виде библиотеки и, как правило, ограничены синтаксисом языка-хоста, хотя это зависит от возможностей языка-хоста.
Идиомы
В программировании идиомами называют методы, используемые программистами для решения типовых задач разработки, например:
Гарантировать сохранение данных перед закрытием окна. Изменять код при изменении параметров командной строки, поскольку они влияют на поведение программы. Языки программирования общего назначения редко поддерживают такие идиомы, но языки, ориентированные на конкретную область, могут их описывать, например:
Скрипт может автоматически сохранять данные. Язык, ориентированный на конкретную область, может параметризовать ввод из командной строки.
Примеры
Примеры языков программирования, специфичных для определенной области, включают HTML, Logo для рисования, похожего на карандашный эскиз, языки описания аппаратуры Verilog и VHDL, MATLAB и GNU Octave для матричного программирования, Mathematica, Maple и Maxima для символьной математики, язык спецификаций и описаний для реактивных и распределенных систем, формулы и макросы электронных таблиц, SQL для запросов к реляционным базам данных, грамматики YACC для создания парсеров, регулярные выражения для определения лексических анализаторов, Generic Eclipse Modeling System для создания языков диаграмм, Csound для синтеза звука и музыки, а также языки ввода GraphViz и GrGen – программные пакеты, используемые для компоновки и преобразования графов, язык конфигурации HashiCorp, используемый для Terraform и других инструментов HashiCorp, и Puppet, который также имеет собственный язык конфигурации.
Язык GameMaker
Язык сценариев GML, используемый в GameMaker Studio, — это специализированный язык, ориентированный на начинающих программистов, чтобы облегчить им изучение программирования. Хотя язык представляет собой смесь нескольких языков, таких как Delphi, C++ и BASIC, в нём отсутствуют структуры, типы данных и другие возможности полноценного языка программирования. Многие встроенные функции инкапсулированы для обеспечения лёгкой переносимости. Основная цель языка — предоставить возможность любому быстро освоить его и разрабатывать игры.
ОПП Эрланг
Платформа Erlang Open Telecom Platform изначально разрабатывалась для использования внутри Ericsson как специализированный язык программирования. Сам язык предоставляет платформу библиотек для создания конечных автоматов, универсальных серверов и менеджеров событий, что позволяет инженерам быстро развертывать приложения или создавать вспомогательные библиотеки, которые, согласно отраслевым тестам, демонстрируют более высокую производительность по сравнению с другими языками, предназначенными для широкого спектра задач, такими как C и C++. В настоящее время язык является официально открытым и доступен для загрузки с их веб-сайта.
Фильтрмейстер
FilterMeister — это среда программирования с языком, основанным на C, предназначенная специально для создания плагинов фильтров обработки изображений, совместимых с Photoshop. FilterMeister работает как плагин Photoshop и позволяет загружать и выполнять скрипты, а также компилировать и экспортировать их в виде независимых плагинов. Хотя язык FilterMeister воссоздает значительную часть языка C и его библиотек функций, он включает в себя только те возможности, которые применимы в контексте плагинов Photoshop, и добавляет ряд специфических функций, полезных исключительно в этой области.
Шаблоны MediaWiki
Функция шаблонов MediaWiki — это встроенный предметно-ориентированный язык, основное назначение которого — поддержка создания шаблонов страниц и включения (трансклюзии) страниц MediaWiki в другие страницы MediaWiki.
Использование программного обеспечения
Существует значительный интерес к языкам, ориентированным на конкретную предметную область, с целью повышения производительности и качества разработки программного обеспечения. Язык, специфичный для предметной области, потенциально может предоставить надежный набор инструментов для эффективной разработки программного обеспечения. Подобные инструменты начинают внедряться в разработку критически важных программных систем. Набор инструментов для снижения стоимости программного обеспечения является одним из примеров этого. Этот набор инструментов включает в себя ряд утилит, таких как редактор спецификаций для создания спецификации требований, просмотрщик графов зависимостей для визуализации зависимостей между переменными, средство проверки согласованности для выявления неполноты в корректно сформированных формулах спецификации, средство проверки моделей и доказатель теорем для проверки свойств программы на соответствие спецификации, а также генератор инвариантов, который автоматически строит инварианты на основе требований. Более новым направлением является языко-ориентированное программирование – интегрированная методология разработки программного обеспечения, основанная главным образом на создании, оптимизации и использовании языков, ориентированных на конкретную предметную область.
Метакомпиляторы
В дополнение к языко-ориентированному программированию, а также ко всем другим формам языков, специфичных для предметной области, существует класс инструментов для создания компиляторов, называемых метакомпиляторами. Метакомпилятор полезен не только для генерации парсеров и генераторов кода для языков, специфичных для предметной области, но и сам компилирует метаязык, специально разработанный для области метапрограммирования. Помимо разбора языков, специфичных для предметной области, метакомпиляторы полезны для создания широкого спектра инструментов разработки и анализа программного обеспечения. Методология метакомпилятора часто встречается в системах преобразования программ. Метакомпиляторы, сыгравшие значительную роль как в компьютерной науке, так и в компьютерной индустрии, включают Meta II и его производную TreeMeta.
Unreal Engine до версии 4 и другие игры
Unreal и Unreal Tournament представили язык программирования под названием UnrealScript. Это обеспечивало более быструю разработку модификаций по сравнению с Quake (использующим движок Id Tech 2). В движке Id Tech использовался стандартный код на C, что требовало изучения и правильного применения C, в то время как UnrealScript был оптимизирован для простоты использования и высокой производительности. Подобным образом, разработка более современных игр часто включала в себя собственные специализированные языки, одним из наиболее распространенных примеров является Lua для скриптов.
Системы автоматизации политики
Разработаны различные системы бизнес-правил для автоматизации политик и бизнес-правил, используемых как в государственном, так и в частном секторе. ILOG, Oracle Policy Automation, DTRules, Drools и другие обеспечивают поддержку DSL, ориентированных на различные предметные области. DTRules идет еще дальше, определяя интерфейс для использования нескольких DSL в рамках одного набора правил. Цель систем бизнес-правил – определить представление бизнес-логики в максимально понятной для человека форме. Это позволяет экспертам в предметной области и разработчикам работать с одним и тем же представлением бизнес-логики и понимать его. Большинство систем бизнес-правил предоставляют подход к упрощению структур управления бизнес-логикой (например, с использованием декларативных правил или таблиц принятия решений), а также альтернативы синтаксису программирования в пользу DSL.
Создание моделей и сервисов для нескольких языков программирования
Генерация обработки объектов и сервисов на основе языка описания интерфейсов для предметно-ориентированного языка, например, JavaScript для веб-приложений, HTML для документации или C++ для высокопроизводительного кода. Это достигается с помощью кросс-языковых фреймворков, таких как Apache Thrift или Google Protocol Buffers.
Огурцы
Gherkin — это язык, разработанный для определения тестовых сценариев, позволяющих проверить поведение программного обеспечения, без указания деталей реализации этого поведения. Он предназначен для чтения и использования нетехническими специалистами благодаря синтаксису, близкому к естественному языку, и построчному структуре. Тестовые сценарии, определенные с помощью Gherkin, затем должны быть реализованы на каком-либо языке программирования. Шаги в программе на Gherkin служат синтаксисом для вызова методов, доступным для людей, не являющихся разработчиками.