Язык , специфичный для домена ( DSL ) — это компьютерный язык, специализированный для определенного домена приложения . Это контрастирует с языком общего назначения ( GPL ), который широко применяется в разных доменах. Существует большое разнообразие DSL, от широко используемых языков для общих доменов, таких как HTML для веб-страниц, до языков, используемых только одним или несколькими частями программного обеспечения, такими как программный код MUSH . DSL можно дополнительно подразделить по типу языка и включить языки разметки , специфичные для домена, языки моделирования (в более общем смысле, языки спецификаций ) и языки программирования , специфичные для домена. Специализированные компьютерные языки всегда существовали в компьютерную эпоху, но термин «язык, специфичный для домена» стал более популярным из-за роста моделирования, специфичного для домена . Более простые DSL, особенно те, которые используются одним приложением, иногда неофициально называют мини-языками .
Граница между языками общего назначения и предметно-ориентированными языками не всегда резкая, поскольку язык может иметь специализированные функции для определенной области, но применяться более широко, или наоборот, в принципе может иметь широкое применение, но на практике использоваться в основном для определенной области. Например, Perl изначально был разработан как язык обработки текста и связующий язык для той же области, что и AWK и скрипты оболочки , но позже в основном использовался как язык программирования общего назначения. Напротив, PostScript является полным по Тьюрингу языком и в принципе может использоваться для любой задачи, но на практике узко используется как язык описания страниц .
Проектирование и использование соответствующих 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, обычно являются языками моделирования общего назначения.
Подводя итог, можно привести аналогию: Very Little Language подобен ножу, который можно использовать тысячами разных способов, от нарезки еды до рубки деревьев. [ требуется пояснение ] Предметно-ориентированный язык подобен электродрели: это мощный инструмент с широким спектром применения, но в определенном контексте, а именно, для сверления отверстий в вещах. Универсальный язык — это полноценный верстак с множеством инструментов, предназначенных для выполнения различных задач. Предметно-ориентированные языки должны использоваться программистами, которые, глядя на свой текущий верстак, понимают, что им нужна лучшая дрель, и обнаруживают, что конкретный предметно-ориентированный язык обеспечивает именно это. [ требуется цитата ]
DSL, реализованные через независимый интерпретатор или компилятор, известны как Внешние доменно-специфические языки . Известные примеры включают TeX или AWK. Отдельная категория, известная как Встроенные (или Внутренние) доменно-специфические языки , обычно реализуется в базовом языке в виде библиотеки и, как правило, ограничивается синтаксисом базового языка, хотя это зависит от возможностей базового языка. [1]
Существует несколько моделей использования доменно-специфических языков: [2] [3]
Многие предметно-ориентированные языки можно использовать несколькими способами. [ необходима ссылка ] Код DSL, встроенный в базовый язык, может иметь специальную поддержку синтаксиса, например регулярные выражения в sed, AWK, Perl или JavaScript, или может передаваться в виде строк.
Принятие подхода к разработке программного обеспечения на основе предметно-ориентированного языка сопряжено как с рисками, так и с возможностями. Хорошо спроектированный предметно-ориентированный язык позволяет найти правильный баланс между ними.
Предметно-ориентированные языки имеют важные цели проектирования, которые отличаются от целей языков общего назначения:
В программировании идиомы — это методы, применяемые программистами для решения общих задач разработки, например:
Языки программирования общего назначения редко поддерживают такие идиомы, но предметно-ориентированные языки могут их описывать, например:
Примерами языков программирования, ориентированных на определенную область, являются HTML , Logo для рисования карандашом, языки описания оборудования Verilog и VHDL , MATLAB и GNU Octave для матричного программирования, Mathematica , Maple и Maxima для символьной математики , язык спецификаций и описаний для реактивных и распределенных систем, формулы и макросы электронных таблиц , SQL для запросов к реляционным базам данных , грамматики YACC для создания парсеров , регулярные выражения для указания лексеров , Generic Eclipse Modeling System для создания языков диаграмм, Csound для синтеза звука и музыки и языки ввода GraphViz и GrGen , программные пакеты, используемые для компоновки и переписывания графов , язык конфигурации Hashicorp, используемый для Terraform и других инструментов Hashicorp , Puppet также имеет свой собственный язык конфигурации.
Язык сценариев GML, используемый GameMaker Studio, является предметно-ориентированным языком, ориентированным на начинающих программистов, чтобы они могли легко изучить программирование. Хотя язык служит смесью нескольких языков, включая Delphi , C++ и BASIC . Большинство функций на этом языке после компиляции фактически вызывают функции времени выполнения, написанные на языке, специфичном для целевой платформы, поэтому их окончательная реализация не видна пользователю. Язык в первую очередь служит для того, чтобы облегчить любому человеку выбор языка и разработку игры, а благодаря среде выполнения GM, которая обрабатывает основной игровой цикл и сохраняет реализацию вызываемых функций, для простейшей игры требуется несколько строк кода вместо тысяч.
Связанный язык сценариев ColdFusion — еще один пример языка, специфичного для домена, для веб-сайтов, управляемых данными. Этот язык сценариев используется для объединения языков и служб, таких как Java, .NET, C++, SMS, электронная почта, серверы электронной почты, http, ftp, exchange, службы каталогов и файловые системы для использования на веб-сайтах.
Язык разметки ColdFusion (CFML) включает набор тегов, которые можно использовать на страницах ColdFusion для взаимодействия с источниками данных, манипулирования данными и отображения вывода. Синтаксис тегов CFML похож на синтаксис элемента HTML.
FilterMeister — это среда программирования с языком программирования, основанным на C, для конкретной цели создания совместимых с Photoshop подключаемых модулей фильтров обработки изображений; FilterMeister работает как подключаемый модуль Photoshop и может загружать и выполнять скрипты или компилировать и экспортировать их как независимые подключаемые модули. Хотя язык FilterMeister воспроизводит значительную часть языка C и библиотеки функций, он содержит только те функции, которые могут использоваться в контексте подключаемых модулей Photoshop, и добавляет ряд специфических функций, полезных только в этой конкретной области.
Функция «Шаблон» MediaWiki — это встроенный предметно-ориентированный язык, основной целью которого является поддержка создания шаблонов страниц и включение (включение по ссылке) страниц MediaWiki в другие страницы MediaWiki.
Существует большой интерес к предметно-ориентированным языкам для повышения производительности и качества разработки программного обеспечения . Предметно-ориентированный язык, возможно, мог бы предоставить надежный набор инструментов для эффективной разработки программного обеспечения. Такие инструменты начинают проникать в разработку критически важных программных систем.
Примером этого является Software Cost Reduction Toolkit [5] . Набор инструментов представляет собой набор утилит, включающий редактор спецификаций для создания спецификации требований , браузер графа зависимостей для отображения зависимостей переменных, средство проверки согласованности для обнаружения пропущенных случаев в правильно сформированных формулах в спецификации, средство проверки моделей и средство доказательства теорем для проверки свойств программы на соответствие спецификации, а также генератор инвариантов, который автоматически создает инварианты на основе требований.
Более новой разработкой является языково-ориентированное программирование — интегрированная методология разработки программного обеспечения, основанная главным образом на создании, оптимизации и использовании предметно-ориентированных языков.
Дополнением к языково-ориентированному программированию , а также ко всем другим формам предметно-ориентированных языков является класс инструментов для написания компиляторов, называемых метакомпиляторами . Метакомпилятор полезен не только для генерации парсеров и генераторов кода для предметно-ориентированных языков, но и сам метакомпилятор компилирует предметно-ориентированный метаязык, специально разработанный для области метапрограммирования .
Помимо анализа доменно-специфических языков, метакомпиляторы полезны для создания широкого спектра инструментов для разработки и анализа программного обеспечения. Методология метакомпилятора часто встречается в системах преобразования программ .
Метакомпиляторы, сыгравшие значительную роль как в компьютерной науке , так и в компьютерной индустрии, включают Meta-II [6] и его потомка TreeMeta [7] .
Unreal и Unreal Tournament представили язык под названием UnrealScript . Это позволило быстро разрабатывать модификации по сравнению с конкурентом Quake (использующим движок Id Tech 2 ). Движок Id Tech использовал стандартный код C , что означало, что C нужно было изучить и правильно применять, в то время как UnrealScript был оптимизирован для простоты использования и эффективности. Аналогично, разработка более поздних игр представила свои собственные специфические языки, еще одним распространенным примером является Lua для написания скриптов. [ необходима цитата ]
Различные механизмы бизнес-правил были разработаны для автоматизации политик и бизнес-правил, используемых как в государственном, так и в частном секторе. ILOG , Oracle Policy Automation , DTRules, Drools и другие обеспечивают поддержку DSL, направленных на поддержку различных проблемных областей. DTRules заходит так далеко, что определяет интерфейс для использования нескольких DSL в наборе правил.
Целью движков бизнес-правил является определение представления бизнес-логики в максимально удобном для восприятия человеком виде. Это позволяет как экспертам в предметной области, так и разработчикам работать с одним и тем же представлением бизнес-логики и понимать его. Большинство движков правил предоставляют как подход к упрощению структур управления для бизнес-логики (например, с использованием декларативных правил или таблиц решений ), так и альтернативы синтаксису программирования в пользу DSL.
Статистические моделисты разработали доменно-специфические языки, такие как R (реализация языка S ), Bugs , Jags и Stan . Эти языки предоставляют синтаксис для описания байесовской модели и генерируют метод ее решения с использованием моделирования.
Генерировать обработку объектов и сервисы на основе языка описания интерфейса для предметно-ориентированного языка, такого как JavaScript для веб-приложений, HTML для документации, C++ для высокопроизводительного кода и т. д. Это выполняется с помощью кросс-языковых фреймворков, таких как Apache Thrift или Google Protocol Buffers .
Gherkin — это язык, разработанный для определения тестовых случаев для проверки поведения программного обеспечения, без указания того, как это поведение реализуется. Он предназначен для чтения и использования нетехническими пользователями с использованием естественного языкового синтаксиса и строчно-ориентированного дизайна . Тесты, определенные с помощью Gherkin, затем должны быть реализованы на общем языке программирования. Затем шаги в программе Gherkin действуют как синтаксис для вызова метода, доступного неразработчикам.
Другие яркие примеры предметно-ориентированных языков включают в себя:
Некоторые из преимуществ: [2] [3]
Некоторые из недостатков:
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь ){{cite journal}}
: Цитировать журнал требует |journal=
( помощь )