Что такое dsl в программировании
Перейти к содержимому

Что такое dsl в программировании

  • автор:

Создание предметно-ориентированных яыков Текст научной статьи по специальности «Языкознание и литературоведение»

Аннотация научной статьи по языкознанию и литературоведению, автор научной работы — Павлов Дмитрий Алексеевич

Статья описывает подходы к созданию языков, ориентированных на конкретную предметную область. Такие языки называются предметно-ориентированными языками (DSL), и их принято отличать от более известных языков общего назначения. Статья освещает преимущества использования DSL и даёт обзор современных технологий для их создания.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по языкознанию и литературоведению , автор научной работы — Павлов Дмитрий Алексеевич

Обзор современных средств создания и поддержки предметно-ориентированных языков программирования
Разработка языка программирования на Racket
Исследование и разработка языкового инструментария на основе peg-грамматики
Вероятностные методы оценки параметров изображения по существованию регулярных структур из пикселей

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

i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

The article gives a brief introduction to creation of languages that are designed for a particular application domain. Such languages are called domain-specific (DSL), and are treated differently from (more widespread) general-purpose languages. The article presents the advantages of using DSL-s in programming and gives a list of modern platforms for building them.

Текст научной работы на тему «Создание предметно-ориентированных яыков»

Павлов Дмитрий Алексеевич

Статья описывает подходы к созданию языков, ориентированных на конкретную предметную область. Такие языки называются предметно-ориентированными языками (DSL), и их принято отличать от более известных языков общего назначения. Статья освещает преимущества использования DSL и даёт обзор современных технологий для их создания.

Ключевые слова: предметно-ориентированный язык, парсинг, компиляция.

Предметно-ориентированный язык программирования (англ. domain-specific language, DSL) — это язык, предназначенный для решения узкого круга задач; противоположностью ему является язык общего назначения. Примеры: C# — язык общего назначения, а язык регулярных выражений — это предметно-ориентированный язык. Предметно-ориентированные языки рождаются на свет по разным причинам:

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

• Неуклюжесть языков общего назначения нередко заставляет разработчиков на этих языках придумывать свои маленькие, более выразительные языки. Это относится к различным скриптовым языкам в компьютерных играх, написанных на C++. Также у программ на C, C++, C#, Java практически

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

• Исторические причины. Примером являются математические программы, такие как Mathematica и Maxima. Язык математики складывался веками, и появление компьютеров в нём мало что изменило.

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

1 Внушающим уважение исключением является известный в узких кругах оконный менеджер для X11 под названием dwm (http://ru.wikipedia.org/wiki/Dwm). Параметры конфигурации dwm записаны непосредственно в .h-файле, и изменения параметров вступают в силу только после пересборки и перезапуска dwm.

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

Итак, вы сочинили предметно-ориентированный язык, описали его грамматику, продумали семантику, а дальше что? Как получить транслятор, отладчик, где взять удобную среду для написания кода на этом DSL? Не самому же всё делать с нуля. Вот об этом и речь.

Прежде всего, надо определиться: DSL или EDSL? Второй вариант, который расшифровывается как «встроенный предметно-ориентированный язык» (embedded DSL, или internal DSL), сделает вашу жизнь значительно легче. Вы выбираете язык общего назначения, для которого все средства разработки уже сделаны до вас, и создаёте свой язык как надстройку над первым, оставаясь в рамках его грамматики. Фактически, вы делаете библиотеку. Само собой, если изначальный язык (хост-язык) недостаточно гибок в плане грамматических конструкций, то и от DSL особенного удобства ждать не приходится. Тем не менее, можно на Ruby1, C#2, Scala3 создавать вполне удобные EDSL. Даже на C++ с шаблонами можно создавать совершенно потрясающие вещи4.

Вообще говоря, если вы выбрали EDSL, то есть готовы жертвовать грамматикой языка ради готовых средств разработки, то почему бы не жертвовать до конца. Откажитесь от грамматики и задавайте программу сразу как экземпляр метамодели (что принято называть абстрактным синтаксическим деревом, хотя оно не абстрактное, да и к синтаксису отношения не имеет). Возьмите платформу, которая заточена под работу с такими программами. Речь, конечно, о семействе лиспов (Common Lisp, Scheme, Clojure). Никакого синтаксиса, кроме простейших S-выражений. Динамическая типи-

зация. Система компилируемых макросов. Культура инкрементальной разработки. Лис-пам нет равных в быстроте и удобстве создания EDSL. В знаменитой книге «Структура и интерпретация компьютерных программ» (SICP) мини-языки в рамках Scheme создаются практически под каждую задачу и даже без использования макросов.

Мы подошли к месту, когда нельзя не упомянуть JetBrains MPS. Это весьма оригинальная вещь. В компании, где пишут среды разработки для мейнстримных языков программирования, зародилась идея создания IDE для создания IDE для создания DSL, по качеству аналогичных мейнстримным. С автодополнениями, рефакторингами, удобными отладчиками. В лиспе отсутствует культура автодополнений и рефакторинга, не развит статический анализ кода, непривычный разработчикам «скобочный» синтаксис. Лисп не годился. Пара вещей, однако, была заимствована из него: отказ от синтаксиса и макросы. Первое было даже не просто заимствовано, а доведено до абсолюта. В MPS нет ни парсера S-выражений, ни какого-либо другого парсера, потому что в MPS нет кода. Редактор MPS работает не с кодом, а непосредственно с экземпляром метамодели. В целях облегчения перехода разработчиков на данную технологию редактор напоминает текстовый, декорируя и отображая дерево так, что оно выглядит как код, но им не является. Инструментов для импорта кода MPS не предоставляет (за исключением кода на Java5). Что касается макросов для кодоге-нерации в MPS, то они там завязаны на строгую систему типов, что позволяет автоматически делать статическую проверку типов для создаваемого DSL.

Многие говорят, что MPS — это переизобретение Лиспа, и они неправы. Скорее, MPS — это скачок к визуальному метапрог-раммированию будущего, что не означает, однако, что этот скачок удачный. Время покажет. Возможно, молодое поколение будет

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

очаровано визуальной средой MPS и автодополнениями. С другой стороны, им может помешать изолированность MPS от мира текстовых программ, так как сейчас практически все языки текстовые. Их также может отпугнуть тотальная бюрократизация всего процесса программирования, что неудивительно, при том, что MPS основана на платформе Java. В общем, выбор делать им, а мы идём дальше, рассматривая тот случай, когда вам нужен именно текстовый DSL со своей уникальной грамматикой.

Итак, вы желаете реализовать настоящий DSL. С транслятором проблем не будет -связка lex+yacc, портированная, кажется, на все платформы в мире, уже лет 40 выполняет задачу автоматического построения пар-серов. Для грамматик, которым не хватает yacc, есть другие инструменты. Но отладчик и IDE придётся писать самостоятельно. Если только не. найти хост-язык с настраиваемой грамматикой и взять существующую IDE для него, если она не сломается от введения новой грамматики. Фактически, получится EDSL, но без ограничений на синтаксис, которые накладывались бы нерасширя-емым хост-языком. Этот подход называется «extensible programming»; он был довольно популярен в 1960-х, потом угас, но разгорелся с новой силой в XXI веке. Поэтому живых языков с настраиваемой грамматикой не очень много.

• Forth — старейший из таких языков. Отличается тем, что «своей» грамматики практически не имеет. Таков же его преемник Factor. Программирование на Forth, однако, может оказаться не таким простым даже для опытных программистов1.

• Common Lisp отметился и здесь. Помимо defmacro, которые используются для создания «скобочных» EDSL, о которых

было сказано выше, в CL есть так называемые макросы ридера (reader macros), которые позволяют изменить поведение ридера, то есть расширить синтаксис. Чтобы не конфликтовать со стандартным синтаксисом CL, reader macros обычно начинаются с «#», хотя могут начинаться и с любого другого символа. Например, #c(0, 1) — запись мнимой единицы одним из стандартных макросов CL. Известны примеры более интересных макросов: запуск команд оболочки прямо из CL2, вызов C-функций3, синтаксис для хеш-таблиц4, расширенный синтаксис строк5, и даже встраивание XML6 непосредственно в лисповый код. Однако, если синтаксис вашего DSL конфликтует с синтаксисом S-выражений, то дело может оказаться труднее. В теории ничто не мешает изменить стандартный ридер на собственный, но рабочих примеров такой модификации не известно; кроме того, неизвестно, как на такой шаг отреагирует ваша IDE (как правило, это SLIME). Похоже, никто серьёзно не занимался вопросом создания языков с нестандартной грамматикой в CL.

• Racket — бывшая PLT Scheme — совсем другое дело. Платформа «из коробки» поддерживает концепцию переключения между разными языками и позволяет создавать новые языки, используя при этом генератор парсеров в стиле yacc. Есть примеры «нескобочных» языков, созданных на Racket, по мотивам Prolog7 и Algol 608. Среда (DrRacket) и её отладчик работают с этими языками. Более того, DrRacket написан на Racket же, что открывает возможности для модификации среды под язык и распространения её в качестве IDE для вашего DSL. Словом, Racket — очень перспективная платформа для создания DSL и поддерживается в прекрасном состоянии.

2 https:// github .com/j fm3/shellshock

8 http://en.wikipedia.org/wiki/Racket features#Algol

• Nemerle — статически типизированный язык для .NET с макросами и расширяемым синтаксисом. Возможности расширения, однако, ограничены. Есть проект Nemerle 2, в котором ограничения будут сняты и который обещает стать чем-то вроде MPS для .NET (но без отказа от грамматик). Пока, впрочем, дальше обещаний дело не зашло.

• Bigloo — ещё одна реализация Scheme с упором на быстродействие. Так же, как и Racket, обладает средствами генерации пар-серов и поддерживает макросы, однако не имеет такого удобного механизма переключения языков и создания новых. Кроме того, не факт, что отладчик Bigloo и его IDE (основанное на Emacs) будут нормально работать с новыми языками, ибо, как и с CL, вряд ли кто-то специально занимался этим вопросом, а само собой ничего не делается.

• Helvetia — уникальная в своём роде разработка на базе языка Smalltalk, в которой используется то обстоятельство, что вся среда Smalltalk (включая парсер) поддаётся изменению в рантайме. Helvetia — инструмент

для произвольного расширения синтаксиса Smalltalk с сохранением отладки. И даже с подсветкой и автодополнением! Что делает MPS не совсем уникальной средой. Примеры1 включают SQL и что-то похожее на CSS. Единственная неприятность — единственный автор Helvetia защитил по ней PhD, ушёл работать в Google и забросил своё творение, лишь изредка возвращаясь и доделывая мелочи. Helvetia работает только на Pharo Smalltalk версии 1.1 и не портирована ни на современную версию Pharo (1.3), ни на Squeak. Кстати, автор в 2009 г. выбрал2 в качестве хост-языка Smalltalk (а не Lisp) по причине «однородности» языка и среды. Среды разработки Smalltalk написаны на Smalltalk, а про Scheme или CL такого сказать было нельзя. DrRacket в то время был наполовину написан на C++, и его переписали на чистом Racket только в феврале 2011 г.

Как видите, в принципе есть инструменты на любой вкус и под любые требования. В наше время создавать DSL стало не только полезно, но и приятно.

The article gives a brief introduction to creation of languages that are designed for a particular application domain. Such languages are called domain-specific (DSL), and are treated differently from (more widespread) general-purpose languages. The article presents the advantages of using DSL-s in programming and gives a list of modern platforms for building them.

Keywords: domain-specific language, parsing, compilation.

© Наши авторы, 2011. Our authors, 2011.

Павлов Дмитрий Алексеевич, преподаватель ФМЛ№ 30, dmitry.pavlov@gmail.com

Что такое dsl в программировании

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

DSL — ветвь модельного движения, которая связана с понятием предметно-специфичного языка, обеспечивающего применяемый экспертами метод описания для получения предметно-специфичной группы описаний. DSL объединяет (концептуальную) метамодель и (графическую и/или текстовую) нотацию. Это отличается от MDA, в которой предписываются нотации и метамодели, основанные только на MOF/UML. Тем самым программисты должны обеспечивать отдельную интерактивную среду разработки (IDE, interactive development environment) для каждого DSL, а затем эксперты-непрограммисты будут использовать эти предметно-специфичные IDE для моделирования их систем.

DSL и САПР

Все САПР могут быть рассмотрены как наборы таких IDE для инженерных предметно-специфичных языков (например, диаграмм P&ID для моделирования гидравлических систем). Если мы хотим создать модель завода непрерывного цикла (например, нефтеперерабатывающего завода), то предстоит трудный выбор между моделированием гидравлических систем в MDA/SysML и традиционным P&ID-моделированием. Предметно-специфические языки современных САПР легко выигрывают. Но потом мы все равно должны объединить все эти несовместимые между собой модели на разных DSL в одну связанную модель завода.

Связанность наборов DSL

Есть две возможности предоставить такую связанность для зоопарка различных DSL:

  1. Онтологическое совмещение (mapping) метамоделей различных DSL, и тем самым совмещение моделей в датацентрическом репозитории моделей.
  2. Использование языковых рабочих мест (language workbenches).

Онтологическое совмещение

Онтологическое совмещение сегодня используется всеми основными поставщиками САПР, хотя при этом используются разные «верхние» (upper) онтологии и предметные таксономии:

  • ISO 15926 для непрерывных производств,
  • ISO 18269/PSL для (в том числе бизнес) процессов,
  • ISO 16739/BIM для строительства и т.д.

Это хорошая возможность справиться с зоопарком устаревших систем, которые поддерживают «старые добрые предметно-специфичные языки инженерного моделирования». Онтологическое совмещение — относительно недавнее движение (начавшееся с работ 1994г. по созданию модели данных перерабатывающих производств Shell[1]), его корни лежат в моделировании данных при разработке программных средств. Те, кто воспринял этот онтологический подход, двигаются сегодня к применению уже готовых инструментов семантического веба[2] и вдобавок к исключительно моделированию данных и интеграции данных начинают эксперименты по логическому выводу (reasoning), таким образом обеспечивая «исполнение» («executing») онтологических моделей. Интересно, что UML не слишком распространен в онтологических кругах, а OMG озабочена совмещением (mapping) метамоделей MDA/MOF и разработанных вне OMG «верхних» и «средних» онтологий (http://www.omg.org/ontology). Нужно заметить, что большинство онтологов (или модельеров данных) вышли из программистов, программных аналитиков и архитекторов баз данных, т.е. из областей, которые де факто сейчас часть программной инженерии, а не системной инженерии.

Языковые рабочие места

Языковые рабочие места — это новые IDE, специально посвященные созданию связанных наборов DSL (http://martinfowler.com/articles/languageWorkbench.html). Эту парадигму для разработки программных средств пробуют сейчас не слишком много разработчиков (http://martinfowler.com/bliki/IntentionalSoftware.html). Разработка «языконезависимого интерпретатора/компилятора» и «языконезависимого (в т.ч. графического) редактора» является очень сложной задачей. Зато перспективы очень заманчивы: каждый эксперт-непрограммист может получить собственный кастомизированный (инженерный, финансовый, управленческий и т.д.) DSL, и все эти DSL, адресующие множество различных интересов заинтересованных сторон, будут работать совместно.

Более того, эти отдельные обеспечивающие разделение интересов (separation of concerns) описания далее могут обрабатываться различными способами и для различных нужд:

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

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

Системная инженерия может, как обычно, ждать 10 лет до заимствования из программной инженерии этих новых подходов к моделированию, или начинать экспериментировать с новыми технологиями немедленно. Моделеориентированная системная инженерия не должна быть синонимом SysML-ориентированной системной инженерии. SysML — это только отправной пункт для моделеориентированной системной инженерии, а не пункт назначения.

Примеры DSL

  • TeX/LaTeX для подготовки (компьютерной вёрстки) текстовых документов;
  • Perl для манипулирования текстами;
  • SQL для СУБД;
  • Tcl/Tk для графического интерфейса пользователя;
  • HTML и SGML для разметки документов;
  • Verilog и VHDL для описания аппаратного обеспечения;
  • Mathematica и Maple для символьных вычислений;
  • AutoLisp для компьютерного моделирования (САПР);
  • Prolog для задач, сформулированных в терминах исчисления предикатов;
  • ML и Haskell для задач, сформулированных в терминах функций (Haskell временами определяется как DSL для денотационной семантики).

Что такое dsl в программировании

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2023. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

Предметно-ориентированное программирование. Достоинства и недостатки

Lorem ipsum dolor

Напишем

Предметно-ориентированное программирование направлено на программирование в уникальной и даже очень конкретной области. Под такое программирование разрабатывают уникальные языки с собственным синтаксисом — предметно-ориентированные (на английском DSL — «domain-specific language»). Такие языки являются полным противопоставлением языкам широкого назначения, которые могут применяться где угодно и решать разные миссии. Предметные языки могут решать небольшое количество проблем, а иногда даже только одну.

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

Предметно-ориентированное программирование

Напишем

DSL — языки применяются в узкой сфере, учитывая все ее специфические моменты. Их основная задача — разрешение всех проблем области применения, для которой они были созданы. Поэтому предметно-ориентированное программирование — это довольно специфическая сфера разработки. Оно завязано вокруг какой-то определенной деятельности и с каким-то уникальным языком.

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

  1. Подготовка текстовой документации для десктопной верстки — языки TeX и LaTeX.
  2. Манипулирование текстами — язык Perl.
  3. Подготовка документов по аппаратному обеспечению — языки Verilog и VHDL.
  4. Вычисления значений различных символов — языки Mathematica и Maple.
  5. Компьютерное моделирование — язык AutoLi sp .
  6. Для решения проблем, использующих понятия исчисления предикатов , — язык Prolog.
  7. Команды операционным системам — язык JLC.
  8. Структурирование информации — язык XML.
  9. Макетирование — языки UML и GPSS .
  10. И др.

Также к предметно-ориентированному программированию относятся языки, встроенные в администрирование средствами крупных компаний:

  • АВАР;
  • Пар у с;
  • 1С;
  • и др.

На самом деле, таких «микросфер», где применяется отдельный предметный язык программирования, очень много. В основном предметно-ориентированное программирование затрагивает сферы, куда «не добраться» языками широкого назначения или где просто нецелесообразно их использование. Очень часто ПОП применяется как дополнение к основным языкам программирования, расширяя их возможности и сферу влияния.

Достоинства и недостатки предметно-ориентированного программирования

Напишем

Сложно давать определение достоинствам и недостаткам предметно-ориентированного программирования хотя бы потому, что оно функционирует в очень специфичных областях, где «по-другому» бы просто не получилось. Это т о ж е самое, что оценивать достоинства хирургии или стоматологии как области медицины. То есть есть область применения , и без нее никуда не деться , и все , что можно оценивать, так это специалистов «внутри» самой области. В нашем случае мы можем провести анализ и сделать некий вывод о том , какие преимущества и недостатки даст вам изучение предметно-ориентированного программирования и языков DSL в частности, но не всему ПОП.

Преимущества от изучения предметно-ориентированного программирования:

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

Недостатки от изучения предметно-ориентированного программирования:

  • невысокая востребованность на знания конкретного языка DSL, поэтому тут изучение должно быть построено «от обратного», то есть сначала искать вакансию, а потом изучать соответствующий язык;
  • нет возможности применять полученные знания в других сферах программирования, то есть если выучили какой-нибудь язык DSL, то вы вынуждены будете работать только в сфере, где он применяется;
  • небольшое или полное отсутствие сообщества, то есть у некоторых DSL — языков напрочь отсутствует сообщество, а это значит, что с трудностями нужно будет справляться самостоятельно или используя официальную документацию языка.

Заключение

Предметно-ориентированное программирование — это широкое понятие со множеством мелких и уникальных сфер, где можно использовать собственные знания. Единственное — прежде чем приступить к изучению какого-нибудь предметного языка, нужно подыскать себе вакансию, чтобы иметь возможность сразу получить работу, а не ждать «свободного» места. Потому что в некоторых случаях ждать придется очень долго.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *