Демченко
В.Н., ассистент Козаченко А.А.
Государственное высшее учебное заведение «Национальный горный
университет», Украина
Теоретические основы
проблемно-ориентированных языков программирования.
Алгоритмическое решение любой задачи
требует формализации её в терминах некоторой предметной области. Абстракции и
допустимые над ней операции впоследствии
используются для построения необходимого алгоритма решения.
В программировании решение задачи
описывается в терминах языка программирования.
Языки программирования общего назначения
универсальны и позволяют решить практически любую задачу. Но эта
универсальность имеет и обратную сторону. Возникает потребность в высокой
квалификации программиста, а также решения общеизвестных проблем, сопутствующих
разработке прикладной программы.
В отличие от языков программирования
общего назначения, проблемно-ориентированные (или предметно-ориентированные)
языки, известные также как языки предметной области (Domain Specific Language,
DSL), создаются для решения некоторого ограниченного класса задач, специфичных
для конкретной предметной области.
Стиль программирования, базирующийся на
использовании языков предметной области,
существует давно и хорошо известен в настоящее время как
языкоориентированное программирование (Language Oriented Programming, LOP). Стиль обладает рядом значимых преимуществ, основанных на изложенной выше идее.
Основным недостатком является сложность создания нового языка и сопровождающего
его программного обеспечения.
Одна из
технологий, разработанных с целью устранения этого недостатка - языковый
инструментарий Meta Programming System (MPS). Лежащий в его основе постулат о
том, что программа на языке предметной области – это любое точно определённое
решение некоторой задачи, а не просто набор инструкций для компьютера.
Общепринятое в практике программирования
текстовое представление программы является скорее одним из множества
представлений этого решения, и далеко не самым удобным.
Язык предметной области, как и язык
программирования общего назначения, служит средством выражения решения задачи.
Он определяется синтаксисом и
семантикой. Абстрактный синтаксис описывает класс допустимых языком
программ. Конкретный синтаксис определяет представление для этого класса программ.
Семантика придаёт программам содержание и смысл, определяет их поведение.
Следовательно, описание языка программирования включает в себя определение всех
этих трёх составляющих.
На практике обычно формально определяется
только конкретный синтаксис языка (в виде его грамматики), а семантика и
абстрактный синтаксис описываются неформально и скрываются в реализующий язык
транслятор. Такой подход влечёт немало неудобств, как для использования языка,
так и для его поддержки.
Обобщенный алгоритм разработки
нового DSL состоит из следующих этапов:
1. Определение синтаксиса в
терминах языка реализации
2. Использование паттернов DSL
для реализации нового DSL
3. Использование средств
метапрограммирования для реализации DSL в рамках исходного языка
DSL можно разделить на три
основных типа:
·
внутренний
DSL (internal DSL) - использует часть синтаксических конструкций общего языка
программирования для выражения на близком к естественному языке отдельных аспектов приложения. Для
выполнения не требует стороннего компилятора, исполняется при исполнении основного
программного кода на общем языке программирования.
·
внешний DSL
(external DSL) — использует отдельные от основного синтаксиса близкие к
естественному языку конструкции. В отличии от внутреннего DSL требует наличия внешнего компилятора,
интерпретатора или постпроцессора, в следствии чего, исполняется на этапе
компиляции.
·
интегрированная
среда разработки DSL (Language Workbench) - инструмент для создания DSL,
предоставляющий возможности редактора и
генератора для определения абстрактного синтаксиса языка, подобно современным
IDE по разработке программ.
В новых
предметных областях и сейчас применяются известные подходы к созданию DSL.
Наиболее значимой является область
веб-программирования и языки на основе XML - расширяемого языка разметки
текста. За последние десять лет создалось значительное количество таких языков
используемых для разметки и обработки текста, математических формул, хранения и
обмена данными между приложениями. Зачастую эти языки во многом копируют
качества маленьких языков Unix, добавляя лишь использование универсального
синтаксиса и пространств имён, что в свою очередь определяет их высокую
интероперабельность. Ещё одной заметной областью может считаться использование
DSL для решения задач программирования крупного масштаба. Так DSL с графической
нотацией, приёмы трансформации кода, а также DSL описания элементов программной
архитектуры нашли применение в области разработки ПО на основе моделей.
Относительное новое направление архитектуры ПО благодаря применению DSL
приобрело формальную основу. Наконец, динамические языки подняли новую волну
интереса к языкам программирования в целом и к DSL в частности.
В 1980-е гг. за счет развития маленьких языков и появлению языков сценариев
отношение числа полезных машинных инструкций к числу строк исходного кода
заметно увеличилось. Это привело к росту производительности программистов,
существенному сокращению сроков разработки и повышению сложности функций ПО. В
1990-х гг. было замечено обратное влияние DSL на языки общего назначения,
материализовавшееся в развитии и популяризации языков сценариев в качестве
динамических языков. Процесс создания специализированных языков стал
общепризнанным мощным методом абстракции. Благодаря такому подходу, решения
задач выражались в терминах предметной области, фиксировались в языке знания об
области способом, допускающим повторное использование, валидацию и оптимизацию
на более высоком уровне и делало доступным использование языка людьми, не
являющимися специалистами в области информационных технологий
Таким
образом DSL языки позволяют перенести решение задачи на более высокий уровень
абстракции по сравнению с уровнем языков программирования, происходит повышение надежности, эффективности и качества,
а так же программы, написанные с использованием DSL
лаконичны. Написание DSL с использованием терминов предметной области дает
возможность в дальнейшем читать программу достаточно легко.
Литература:
1. Dmitriev S. «Language Oriented Programming:
The Next Programming Paradigm» www.onboard.jetbrains.com February 2005
2.
Оллонгрен А. Определение языков программирования интерпретирующими автоматами.
М.: Мир, 1977.
3.
Лавров С. С. Программирование. Математические основы, средства, теория.
БХВ-Петербург, 2001.
4.
Ахо А., Сети Р., Ульман Д. Компиляторы: принципы, технологии и инструменты.
Вильямс,
2003.
5. JetBrains: Meta Programming System. 2005.
http://www.jetbrains.com/mps/
6. Fowler М. A Language
Workbench in Action – MPS. 2005. http://martinfowler.com/articles/mpsAgree.html,
2005