Предметно-ориентированный язык
Предметно-ориентированный язык (англ. domain-specific language, DSL — «язык, специфический для предметной области») — компьютерный язык, специализированный для конкретной области применения (в противоположность языку общего назначения, применимому к широкому спектру областей и не учитывающему особенности конкретных сфер знаний). Построение такого языка и/или его структура данных отражают специфику решаемых с его помощью задач[1]. Является ключевым понятием языково-ориентированного программирования.
Строго говоря, деление языков программирования на языки общего назначения и предметно-ориентированные весьма условно, особенно, если учесть, что
Терминология
Простейшие предметно-ориентированные языки, используемые в одном конкретном приложении, часто называют «мини-языками»[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]:
- компьютерной вёрстки) текстовых документов;
- Perl для манипулирования текстами;
- СУБД;
- Tcl/Tk для графического интерфейса пользователя;
- HTML и SGML для разметки документов;
- Verilog и VHDL для описания аппаратного обеспечения;
- Mathematica и Maple для символьных вычислений;
- AutoLisp для компьютерного моделирования (САПР);
- исчисления предикатов;
- ML и Haskell для задач, сформулированных в терминах функций (Haskell временами определяется как DSL для денотационной семантики[англ.]).
По мнению Валида Тахи, с позиции ЯОП Microsoft Excel оказывается едва ли не наиболее широко применяемым в мире языком программирования[8].
Другими примерами предметно-ориентированных языков служат языки управления базами данных (помимо
Существуют языки программирования, встроенные в систему управления ресурсами предприятия (язык ABAP в SAP/R3, языки систем Галактика, Парус, 1С, Инфо-Бухгалтер)[источник не указан 3050 дней] и применяемые для их дополнения специфичными для конкретной организации модулями. Использование встроенного языка упрощает программирование специфичных задач, поскольку в языке изначально присутствуют понятия предметной области. Некоторые[какие?] геоинформационные системы и САПР также имеют встроенные языки программирования.
Другие примеры:
- G-код — язык программирования устройств с числовым программным управлением (ЧПУ);
- ЯМБ.
Встраиваемые языки
Временами компьютерные языки реализуются зависимым образом, то есть «внутри» транслируемого языка, без которого эти языки не только не способны исполняться, но и зачастую не образуют целостную символьную систему и не обладают Тьюринг-полнотой. Такие языки называются «встраиваемыми предметно-специфичными языками» (англ. embedded DSL, EDSL; иногда DSEL) или просто «встраиваемыми языками» (embedded language)[7][10], а также «языками, реализованными поверх или на основе данного языка».
Текстовые языки
В дополнение к традиционному делению языков на интерпретируемые и компилируемые, встраиваемые языки вводят ещё несколько видов реализации языка:
- чистое встраивание[7];
- использование макросредств языка (и нередко отождествление их с термином «метапрограммирование»), которое, в свою очередь, подразделяется на[11]:
С другой стороны, можно рассматривать реализацию встраиваемого языка как «реализацию без трансляции», подразумевая, что DSL будет являться синтаксическим и семантическим подмножеством языка, в который он встраивается[11].
Язык, используемый в качестве базового для реализации другого, часто называют метаязыком.
Основных причин для разработки встраиваемых текстовых языков три:
- ввод в исходный язык дополнительных возможностей, расширяющих спектр эффективно решаемых задач или синтаксически упрощающих решение часто встречаемых задач;
- интенсивное парсера, механизма типизации, реализации тривиальных вещей (таких как арифметика чисел), оптимизатора и др. Это обеспечивает кратное снижение трудоёмкости реализации придуманного языка, а также высокий уровень качества реализации при использовании безопасногоязыка в качестве базового;
- получение возможности эффективно смешивать свойства разных самостоятельных языков в единых фрагментах кода, формируя мультипарадигменный язык широкого профиля, исключая необходимость межъязыкового взаимодействия[англ.]и расширяя возможности оптимизации.
Наиболее частыми примерами языков первой группы могут служить реализации
Вторая группа встраиваемых языков наиболее полно представлена в сообществе языка
Встраиваемый язык может иметь самодостаточную
В контексте метаязыков самостоятельные языки временами называют «языками первого класса» (по аналогии с сущностями первого класса в языках), а встраиваемые — «объектными языками».
В подавляющем большинстве случаев встраиваемые языки имеют лишь одну поддерживаемую реализацию, и различия в результирующем машинном представлении кода на них зависят лишь от используемого транслятора базового языка. Однако, бывают и исключения — например, язык Concurrent ML (CML), расширяющий Standard ML конструкциями для явного параллелизма, имеет две принципиально различные реализации.
Визуальные языки
Один из языков (базовый или встраиваемый) может быть
В паре Emacs — Emacs Lisp отношения более определённые. Лисп традиционно относится к метаязыкам, и в данном случае текстовый редактор надстраивается над ним как визуальный DSL, что и делает последний изменяемым и расширяемым.
В случае, когда оба языка являются визуальными, встраиваемые языки обычно называют иными терминами — плагинами, фильтрами и др., и не используют терминологию языково-ориентированного программирования. Формально же можно говорить, например, что для визуального мета-языка обработки графики Adobe Photoshop есть множество встраиваемых визуальных мини-языков (см. Photoshop plugin[англ.]).
Функциональные и логические языки программирования выглядят неестественно в визуальном окружении, так как функциональное программирование и логическое программирование в чистом виде запрещают побочные эффекты, и для взаимодействия с GUI; их концептуальную целостность приходится нарушать. С педагогической точки зрения считается желательным преподавание программирования с использованием консольных средств, чтобы сосредоточить внимание студентов на основах алгоритмизации, а не эргономики и тем более не процедурных навыков использования тех или иных IDE[17].
Преимущества и недостатки
Преимущества и недостатки использования в конкретной задаче конкретного DSL вместо языка общего назначения определяются гораздо явственнее, чем преимущества и недостатки использования одного языка общего назначения вместо другого: в большинстве случаев уже разработанный DSL оказывается концептуально неприменим к одним задачам и даёт бесспорный выигрыш по большинству показателей качества в других, а некоторые подзадачи вообще остаются нерешёнными до разработки DSL[4].
Таким образом, вопрос о преимуществах и недостатках корректнее ставить в свете применения языково-ориентированной методологии вместо какой-либо другой при изначальном отсутствии готового DSL, сопоставляя потенциальный выигрыш от его использования с затратами на его разработку и сопровождение.
При рассмотрении вопроса о создании DSL можно рассмотреть следующие варианты в порядке уменьшения затрат на разработку[18]:
- Внешний язык со своим синтаксисом, отдельный от кода исходного языка. Может требовать поддержки от IDE и текстовых редакторов.
- Внутренний язык, который строится на основе синтаксиса исходного языка и модулей, классов, методов, функций обычной библиотеки
- интерфейсом программирования приложений (API). Такой подход позволяет повторно использоватькод другой библиотеки с определённой в ней семантикой предметной области.
См. также
- Пользовательское программирование
- Языково-ориентированное программирование
- Порождающее программирование
Примечания
- ↑ А. Я. Фридланд, Л. С. Чанамирова. Информатика и компьютерные технологии: основные термины : толковый словарь. — Астрель, 2003.01.01. — 270 с. — ISBN 9785170145461.
- ↑ Bentley - Little languages, 1986.
- ↑ Martin Ward’s Homepage
- ↑ 1 2 3 Ward - Language Oriented Programming, 1994.
- ↑ Мартин Фаулер. Языковой инструментарий: новая жизнь языков предметной области. — 2005. Архивировано 26 декабря 2013 года.
- RSDN Magazine. — 2005. Архивировано23 марта 2010 года.
- ↑ 1 2 3 4 Hudak - Modular Domain Specific Languages and Tools, 1998.
- ↑ 1 2 Taha - Domain-Specific Languages, 2008.
- ↑ Brett D. Hirsch. Digital Humanities Pedagogy: Practices, Principles and Politics. — Open Book Publishers, 2012. — 450 с. — ISBN 9781909254251.
- ↑ Mernik, 2012.
- ↑ 1 2 Czarnecki, O’Donnell, Striegnitz, Taha - DSL implementation in metaocaml, template haskell, and C++, 2004.
- ↑ 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 года.
- ↑ Cello — library that introduces higher level programming to C
- ↑ Хопкрофт, Мотвани, Ульман - Теория автоматов, языков и вычислений, 2001.
- ↑ Schelog, 2003.
- ↑ Paulson - ML for the Working Programmer, 1996.
- ↑ Игорь Головин, Андрей Столяров. Мультипарадигмальный подход к преподаванию программирования и роль свободного ПО // МГУ имени Ломоносова, Тезисы докладов II конференции разработчиков свободных программ "На Протве". — город Обнинск, 2005.
- ↑ Jugel, 2010.
Литература
- Martin Ward. Language Oriented Programming. — Computer Science Department, Science Labs, 1994.
- Paul Hudak. Modular Domain Specific Languages and Tools. — IEEE Computer Society Press, Department of Computer Science, Yale University, 1998. Архивировано 17 октября 2013 года.
- Jon Bentley. Little languages. — CACM, 29(8):711–721, 1986.
- Walid Taha. Domain-Specific Languages. — Department of Computer Science, Rice University, 2008. Архивировано 24 октября 2013 года.
- Marjan Mernik. Formal and Practical Aspects of Domain-Specific Languages. — IGI Global, 2012. — ISBN 978-1-4666-2092-6.
- Джон Хопкрофт, Раджив Мотвани, Джеффри Ульман. Введение в теорию автоматов, языков и вычислений. — 2-е. — Cornell University, Stanford University: Addison-Wesley Publishing Company, Издательский дом «Вильямс», 2001. — 528 с. — ISBN 5-8459-0261-4 (рус.), 0-201-44124-1 (англ.).
- Lawrence C. Paulson. ML for the Working Programmer. — 2nd. — Cambridge, Great Britain: Cambridge University Press, 1996. — 492 с. — ISBN 0-521-57050-6 (твёрдый переплёт), 0-521-56543-X (мягкий переплёт).
- K. Czarnecki, J. O’Donnell, J. Striegnitz, W. Taha. DSL implementation in metaocaml, template haskell, and C++. — University of Waterloo, University of Glasgow, Research Centre Julich, Rice University, 2004. Архивировано 5 марта 2016 года.
- Jugel, U. (2010). "Generating Smart Wrapper Libraries for Arbitrary APIs". Software Language Engineering. SLE 2009. Lecture Notes in Computer Science. 5969. Springer, Berlin, Heidelberg. doi:10.1007/978-3-642-12107-4_24.
{{cite journal}}
: Неизвестный параметр|editors=
игнорируется (|editor=
предлагается) (справка)
Ссылки
- Dorai Sitaram. Programming in Schelog (2003). Дата обращения: 18 октября 2013. Архивировано из оригинала 8 мая 2013 года.
- Compilers and interpreters implemented in Haskell . Дата обращения: 7 апреля 2014. Архивировано 3 апреля 2014 года.
- Stumbling Blocks For Domain Specific Languages . Дата обращения: 20 января 2018. Архивировано 20 января 2018 года.