Вы находитесь на странице: 1из 6

УДК 004.

423

ОБЗОР СОВРЕМЕННЫХ СРЕДСТВ СОЗДАНИЯ И ПОДДЕРЖКИ


ПРЕДМЕТНО-ОРИЕНТИРОВАННЫХ ЯЗЫКОВ
ПРОГРАММИРОВАНИЯ
Д.С. Ботов

REVIEW OF MODERN DEVELOPMENT AND SUPPORT TOOLS


FOR DOMAIN-SPECIFIC PROGRAMMING LANGUAGE
D.S. Botov

Приводится обзор современных средств создания предметно-ориентированных


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

In this article the review of modern development tools for domain-specific programming
languages and language workbenches is given.
Keywords: DSL, domain-specific language, language workbench, language-oriented pro-
gramming, metaprogramming, extensible programming.

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


В современной индустрии разработки про- (language workbench). Языковые инструментальные
граммного обеспечения постепенно набирает силу средства представляют собой специализированные
и становится все более популярной новая парадиг- интегрированные среды разработки (integrated
ма, новый подход – языково-ориентированное про- development environment, IDE) для определения и
граммирование (ЯОП). ЯОП – это такой подход к создания DSL [2]. Именно сложность создания
программированию, который основывается на соз- языковой инфраструктуры, необходимой для реа-
дании специальных языков программирования – лизации DSL различного рода и комфортной рабо-
предметно-ориентированных языков (domain-specific ты с ними, является одной из причин малого при-
language, DSL) для решения задач в конкретной менения DSL в промышленной разработке про-
предметной области [1]. В ЯОП программист сна- граммного обеспечения (ПО), где важна высокая
чала создает один или несколько DSL для решения производительность разработчиков.2
определенного набора задач, а затем применяет соз- В данном обзоре особое внимание уделяется
данные DSL при разработке программной системы. технологиям, позволяющим обеспечить поддержку
Различают два основных вида предметно- разработки в стиле ЯОП средствами языкового
ориентированных языков: внешние (external DSL) инструментария.
и внутренние (internal DSL или embedded DSL).
Внешние DSL имеют собственный синтаксис, отде- 1. Средства поддержки разработки
ленный от основного языка приложения. Внутрен- внешних DSL
ние DSL используют в своей основе язык програм- Процесс создания языка с собственным син-
мирования общего назначения, но отличаются тем, таксисом, т. е. внешнего DSL, можно представить в
что используют конкретное подмножество возмож- виде последовательности из трех шагов:
ностей этого языка в определенном стиле [2]. – определение семантической модели;
В статье приведен обзор современных средств – определение синтаксической модели (абст-
(языки, платформы, среды разработки), позволяю- рактный и конкретный синтаксис);
щих создавать как внешние, так и внутренние DSL. – определение правил трансформации (прави-
Стоит отметить, что одной из важных проблем ла, по которым абстрактное представление транс-
в создании и дальнейшем использовании DSL лируется в исполнимое).

Ботов Дмитрий Сергеевич – аспирант кафедры ЭВМ, Botov Dmitry Sergeevich – Post-Graduate Student of Elec-
Южно-Уральский государственный университет; dm@ tronic Computer Department of South Ural State University;
comp.susu.ac.ru dm@comp.susu.ac.ru
Вестник ЮУрГУ. Серия «Компьютерные технологии, управление, радиоэлектроника»
10
Обзор современных средств создания и поддержки
предметно-ориентированных языков программирования

Если для определения конкретного синтаксиса языка и разрабатываем на его основе библиотеку,
языка и задания правил трансформации путем по- своего рода надстройку над языком [4], которую
строения транслятора языка есть готовые средства затем используем в определенном стиле, как пра-
различного рода, начиная от связки программ lex + вило, для управления отдельными аспектами раз-
yacc, входящих в стандарт POSIX, для генерации рабатываемой программной системы.
лексического и синтаксического анализатора соот- Нужно понимать, что в отличие от внешнего
ветственно и заканчивая современными средства- DSL при разработке внутреннего DSL грамматика
ми автоматизации построения трансляторов языка, базового языка накладывает ограничения на выра-
например ANTLR. зительные возможности языка. Чем менее гибка
ANTLR [3] – генератор парсеров, позволяю- грамматика базового языка, тем менее удобен и эф-
щий конструировать компиляторы, интерпретато- фективен будет внутренний DSL. Таким образом,
ры, трансляторы с различных формальных языков выразительные возможности базового языка долж-
по описанию LL(*)-грамматики на языке, близком ны соответствовать сфере и способу применения
к РБНФ. ANTLR предоставляет визуальную среду создаваемого на его основе внутреннего DSL.
разработки, которая позволяет создавать и отлажи- При создании внутренних DSL чаще всего ос-
вать грамматики с поддержкой подсветки синтак- новываются на грамматике современных языков
сиса, автодополнения, с визуальным отображением программирования общего назначения, предостав-
грамматик, отладчиком, инструментами для рефак- ляющих гибкие возможности, которые позволяют
торинга и т. д. создавать удобные DSL. Например, это такие языки
Для определения же семантической модели как Ruby, Python, Scala, C#, F#, Haskell. Можно за-
языка [2] (той части языка, описывающей семан- метить, что в списке таких языков преимуществен-
тику предметной области или определенный ас- но языки мультипарадигмальные, как правило, на-
пект системы, для конфигурирования которого следующие выразительные возможности от не-
разрабатывается внешний DSL) не существует скольких, чаще всего неродственных языков. За счет
специальных программных средств, каждая ко- такого сочетания разнообразных возможностей в
манда разработчиков решает проблему представ- грамматике языка мы получаем эффективный гиб-
ления семантики DSL самостоятельно, обычно кий инструмент для создания внутренних DSL.
описывая метамодель языка на одном из языков Особенно стоит отметить эффективность исполь-
программирования (как правило, языков програм- зования выразительных возможностей парадигмы
мирования общего назначения). Кроме того, не функционального программирования, хотя даже на
существует и средств отображения семантики DSL нефункциональных языках со статической типиза-
на синтаксис. Задача такого отображения опять же цией можно создавать удобные внутренние DSL,
решается конкретной группой разработчиков са- например, на C++ за счет механизма шаблонов
мостоятельно. (templates).
Из-за отсутствия языкового инструментария Выбирая современный язык программирова-
для поддержки семантической модели языка и ния общего назначения как основу для создания
поддержания отображения семантики на синтак- внутреннего DSL, мы сразу получаем и готовый
сическую модель возрастают затраты на создание набор средств поддержки разработки – современ-
внешних DSL. Сами внешние DSL становятся ные IDE, которые поддерживают базовый язык.
замкнутыми языками для решения узких задач, и Таким образом, создавая внутренние DSL, мы
на практике практически невозможно и нерацио- жертвуем полной свободой определения граммати-
нально их повторное использование для решения ки, оставаясь в рамках грамматики базового языка,
задач в других предметных областях (смежных, но при этом получаем возможность использовать
аналогичных по характеру или по содержанию). современные интегрированные среды разработки.
Среду разработки, которая поддерживала и
облегчала бы написание сценариев на внешнем 3. Средства поддержки разработки DSL,
DSL, обычно разрабатывают либо с нуля, либо как основанных на языках и средствах
плагин к уже существующей современной IDE. программирования с настраиваемой
Практически все современные среды разработки грамматикой
(например, Eclipse IDE, Microsoft Visual Studio и Еще одним подходом для создания DSL (по
др.) имеют гибкую плагинную архитектуру и по- сути внутренних DSL) является использование
зволяют добавлять поддержку новых языков про- языков программирования с настраиваемым син-
граммирования. таксисом, т. е. языков, ориентированных на техни-
ки метапрограммирования. Такой подход называ-
2. Средства поддержки разработки внутренних ется «extensible programming»; он активно разви-
DSL, основанных на грамматиках языков вался в 1960-х годах, потом его развитие приоста-
программирования общего назначения новилось, и интерес к этому подходу вновь возник
В простейшем случае при создании внутрен- только в XXI веке [4].
него DSL мы выбираем один из языков програм- «Extensible programming» – это стиль про-
мирования общего назначения в качестве базового граммирования, ориентированный на использова-
2013, том 13, № 1
11
Д.С. Ботов

ние механизмов расширения языков программиро- 4. Языки для поддержки разработки DSL
вания, трансляторов и сред выполнения [5]. без текстовых грамматик
Примерами языков программирования, кото- Синтаксис всех популярных языков програм-
рые могут использоваться в качестве базовых язы- мирования общего назначения (в том числе приве-
ков для создания внутренних DSL в стиле «extensi- денные в качестве примеров выше в п. 2 и 3) осно-
ble programming», могут служить: вывается на текстовых грамматиках. У таких
– Forth – один из первых конкатенативных грамматик есть один существенный недостаток:
языков программирования (появился в 1971 году), при попытке расширения грамматики она может
в котором программы записываются последова- стать неоднозначной, т. е. возможно несколько ин-
тельностью лексем в виде постфиксной записи терпретаций одной и той же строки исходного кода
при использовании стековой нотации. Язык имеет на таком расширенном языке [12]. Особенно остро
простую грамматику и ориентирован на исполь- данная проблема встает в случае, если мы пытаем-
зование механизмов метарасширения синтаксиса. ся соединить несколько разных расширений грам-
У Forth существует преемник – язык Factor [6]. матики одного и того же языка, которые в отдель-
Оба языка достаточно сложны в изучении и ис- ности являются однозначными, но при их совме-
пользовании. щении результирующая грамматика вполне может
– Common Lisp [7] – диалект языка Lisp, потерять однозначность и ее дальнейшее исполь-
стандартизированный ANSI. Common Lisp вклю- зование будет уже невозможно.
чает в себя CLOS – систему Lisp-макросов, позво- Проблема неоднозначности грамматик может
ляющую вводить в язык новые синтаксические быть решена путем отказа от использования тек-
конструкции, использовать техники метапрограм- стовой грамматики как таковой и в этом случае
мирования и обобщенного программирования. программа будет задаваться как экземпляр некото-
Существуют текстовые среды разработки на рой синтаксической метамодели. Обычно метамо-
Common Lisp (например, SLIME, Superior Lisp дель программы представляется в виде абстракт-
Interaction Mode for Emacs [8] – режим Emacs для ного синтаксического дерева [4]. Создание нового
разработки приложений на Common Lisp). DSL в таком подходе сводится к заданию метамо-
– Nemerle [9] – статически типизированный дели DSL средствами базового языка. Ярким при-
язык, сочетающий в себе возможности функцио- мером использования такого подхода к разработке
нального и объектно-ориентированного програм- DSL является семейство языков Lisp: Common
мирования, для платформ .NET и Mono с макроса- Lisp [7], Scheme [13], Clojure [14] (Common Lisp
ми и расширяемым синтаксисом. Nemerle имеет уже упоминался выше, так как его можно исполь-
бесплатную полноценную IDE, основанную на зовать и в подходе «extensible programming»).
Visual Studio 2008 Shell, а также может интегриро- Lisp (от англ. LISt Processing language – «язык
ваться с полноценной Visual Studio 2008, Visual обработки списков») – семейство языков програм-
Studio 2010. Однако на возможности расширения мирования, программы и данные в которых пред-
синтаксиса наложены существенные ограниче- ставляются системами линейных списков симво-
ния. лов. Lisp является вторым в истории (после Фор-
– Racket [10] – это язык и платформа про- трана) используемым по сей день высокоуровне-
граммирования, являются реализацией и расшире- вым языком программирования [15]. Изначально
нием языка Scheme – еще одного диалекта Lisp. Lisp создавался как средство моделирования раз-
Платформа поддерживает концепцию переключе- личных аспектов искусственного интеллекта, но
ния между разными языками и позволяет создавать затем сфера применения языка расширилась.
новые языки, используя при этом генератор парсе- Благодаря минималистичному собственному
ров в стиле yacc. Интегрированная среда разработ- синтаксису языка, его динамической типизации,
ки (DrRacket) и ее отладчик работают с этими язы- развитой системе компилируемых макросов, куль-
ками. Более того, DrRacket также написан на языке туре инкрементальной разработки и другим осо-
Racket, что открывает возможности для модифика- бенностям языкам семейства Lisp, пожалуй, нет
ции среды под язык и распространения ее в каче- равных в быстроте и удобстве создания внутрен-
стве IDE для создаваемого DSL. них (встроенных) DSL. Однако при создании DSL
– Helvetia [11] – инструментарий, интегриро- на Lisp мы сталкиваемся с другой проблемой –
ванная среда, написанная на Smalltalk, для произ- сложностью создания языковой инфраструктуры,
вольного расширения синтаксиса языка Smalltalk. необходимой для реализации нового DSL и ком-
Позволяет расширять и адаптировать среду разра- фортной работы с ним.
ботки под расширение языка с сохранением отлад-
ки, с подсветкой синтаксиса, автодополнением. 5. Современные языковые инструменталь-
Это становится возможным благодаря однородно- ные средства для поддержки разработки DSL
сти базового языка и среды. В качестве недостатка без текстовых грамматик
можно отметить, что Helvetia работает только на Языковые инструментальные средства, по су-
Pharo Smalltalk версии 1.1 и не портирована на ти, представляют собой инструменты, которые не
современную версию Pharo 1.3. только помогают создать собственный DSL, но и
Вестник ЮУрГУ. Серия «Компьютерные технологии, управление, радиоэлектроника»
12
Обзор современных средств создания и поддержки
предметно-ориентированных языков программирования

обеспечивают его поддержку в стиле современных как сама MPS написана на этом языке программи-
интеллектуальных сред разработки, предоставляя рования.
возможности для построения современных IDE Поскольку в MPS не используется традицион-
под создаваемые языки [2]. В результате програм- ное текстовое представление, то вместо обычного
мисты, которые будут писать сценарии на DSL, текстового редактора для работы с кодом на DSL
получат такую же инструментальную поддержку, предлагается использовать специальный проекци-
как и программисты, разрабатывающие на языках онный редактор [12]. Для каждого узла синтакси-
программирования общего назначения (C/C++, ческого дерева, он создает проекцию – часть экра-
Java, C# и т. д.). Среды разработки для DSL смогут на, с которой может взаимодействовать пользова-
предоставлять такие возможности, без которых тель. Такой редактор ведет себя достаточно близко
немыслима современная промышленная разработ- к тестовому редактору, но чтобы освоить его в
ка ПО, как например: полной мере требуется время на обучение (по сло-
– автодополнение, генерация кода, средства вам разработчиков из JetBrains на освоение проек-
рефакторинга; ционного редактора может потребоваться около
– средства удобной отладки сценариев на 2 недель).
DSL; Такой подход позволяет существенно упро-
– средства управления версиями; стить создание IDE, поскольку постоянное нали-
– средства модульного и интеграционного тес- чие синтаксического дерева и созданного для ра-
тирования; боты с ним проекционного редактора позволяет
– средства обратной разработки (reverse engi- легко реализовать подсветку ошибок, автоматиче-
neering). ское дополнение, контекстные подсказки и т. п.
Существуют фреймворки для создания интел- Среда разработки JetBrains MPS была создана
лектуальных редакторов, например, IntelliJ IDEA на основе IntelliJ IDEA [16], в которой была реали-
Language API [16], Xtext [17] (на базе платформы зована поддержка интеллектуального редактирова-
Eclipse) и другие, но ни один из этих фреймворков ния для многих языков. Реализация такой под-
не поддерживает расширяемые языки на должном держки для нового DSL, создаваемого вне MPS,
уровне. Даже если нам не нужна расширяемость, потребовала бы больших усилий. С MPS анало-
создание поддержки языка с использованием этих гичные возможности могут быть реализованы с
средств требует хороших знаний в области языков минимальными затратами. Это возможно, по-
программирования и занимает очень много време- скольку для разработки языков используются спе-
ни [12]. циальные языки, которые конфигурируют сущест-
Частично проблему создания языковой ин- вующую языковую инфраструктуру. Таким обра-
фраструктуры для DSL решала система Helvetia, зом, MPS – это не просто редактор кода, а среда
кратко описанная выше. Разберем еще один из для создания полноценных IDE для DSL.
подходов для решения проблем при создании DSL, Компания JetBrains сама в свою очередь ак-
который предлагает компания JetBrains в своем тивно использует MPS в своих разработках. Так,
продукте JetBrains MPS. например, с помощью MPS был создан багтрекер
JetBrains MPS (MetaProgramming System) [18] – YouTrack и Realaxy ActionScript Editor – первая
это система метапрограммирования, которая реа- IDE, основанная на MPS.
лизует парадигму языково-ориентированного про-
граммирования, является средой разработки язы- Заключение
ков и в то же время IDE для разрабатываемых Подводя итоги обзора, можно отметить, что
языков. весьма невелико число языков и средств, которые
Для того чтобы поддержать совместимость позволяют не только создавать DSL, но и могут
расширений языка друг с другом, MPS не работает обеспечить эффективные средства и способы мо-
с программами как с текстом. Вместо этого MPS дернизации самих DSL и поддержки разработки на
хранит их как синтаксическое дерево, и редакти- созданных языках. Пожалуй, только JetBrains MPS
рование происходит напрямую, без промежуточно- и частично Helvetia (но в отличие от JetBrains MPS
го использования текста. В результате вместо кон- эта система практически не развивается) представ-
кретного синтаксиса языка в MPS определяется ляют собой современные языковые инструмен-
абстрактный синтаксис (структура синтаксическо- тальные средства, покрывающие не только этапы
го дерева) для создаваемого DSL [12]. Способ опи- создания, но и этапы эксплуатации и модерниза-
сания структуры абстрактного синтаксического ции DSL, без чего невозможно представить их эф-
дерева чем-то напоминает XML Schema – язык фективное использование в индустрии разработке
описания структуры XML-документа. ПО сегодня.
Система JetBrains MPS позволяет вставлять Использование языкового инструментария
код на языке программирования общего назначе- требует детального изучения и наработки опыта
ния внутрь относительно замкнутого DSL. Наи- применения таких инструментов при создании
большее число экспериментов проводится с рас- DSL. Продукт JetBrains MPS, рассматриваемый в
ширением и использованием вставок на Java, так данном обзоре, имеет достаточно высокий порог
2013, том 13, № 1
13
Д.С. Ботов

Подходы к созданию внешних и внутренних DSL, языки и инструментарий


создания и поддержки DSL

вхождения, что затрудняет его широкое распростра- Семантическая модель должна отражать суть,
нение и применение. Кроме того еще одним недос- специфику предметной области. И именно наличие
татком современных языковых инструментариев семантической модели является одним из важных
является отсутствие стандартов и возможности пе- отличий работы с DSL от работы с языками про-
реноса разрабатываемых DSL между различными граммирования общего назначения. Можно пред-
средами. Так, начав создание DSL в JetBrains MPS, положить, что отсутствие эффективных средств
разработчик языка становится заложником этого представления семантики DSL и отображения се-
инструментария, так как в нем отсутствуют воз- мантики на синтаксис осложняет широкое приме-
можности экспорта создаваемого DSL. Это обу- нение DSL в разработке ПО.
словлено отсутствием каких-либо общепринятых Разнообразие подходов к созданию DSL на-
форматов для представления DSL и существенным глядно представлено на рисунке. Как обобщение
различием в подходах к созданию DSL [2, 4]. данного обзора на схеме изображены подходы и
Стоит обратить особое внимание на то, что ни средства создания и поддержки DSL, которые бы-
один из инструментов для создания DSL не позво- ли рассмотрены выше.
ляет в полной мере представить семантическую На схеме также упомянут подход визуального
модель языка и настроить отображение семантики метапрограммирования, рассмотрение которого
языка на синтаксис. В основном все средства со- выходит за рамки данной статьи, так как он суще-
средоточены на представлении текстовой грамма- ственно отличается по своим принципам и инст-
тики DSL либо на представлении метамодели, под рументарию от других подходов и требует отдель-
которой обычно понимается абстрактное синтак- ного детального изучения и рассмотрения.
сическое дерево. Однако М. Фаулер в [2] справед-
ливо отмечает, что семантические модели DSL, как Литература
правило, отличаются от абстрактного синтаксиче- 1. Language-oriented programming. – http://
ского дерева. Если синтаксическое дерево соответ- en.wikipedia.org/wiki/Language_oriented_programming
ствует структуре сценариев DSL – форме (как на- 2. Фаулер, М. Предметно-ориентированные
пример, в JetBrains MPS), то семантическая модель языки программирования: пер. с англ. / М. Фаулер. –
языка в свою очередь основывается на том, как М.: ООО «И.Д. Вильямс», 2011. – 576 с.
будет обрабатываться информация сценария – это 3. ANTLR, ANother Tool for Language Recogni-
смысл, содержание. tion. – http://www.antlr.org
Вестник ЮУрГУ. Серия «Компьютерные технологии, управление, радиоэлектроника»
14
Обзор современных средств создания и поддержки
предметно-ориентированных языков программирования

4. Как создавать DSL. – http://shmat-razum. позволяет достичь более широкого использования


blogspot.ru/2011/09/dsl.html DSL-й (языков специфичных для предметной об-
5. Extensible programming. – http://en.wikipedia. ласти) / К. Соломатов. – http://habrahabr.ru/post/
org/wiki/Extensible_programming 66094/
6. Factor programming language. – http:// 13. Scheme, dialect of Lisp. – http://schemers.org/
factorcode.org/ 14. Clojure, dialect of Lisp. – http://clojure.org
7. Common Lisp. – http://common-lisp.net/ 15. LISP, LISt Processing language. – http://
8. SLIME, The Superior Lisp Interaction Mode ru.wikipedia.org/wiki/Lisp
for Emacs. – http://common-lisp.net/project/slime/ 16. IntelliJ IDEA, code-centric IDE. – http://
9. Nemerle, programming language. – http:// www.jetbrains.com/idea/
nemerle.org/ 17. Xtext, framework for development of pro-
10. Racket, programming language. – http:// gramming languages and domain specific languages. –
racket-lang.org/ http://www.eclipse.org/Xtext/
11. Helvetia. – http://scg.unibe.ch/research/helvetia 18. JetBrains MPS, MetaProgramming System. –
12. Соломатов, К. Как система JetBrains MPS http://www.jetbrains.com/mps/

Поступила в редакцию 27 ноября 2012 г.

2013, том 13, № 1


15

Вам также может понравиться