Доменный язык - Domain-specific language

А предметно-ориентированный язык (DSL) это компьютерный язык специализированный для конкретного приложения домен. Это в отличие от язык общего назначения (GPL), который широко применяется во всех доменах. Существует множество DSL, начиная от широко используемых языков для общих областей, таких как HTML для веб-страниц, вплоть до языков, используемых только одним или несколькими частями программного обеспечения, такими как MUSH мягкий код. DSL могут быть дополнительно подразделены по типу языка и включать в себя предметно-ориентированные разметка языки, для домена моделирование языки (в более общем смысле, языки спецификации ) и предметно-ориентированный программирование языки. Специализированные компьютерные языки всегда существовали в компьютерную эпоху, но термин «предметно-ориентированный язык» стал более популярным из-за распространения предметно-ориентированное моделирование. Более простые DSL, особенно те, которые используются одним приложением, иногда неофициально называют мини-языки.

Граница между языками общего назначения и предметно-ориентированными языками не всегда четкая, поскольку язык может иметь специализированные функции для конкретной предметной области, но может применяться более широко, или, наоборот, в принципе может иметь широкое применение, но на практике используется в основном для конкретный домен. Например, Perl изначально был разработан как язык обработки текста и склейки для той же области, что и AWK и сценарии оболочки, но позже в основном использовался как язык программирования общего назначения. Напротив, PostScript это Тьюринг завершен язык, и в принципе может использоваться для любых задач, но на практике используется узко как язык описания страницы.

Использовать

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

Обзор

Специфичный для предметной области язык создается специально для решения проблем в определенной предметной области и не предназначен для решения проблем вне его (хотя это может быть технически возможно). Напротив, языки общего назначения созданы для решения проблем во многих областях. Домен также может быть бизнес-сферой. Вот некоторые примеры сфер бизнеса:

  • полисы страхования жизни (разработанные внутри крупного страхового предприятия)
  • боевой симулятор
  • расчет зарплаты
  • выставление счетов

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

В дизайне и реализации

Специфичные для предметной области языки - это языки (или часто объявленные синтаксисы или грамматики) с очень конкретными целями в дизайне и реализации. Доменно-ориентированный язык может быть одним из языков визуальных диаграмм, например, созданных Общая система моделирования Eclipse программные абстракции, такие как Среда моделирования Eclipse, или текстовые языки. Например, утилита командной строки grep имеет регулярное выражение синтаксис, соответствующий шаблонам в строках текста. В sed Утилита определяет синтаксис для сопоставления и замены регулярных выражений. Часто эти крошечные языки можно использовать вместе внутри ракушка для выполнения более сложных задач программирования.

Граница между предметно-ориентированными языками и языки сценариев несколько размыт, но в предметно-ориентированных языках часто отсутствуют низкоуровневые функции для доступа к файловой системе, межпроцессного управления и других функций, которые характерны для полнофункциональных языков программирования, сценариев и т. д. Многие предметно-ориентированные языки не компилируются в байт-код или исполняемый код, но для различных типов медиа-объектов: GraphViz экспортирует в PostScript, Гифка, JPEG и т. д., где Csound компилируется в аудиофайлы и на предметно-ориентированный язык трассировки лучей, например POV компилируется в графические файлы. Компьютерный язык вроде SQL представляет собой интересный случай: его можно считать предметно-ориентированным языком, потому что он специфичен для определенного домена (в случае SQL - доступ к реляционным базам данных и управление ими) и часто вызывается из другого приложения, но SQL имеет больше ключевых слов и функций, чем многие языки сценариев, и его часто считают самостоятельным языком, возможно, из-за преобладания манипуляций с базами данных в программировании и количества мастерства, необходимого для того, чтобы быть экспертом в этом языке.

Еще больше размывая эту границу, многие предметно-ориентированные языки имеют открытые API и могут быть доступны из других языков программирования без нарушения потока выполнения или вызова отдельного процесса и, таким образом, могут работать как библиотеки программирования.

Инструменты программирования

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

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

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

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

Языки для внешних и встроенных доменов

DSL, реализованные с помощью независимого интерпретатора или компилятора, известны как Языки для внешних доменов. Хорошо известные примеры включают LaTeX или AWK. Отдельная категория известна как Встроенные (или внутренние) языки, специфичные для домена обычно реализуются в рамках основного языка в виде библиотеки и, как правило, ограничиваются синтаксисом основного языка, хотя это зависит от возможностей основного языка.[1]

Шаблоны использования

Существует несколько шаблонов использования предметно-ориентированных языков:[2][3]

  • Обработка с помощью автономных инструментов, вызываемых прямым действием пользователя, часто из командной строки или из Makefile (например, grep для сопоставления регулярных выражений, sed, lex, yacc, GraphViz набор инструментов и т. д.)
  • Специфические для предметной области языки, которые реализованы с использованием макросистем языка программирования и которые преобразуются или расширяются в основной язык общего назначения во время компиляции или в реальном времени.
  • встроенный предметно-ориентированный язык (eDSL),[4] реализованы в виде библиотек, которые используют синтаксис своего основного языка общего назначения или его подмножества при добавлении языковых элементов, зависящих от предметной области (типы данных, процедуры, методы, макросы и т. д.). (например. jQuery, Реагировать, Встроенный SQL, LINQ )
  • Доменные языки, которые вызываются (во время выполнения) из программ, написанных на языках общего назначения, таких как C или же Perl, чтобы выполнить определенную функцию, часто возвращая результаты операции на «главный» язык программирования для дальнейшей обработки; как правило, переводчик или виртуальная машина для предметно-ориентированного языка встроен в хост-приложение (например, строки формата, а механизм регулярных выражений )
  • Специфические для предметной области языки, которые встроены в пользовательские приложения (например, макроязыки в электронных таблицах) и которые (1) используются для выполнения кода, написанного пользователями приложения, (2) динамически генерируются приложением или (3) обе.

Многие предметно-ориентированные языки могут использоваться более чем одним способом.[нужна цитата ] Код DSL, встроенный в основной язык, может иметь особую поддержку синтаксиса, например регулярные выражения в sed, AWK, Perl или JavaScript, или может передаваться в виде строк.

Цели дизайна

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

У предметно-ориентированных языков есть важные цели проектирования, которые контрастируют с целями языков общего назначения:

  • Доменные языки менее полны.
  • Языки предметной области гораздо более выразительны в своей области.
  • Доменные языки должны демонстрировать минимальные избыточность.

Идиомы

В программировании идиомы - это методы, навязанные программистами для решения общих задач разработки, например:

  • Перед закрытием окна убедитесь, что данные сохранены.
  • Редактируйте код при изменении параметров командной строки, поскольку они влияют на поведение программы.

Языки программирования общего назначения редко поддерживают такие идиомы, но предметно-ориентированные языки могут их описывать, например:

  • Скрипт может автоматически сохранять данные.
  • Язык, специфичный для предметной области, может параметризовать ввод командной строки.

Примеры

Примеры предметно-ориентированных языков включают HTML, Логотип для рисования карандашом, Verilog и VHDL языки описания оборудования, MATLAB и GNU Octave для матричного программирования, Mathematica, Клен и Максима за символическая математика, Спецификация и язык описания для реактивных и распределенных систем, электронная таблица формулы и макросы, SQL за реляционная база данных запросы, YACC грамматики для создания парсеры, обычные выражения для уточнения лексеры, то Общая система моделирования Eclipse для создания языков диаграмм, Csound для синтеза звука и музыки, а языки ввода GraphViz и GrGen, программные пакеты, используемые для макет графика и переписывание графа.

Язык GameMaker

Язык сценариев GML, используемый GameMaker Studio это предметно-ориентированный язык, ориентированный на начинающих программистов, которые легко могут изучать программирование. Хотя язык представляет собой смесь нескольких языков, включая Delphi, C ++, и БАЗОВЫЙ, отсутствует структура, типы данных и другие возможности полноценного языка программирования. Многие из встроенных функций в песочнице для удобства переноски. Язык в первую очередь служит для того, чтобы каждый мог легко освоить язык и разработать игру.

Скрипты оболочки Unix

Unix сценарии оболочки дать хороший пример предметно-ориентированного языка для данные[5] организация. Они могут манипулировать данными в файлы или пользовательский ввод разными способами. Абстракции и обозначения доменов включают потоки (например, stdin и stdout) и операции с потоками (например, перенаправление и конвейер). Эти абстракции в совокупности образуют надежный язык для описания потока и организации данных.

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

Эти задачи состоят из простых поток управления и механизмы манипулирования строками, которые охватывают множество общих применений, таких как поиск и замена нить в файлах или подсчет вхождений строк (частотный подсчет).

Несмотря на то, что языки сценариев Unix Тьюринг завершен, они отличаются от языки общего назначения.[требуется разъяснение ]

На практике, языки сценариев используются для объединения небольших инструментов Unix, таких как grep, ls, Сортировать или же Туалет.

Язык разметки ColdFusion

Холодный синтез связанный язык сценариев является еще одним примером предметно-ориентированного языка для веб-сайтов, управляемых данными. Этот язык сценариев используется для объединения языков и служб, таких как Java, .NET, C ++, SMS, электронная почта, почтовые серверы, http, ftp. , Exchange, службы каталогов и файловые системы для использования на веб-сайтах.

В Язык разметки ColdFusion (CFML) включает набор тегов, которые можно использовать на страницах ColdFusion для взаимодействия с источниками данных, управления данными и отображения вывода. Синтаксис тега CFML аналогичен синтаксису элемента HTML.

Erlang OTP

Открытая телекоммуникационная платформа Erlang изначально был разработан для использования внутри Ericsson как предметно-ориентированный язык. Сам язык предлагает платформу библиотек для создания конечных автоматов, общих серверов и менеджеров событий, которые позволяют инженеру быстро развертывать приложения или поддерживать библиотеки, которые, как показали отраслевые тесты, превосходят другие языки, предназначенные для смешанного набора доменов. , например C и C ++. Язык теперь официально является открытым исходным кодом и может быть загружен с их веб-сайта.

FilterMeister

FilterMeister - это среда программирования с языком программирования, основанным на C, для конкретной цели создания Фотошоп -совместимые плагины фильтров обработки изображений; FilterMeister работает как плагин Photoshop и может загружать и выполнять сценарии или компилировать и экспортировать их как независимые плагины. Хотя язык FilterMeister воспроизводит значительную часть языка C и библиотеки функций, он содержит только те функции, которые могут использоваться в контексте плагинов Photoshop и добавляет ряд специфических функций, полезных только в этой конкретной области.

Шаблоны MediaWiki

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

Программная инженерия использует

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

Набор инструментов для снижения затрат на программное обеспечение[6] является примером этого. Инструментарий представляет собой набор утилит, включая редактор спецификаций для создания Технические требования, браузер графа зависимостей для отображения зависимостей переменных, средство проверки согласованности поймать пропавшие дела в правильные формулы в спецификации модель проверки и средство доказательства теорем для проверки свойств программы на соответствие спецификации и генератор инвариантов, который автоматически строит инварианты на основе требований.

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

Метакомпиляторы

Дополнение языковое программирование, как и все другие формы предметно-ориентированных языков, представляют собой класс инструментов для написания компиляторов, называемых метакомпиляторы. Метакомпилятор полезен не только для создания парсеры и генераторы кода для предметно-ориентированных языков, но метакомпилятор сам компилирует предметно-ориентированный метаязык специально разработан для области метапрограммирование.

Помимо анализа предметно-ориентированных языков, метакомпиляторы полезны для создания широкого спектра инструментов разработки и анализа программного обеспечения. Методология мета-компилятора часто встречается в системы преобразования программ.

Метакомпиляторы, сыгравшие значительную роль как в информатике, так и в компьютерной индустрии, включают: Мета-II,[7] и его потомок TreeMeta.[8]

Unreal Engine до версии 4 и другие игры

Нереально и Нереальный Турнир представил язык под названием UnrealScript. Это позволило быстро разработать модификации по сравнению с конкурентом. Землетрясение (с использованием Id Tech 2 двигатель). Механизм Id Tech использовал стандартный C код означает, что C нужно было изучить и правильно применить, в то время как UnrealScript был оптимизирован для простоты использования и эффективности. Точно так же при разработке более поздних игр были введены свои собственные специфические языки, еще один распространенный пример: Lua для написания сценариев.[нужна цитата ]

Механизмы правил для автоматизации политик

Разные Механизмы бизнес-правил были разработаны для автоматизации политик и бизнес-правил, используемых как в правительстве, так и в частном секторе. ILOG, Oracle Policy Automation, DTRules, Слюни и другие обеспечивают поддержку DSL, предназначенную для поддержки различных проблемных областей. DTRules доходит до определения интерфейса для использования нескольких DSL в наборе правил.

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

Языки статистического моделирования

Разработчики статистического моделирования разработали языки для конкретных предметных областей, такие как р (реализация S язык),Ошибки, Зазубрины, и Стэн. Эти языки предоставляют синтаксис для описания байесовской модели и создают метод ее решения с помощью моделирования.

Создание модели и сервисов на нескольких языках программирования

Создание обработки объектов и сервисов на основе Язык описания интерфейса для предметно-ориентированного языка, такого как JavaScript для веб-приложений, HTML для документации, C ++ для высокопроизводительного кода и т. д. Это делается с помощью кросс-языковых платформ, таких как Apache Thrift или же Буферы протокола Google.

Корнишон

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

Другие примеры

Другие известные примеры предметно-ориентированных языков включают:

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

Некоторые из преимуществ:[2][3]

  • Языки, специфичные для предметной области, позволяют выражать решения на идиомах и на уровне абстракции предметной области. Идея состоит в том, что сами эксперты в предметной области могут понимать, проверять, изменять и часто даже разрабатывать языковые программы для конкретной предметной области. Однако это случается редко.[9]
  • Доменные языки позволяют Проверка на уровне домена. Пока языковые конструкции безопасны, любое предложение, написанное с их помощью, можно считать безопасным.[нужна цитата ]
  • Языки, специфичные для предметной области, могут помочь перенести разработку бизнес-информационных систем от традиционных разработчиков программного обеспечения к обычно более широкой группе экспертов в предметной области, которые (несмотря на меньшие технические знания) имеют более глубокие знания в предметной области.[10]
  • Языки предметной области легче изучать, учитывая их ограниченный объем.

Некоторые из недостатков:

  • Стоимость изучения нового языка по сравнению с его ограниченной применимостью
  • Стоимость разработки, внедрения и поддержки предметно-ориентированного языка, а также инструментов, необходимых для разработки с его помощью (IDE )
  • Поиск, установка и поддержание надлежащего объема.
  • Трудность балансирования компромиссов между предметной спецификой и конструкциями языка программирования общего назначения.
  • Возможная потеря процессора эффективность по сравнению с программным обеспечением, написанным вручную.
  • Распространение подобных нестандартных языков, специфичных для предметной области, например, DSL, используемого в одной страховой компании, по сравнению с DSL, используемым в другой страховой компании.[11]
  • Специалистам нетехнической области может быть сложно самостоятельно писать или изменять программы DSL.[9]
  • Повышенная сложность интеграции DSL с другими компонентами ИТ-системы (по сравнению с интеграцией с языком общего назначения).
  • Низкое количество экспертов в том или ином DSL ведет к увеличению затрат на рабочую силу.
  • Сложнее найти примеры кода.

Инструменты для разработки предметно-ориентированных языков

  • JetBrains MPS это инструмент для разработки предметно-ориентированных языков. Оно использует проекционное редактирование что позволяет преодолевать ограничения языковых парсеров и создавать редакторы DSL, например, с таблицами и диаграммами. Он реализует языково-ориентированное программирование. MPS объединяет среду для определения языка, языковой верстак и интегрированная среда разработки (IDE) для таких языков.[12]
  • Xtext - это программная среда с открытым исходным кодом для разработки языков программирования и предметно-ориентированных языков (DSL). В отличие от стандартных генераторов парсеров, Xtext генерирует не только парсер, но и модель классов для абстрактного синтаксического дерева. Кроме того, он предоставляет полнофункциональную настраиваемую среду IDE на основе Eclipse.[13]
  • Ракетка представляет собой кросс-платформенный языковой набор инструментов, включающий компилятор, JIT-компилятор, IDE и инструменты командной строки, предназначенный для создания как языков, специфичных для предметной области, так и совершенно новых языков.[14][15]

Смотрите также

Рекомендации

  1. ^ Фаулер, Мартин; Парсонс, Ребекка. «Языки, специфичные для домена». Получено 6 июля 2019.
  2. ^ а б Марьян Мерник, Ян Херинг и Энтони М. Слоан. Когда и как разрабатывать предметно-ориентированные языки. Опросы ACM Computing, 37(4):316–344, 2005.Дои:10.1145/1118890.1118892
  3. ^ а б Диомидис Спинеллис. Известные шаблоны проектирования для языков, специфичных для предметной области. Журнал систем и программного обеспечения, 56 (1): 91–99, февраль 2001 г. Дои:10.1016 / S0164-1212 (00) 00089-3
  4. ^ Фелляйзен, Матиас; Финдлер, Роберт Брюс; Флэтт, Мэтью; Кришнамурти, Шрирам; Барзилай, Эли; Маккарти, Джей; Тобин-Хохштадт, Сэм (март 2018 г.). «Программируемый язык программирования». Коммуникации ACM. 61 (3): 62–71. Дои:10.1145/3127323. S2CID  3887010. Получено 15 мая 2019.
  5. ^ "Определение данных Информационным проектом Linux (LINFO)". www.linfo.org. Получено 2016-01-14.
  6. ^ Хайтмейер, К. (1998). «Использование набора инструментов SCR * для определения требований к программному обеспечению» (PDF). Ход работы. 2-й семинар IEEE по формальным методам спецификации промышленной прочности. IEEE. С. 12–13. Дои:10.1109 / WIFT.1998.766290. ISBN  0-7695-0081-1. S2CID  16079058. Архивировано из оригинал (PDF) 19 июля 2004 г.
  7. ^ Шорре, Д. В. (1964). «META II - синтаксически ориентированный язык написания компиляторов». Труды 1964 Национальной конференции ACM 1964: 41.301–41.3011. Дои:10.1145/800257.808896. S2CID  43144779.
  8. ^ Карр, С. Стивен; Лютер, Дэвид А .; Эрдманн, Шериан (1969). "Компилятор-компилятор TREE-META: система мета-компилятора для Univac 1108 и General Electric 645". Технический отчет Университета Юты RADC-TR-69-83.
  9. ^ а б Фройденталь, Маргус (1 января 2009 г.). «Языки предметной области в таможенной информационной системе». Программное обеспечение IEEE: 1. Дои:10.1109 / MS.2009.152.
  10. ^ Арам, Майкл; Нойман, Густав (2015-07-01). «Многоуровневый анализ совместной разработки информационных систем для бизнеса» (PDF). Журнал интернет-служб и приложений. 6 (1). Дои:10.1186 / s13174-015-0030-8. S2CID  16502371.
  11. ^ Миотто, Эрик. «Об интеграции предметных и научных совокупностей знаний в модельно-управляемой инженерии» (PDF). Архивировано из оригинал (PDF) на 2011-07-24. Получено 2010-11-22.
  12. ^ "JetBrains MPS: Создатель предметно-ориентированного языка".
  13. ^ "Xtext".
  14. ^ Tobin-Hochstadt, S .; St-Amour, V .; Culpepper, R .; Flatt, M ​​.; Фелляйзен, М. (2011). «Языки как библиотеки» (PDF). Разработка и реализация языков программирования.
  15. ^ Флатт, Мэтью (2012). «Создание языков в Racket». Коммуникации ACM. Получено 2012-04-08.

дальнейшее чтение

внешняя ссылка

Статьи