Язык, специфичный для предметной области

Из Википедии, бесплатной энциклопедии

Доменно -ориентированный язык ( 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 , обычно являются языками моделирования общего назначения.

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

Языковые темы, специфичные для предметной области [ править ]

Внешние и встроенные языки, специфичные области предметной для

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

Шаблоны использования [ править ]

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

  • Обработка с помощью автономных инструментов, вызываемых посредством прямых операций пользователя, часто из командной строки или из файла Makefile (например, grep для сопоставления регулярных выражений, sed, lex, yacc, набора инструментов GraphViz и т. д.).
  • Специализированные для предметной области языки, которые реализованы с использованием макросистем языка программирования и которые преобразуются или расширяются в основной язык общего назначения во время компиляции или в реальном времени.
  • встроенный предметно-ориентированный язык ( eDSL ), [4] реализованы в виде библиотек, которые используют синтаксис основного языка общего назначения или его подмножества при добавлении языковых элементов, специфичных для предметной области (типы данных, подпрограммы, методы, макросы и т. д.). (например , jQuery , React , Embedded SQL , LINQ )
  • Специализированные для предметной области языки, которые вызываются (во время выполнения) из программ, написанных на языках общего назначения, таких как C или Perl , для выполнения определенной функции, часто возвращая результаты операции на «хост» язык программирования для дальнейшей обработки; как правило, интерпретатор или виртуальная машина для предметно-ориентированного языка встроена в хост-приложение (например, строки формата , механизм регулярных выражений )
  • Специализированные для предметной области языки, которые встроены в пользовательские приложения (например, макроязыки в электронных таблицах) и которые (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 также имеет собственный язык конфигурации .

Язык GameMaker [ править ]

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

Язык разметки ColdFusion [ править ]

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

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

Эрланг OTP [ править ]

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

FilterMeister [ править ]

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

Шаблоны MediaWiki [ править ]

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

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

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

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

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

Метакомпиляторы [ править ]

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

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

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

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.

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

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

Генерация модели и сервисов для нескольких языков программирования [ править ]

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

Корнишон [ править ]

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

Другие примеры [ править ]

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

Преимущества и недостатки [ править ]

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

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

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

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

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

  • JetBrains MPS — это инструмент для разработки предметно-ориентированных языков. Он использует проекционное редактирование , которое позволяет преодолеть ограничения языковых анализаторов и создавать редакторы DSL, например, с таблицами и диаграммами. Он реализует языково-ориентированное программирование. MPS сочетает в себе среду определения языка, языковую среду и интегрированную среду разработки (IDE) для таких языков. [11]
  • MontiCore — это языковая среда для эффективной разработки предметно-ориентированных языков. Он обрабатывает расширенный формат грамматики, определяющий DSL, и генерирует компоненты Java для обработки документов DSL. [12]
  • Xtext — это программная среда с открытым исходным кодом для разработки языков программирования и предметно-ориентированных языков (DSL). В отличие от стандартных генераторов синтаксических анализаторов, Xtext генерирует не только анализатор, но и модель классов для абстрактного синтаксического дерева. Кроме того, он предоставляет полнофункциональную настраиваемую интегрированную среду разработки на базе Eclipse. [13] Проект был заархивирован в апреле 2023 года.
  • Racket  — это кроссплатформенный набор языковых инструментов, включающий собственный код, JIT-компилятор и компилятор Javascript, IDE (в дополнение к поддержке Emacs, Vim, VSCode и других) и инструменты командной строки, предназначенные для создания языков как предметной области, так и общего назначения. [14] [15]

См. также [ править ]

Ссылки [ править ]

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

Дальнейшее чтение [ править ]

Внешние ссылки [ править ]

Статьи