Русская Википедия:Предметно-ориентированный язык

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

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

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

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

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

Мартин Уорд (Шаблон:Lang-en)[2] в работе «Language Oriented Programming»Шаблон:Sfn (которая считается отправной точкой развития ЯОП), использовал термины «Шаблон:Lang-en2» и «Шаблон:Lang-en2», но в англоязычном научном сообществе прижился термин «Шаблон:Lang-en2», причём именно «Шаблон:Lang-en2», а не «Шаблон:Lang-en2». В русскоязычной литературе по программированию встречаются варианты «доменно-специфичный», «проблемно-ориентированный», «предметно-ориентированный».

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

Примеры

Ведущие исследователи языково-ориентированного программирования (Мартин Уорд, Шаблон:Iw, Валид Таха и другие) приводят следующие примеры предметно-специфичных языков в качестве классическихШаблон:SfnШаблон:SfnШаблон:Sfn:

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

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

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

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

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

Временами компьютерные языки реализуются зависимым образом, то есть «внутри» транслируемого языка, без которого эти языки не только не способны исполняться, но и зачастую не образуют целостную символьную систему и не обладают Тьюринг-полнотой. Такие языки называются «встраиваемыми предметно-специфичными языками» (Шаблон:Lang-en, Шаблон:Lang-en2; иногда Шаблон:Lang-en2) или просто «встраиваемыми языками» (Шаблон:Lang-en2)Шаблон:SfnШаблон:Sfn, а также «языками, реализованными поверх или на основе данного языка».

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

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

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

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

Шаблон:Details

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

  • ввод в исходный язык дополнительных возможностей, расширяющих спектр эффективно решаемых задач или синтаксически упрощающих решение часто встречаемых задач;
  • интенсивное повторное использование компонентов транслятора базового языка: парсера, механизма типизации, реализации тривиальных вещей (таких как арифметика чисел), оптимизатора и др. Это обеспечивает кратное снижение трудоёмкости реализации придуманного языка, а также высокий уровень качества реализации при использовании безопасного языка в качестве базового;
  • получение возможности эффективно смешивать свойства разных самостоятельных языков в единых фрагментах кода, формируя мультипарадигменный язык широкого профиля, исключая необходимость Шаблон:Iw и расширяя возможности оптимизации.

Наиболее частыми примерами языков первой группы могут служить реализации объектно-ориентированных возможностей в функциональных[6] или процедурных[7] языках, и классическим примером служит язык CLOS. Следует отметить, что термин «язык» здесь используется не всегда — временами говорят просто о «реализации в языке новых возможностей» или о «расширении языка подсистемой, нацеленной на решение определённых задач», и нет строго деления на «библиотеки» и «встраиваемые языки», так как формально любой API, протокол или структура данных может рассматриваться в качестве языкаШаблон:Sfn. Так, например, неотъемлемой частью языка Lisp является встроенный не полный по Тьюрингу язык S-выражений.

Вторая группа встраиваемых языков наиболее полно представлена в сообществе языка Haskell, и потому сам Haskell временами определяют как «DSL для денотационной семантики»Шаблон:Sfn. Примерами могут служить Elm и другие языки, представляющие функциональную реактивную парадигму, а также язык Curry. Временами также встречается похожее выражение в отношении Лиспа: «Lisp — это не язык, а среда для разработки языков». Примером языка, реализованного поверх Лиспа, может служить Шаблон:Iw. Масса встраиваемых мини-языков реализована в языке OCaml посредством модуля Шаблон:Iw компилятора. Язык Rebol также проектировался для программирования посредством интенсивной реализации встраиваемых мини-языков. В диалекте Лиспа Scheme посредством языка S-выражений реализован не полный по Тьюрингу язык Шаблон:Iw, воплощающий протокол XML встраиваемым образом.

Встраиваемый язык может иметь самодостаточную полную по Тьюрингу семантику, но тем не менее вместо независимой реализации повторно использовать компоненты базового языка (третья группа, смешение первых двух). Ярким примером является язык SchelogШаблон:Sfn, реализующий семантику Пролога внутри диалекта Лиспа Scheme посредством продолжений, и превращающий Пролог из «самостоятельного» языка во встраиваемый. Традиционной учебной или «спортивной» задачей для многих функциональных языков служит реализация поверх рассматриваемого языка какого-либо другого, чаще всего языка логики предикатов первого порядкаШаблон:Sfn.

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

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

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

Один из языков (базовый или встраиваемый) может быть визуальным, что нередко применяется в пользовательском программировании (Шаблон:Lang-en). Типичными примерами таких пар могут служить AutoLisp — AutoCAD и VBA — Microsoft Excel. Подобные пары образуют целостную интерактивную систему, и с точки зрения пользователя невозможно (и не нужно) определить, являются ли визуальные инструменты надстройкой, имитирующей команды встроенного текстового языка, или же текстовый язык управляет визуальными инструментами. Действительные взаимоотношения в этих парах определяются разработчиком.

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

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

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

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

Шаблон:Основная статья

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

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

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

См. также

Примечания

Шаблон:Примечания

Литература

Ссылки