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

Материал из Википедии — свободной энциклопедии
Парадигмы программирования

Предметно-ориентированный язык (англ. domain-specific language, DSL — «язык, специфический для предметной области») — компьютерный язык, специализированный для конкретной области применения (в противоположность языку общего назначения, применимому к широкому спектру областей и не учитывающему особенности конкретных сфер знаний). Построение такого языка и/или его структура данных отражают специфику решаемых с его помощью задач[1]. Является ключевым понятием языково-ориентированного программирования.

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

LCF. Примером, показывающим условность классификации, служит язык БНФ (и компилятор с него Lex/Yacc): с одной стороны, это яркий пример метаязыка
, с другой — он предназначен для одной конкретной задачи.

Терминология

Простейшие предметно-ориентированные языки, используемые в одном конкретном приложении, часто называют «мини-языками»[2].

Мартин Уорд (англ. Martin Ward)[3] в работе «Language Oriented Programming»[4] (которая считается отправной точкой развития ЯОП), использовал термины «problem oriented» и «domain oriented», но в англоязычном научном сообществе прижился термин «domain-specific», причём именно «domain-specific language», а не «domain-specific programming language». В русскоязычной литературе по программированию встречаются варианты «доменно-специфичный», «проблемно-ориентированный», «предметно-ориентированный».

Фаулер[5] и Дмитриев[6] определяют понятие DSL как «урезанный язык программирования (в большинстве случаев неполный по Тьюрингу)».

Примеры

Ведущие исследователи языково-ориентированного программирования (Мартин Уорд, Пол Хьюдак[англ.], Валид Таха и другие) приводят следующие примеры предметно-специфичных языков в качестве классических[4][7][8]:

По мнению Валида Тахи, с позиции ЯОП Microsoft Excel оказывается едва ли не наиболее широко применяемым в мире языком программирования[8].

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

JCL и др.)[9], неполные по Тьюрингу языки структурирования данных (XML, .ini, .conf), язык вики-разметки, языки моделирования (UML, GPSS), Erlang
для многопользовательских серверов, функционирующих в бесперебойном режиме.

Существуют языки программирования, встроенные в систему управления ресурсами предприятия (язык ABAP в SAP/R3, языки систем Галактика, Парус, , Инфо-Бухгалтер)[источник не указан 3050 дней] и применяемые для их дополнения специфичными для конкретной организации модулями. Использование встроенного языка упрощает программирование специфичных задач, поскольку в языке изначально присутствуют понятия предметной области. Некоторые[какие?] геоинформационные системы и САПР также имеют встроенные языки программирования.

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

Встраиваемые языки

Временами компьютерные языки реализуются зависимым образом, то есть «внутри» транслируемого языка, без которого эти языки не только не способны исполняться, но и зачастую не образуют целостную символьную систему и не обладают Тьюринг-полнотой. Такие языки называются «встраиваемыми предметно-специфичными языками» (англ. embedded DSL, EDSL; иногда DSEL) или просто «встраиваемыми языками» (embedded language)[7][10], а также «языками, реализованными поверх или на основе данного языка».

Текстовые языки

В дополнение к традиционному делению языков на интерпретируемые и компилируемые, встраиваемые языки вводят ещё несколько видов реализации языка:

  • чистое встраивание[7];
  • использование макросредств языка (и нередко отождествление их с термином «метапрограммирование»), которое, в свою очередь, подразделяется на[11]:
    • многостадийные вычисления (англ. multistage computations);
    • квазицитирование (известное из языка
      Lisp
      );
    • использование шаблонов.

С другой стороны, можно рассматривать реализацию встраиваемого языка как «реализацию без трансляции», подразумевая, что DSL будет являться синтаксическим и семантическим подмножеством языка, в который он встраивается[11].

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

Основных причин для разработки встраиваемых текстовых языков три:

Наиболее частыми примерами языков первой группы могут служить реализации

Lisp является встроенный не полный по Тьюрингу язык S-выражений
.

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

Scheme посредством языка S-выражений реализован не полный по Тьюрингу язык SXML[англ.], воплощающий протокол XML
встраиваемым образом.

Встраиваемый язык может иметь самодостаточную

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

В контексте метаязыков самостоятельные языки временами называют «языками первого класса» (по аналогии с сущностями первого класса в языках), а встраиваемые — «объектными языками».

В подавляющем большинстве случаев встраиваемые языки имеют лишь одну поддерживаемую реализацию, и различия в результирующем машинном представлении кода на них зависят лишь от используемого транслятора базового языка. Однако, бывают и исключения — например, язык Concurrent ML (CML), расширяющий Standard ML конструкциями для явного параллелизма, имеет две принципиально различные реализации.

Визуальные языки

Один из языков (базовый или встраиваемый) может быть

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

В паре Emacs — Emacs Lisp отношения более определённые. Лисп традиционно относится к метаязыкам, и в данном случае текстовый редактор надстраивается над ним как визуальный DSL, что и делает последний изменяемым и расширяемым.

В случае, когда оба языка являются визуальными, встраиваемые языки обычно называют иными терминами — плагинами, фильтрами и др., и не используют терминологию языково-ориентированного программирования. Формально же можно говорить, например, что для визуального мета-языка обработки графики Adobe Photoshop есть множество встраиваемых визуальных мини-языков (см. Photoshop plugin[англ.]).

Функциональные и логические языки программирования выглядят неестественно в визуальном окружении, так как функциональное программирование и логическое программирование в чистом виде запрещают побочные эффекты, и для взаимодействия с GUI; их концептуальную целостность приходится нарушать. С педагогической точки зрения считается желательным преподавание программирования с использованием консольных средств, чтобы сосредоточить внимание студентов на основах алгоритмизации, а не эргономики и тем более не процедурных навыков использования тех или иных IDE[17].

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

Преимущества и недостатки использования в конкретной задаче конкретного DSL вместо языка общего назначения определяются гораздо явственнее, чем преимущества и недостатки использования одного языка общего назначения вместо другого: в большинстве случаев уже разработанный DSL оказывается концептуально неприменим к одним задачам и даёт бесспорный выигрыш по большинству показателей качества в других, а некоторые подзадачи вообще остаются нерешёнными до разработки DSL[4].

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

При рассмотрении вопроса о создании DSL можно рассмотреть следующие варианты в порядке уменьшения затрат на разработку[18]:

См. также

Примечания

  1. А. Я. Фридланд, Л. С. Чанамирова. Информатика и компьютерные технологии: основные термины : толковый словарь. — Астрель, 2003.01.01. — 270 с. — ISBN 9785170145461.
  2. Bentley - Little languages, 1986.
  3. Martin Ward’s Homepage
  4. 1 2 3 Ward - Language Oriented Programming, 1994.
  5. Мартин Фаулер. Языковой инструментарий: новая жизнь языков предметной области. — 2005. Архивировано 26 декабря 2013 года.
  6. RSDN Magazine. — 2005. Архивировано
    23 марта 2010 года.
  7. 1 2 3 4 Hudak - Modular Domain Specific Languages and Tools, 1998.
  8. 1 2 Taha - Domain-Specific Languages, 2008.
  9. Brett D. Hirsch. Digital Humanities Pedagogy: Practices, Principles and Politics. — Open Book Publishers, 2012. — 450 с. — ISBN 9781909254251.
  10. Mernik, 2012.
  11. 1 2 Czarnecki, O’Donnell, Striegnitz, Taha - DSL implementation in metaocaml, template haskell, and C++, 2004.
  12. Bernard Berthomieu. OO Programming Styles in ML. — LAAS Report #2000111, Centre National De La Recherche Scientifique Laboratoire d'Analyse et d'Architecture des Systèmes, 2000. Архивировано 26 сентября 2013 года.
  13. Cello — library that introduces higher level programming to C
  14. Хопкрофт, Мотвани, Ульман - Теория автоматов, языков и вычислений, 2001.
  15. Schelog, 2003.
  16. Paulson - ML for the Working Programmer, 1996.
  17. Игорь Головин, Андрей Столяров. Мультипарадигмальный подход к преподаванию программирования и роль свободного ПО // МГУ имени Ломоносова, Тезисы докладов II конференции разработчиков свободных программ "На Протве". — город Обнинск, 2005.
  18. Jugel, 2010.

Литература

Ссылки