Куделько Т.Н.
Белорусский
государственный университет информатики и радиоэлектроники, Республика Беларусь
Концепция DSL и особенности
практического применения
Разделение
подходов к решению задач на общий и специализированный широко распространено во
всех отраслях науки и инженерии. Если общий подход рассчитан на поиск общего
решения для многих задач какой-либо предметной области, то применение
специализированного подхода зачастую связано с возможностью создания узко
специлизированного, но зачастую более эффективного решения для небольшого
набора задач. В рамках вычислительной техники как области знаний
специализированный подход нашел свое выражение в развитии
предметно-ориентированных языков (domain specific language - DSL).
История
развития предметно-ориентированных языков программирования тесно связана с
языком Lisp, одним из первых языков программированния, разработанном в
1958 г. Джоном Маккарти для решения задач в области искусственного
интеллекта. Будучи языком общего
назначения, Lisp стал основой для целого семейства диалектов и
специализированных языков, многие из которых могут быть отнесены к DSL. Специализированные языки на основе Lisp стали первыми примерами встраиваемых DSL, использовавшими особый синтаксис Lisp, гомоиконность, расширения языка через макросы. Они
продемонстрировали такие преимущества, как выражение проблемы и возможность
валидации на уровне абстракции предметной области, фиксация в языке знаний о
предметной области. Но развитие Lisp происходило
в основном в академической среде и не затрагивало широкий круг инженеров.
Дальнейшее развитие языки DSL получили
среди пользователей и разработчиков операционной среды Unix.
Языки сценариев позволили уменьшить разрыв между языками общего назначения,
позволяющими писать эффективные программы, но сложными в применении и
доступными лишь программистам, и языками DSL, специфичными для узких
предметных областей, простыми в освоении даже для незнакомых с
программированием, но неэффективными и не приспособленными для решения задач за
рамками своей узкой ниши. Cоздание же
специализированных языков стало мощным методом абстракции, позволяющим выражать
решения задач в терминах предметной области, фиксировать в языке знания об
области способом, который допускает повторное использование, валидацию и оптимизацию
на более высоком уровне, урощает использование языка людьми, не являющимися
специалистами в области информатики и вычислительной техники.
Новые
предметные области тоже нашли отражение в создаваемых для них языках DSL.
За последние десять лет было создано большое количество таких языков для
разметки и обработки текста, математических формул, хранения и обмена данными
между приложениями. Еще одной заметной областью является применение DSL
для решения задач программирования крупного масштаба. В области разработки
программного обеспечения на основе моделей получили развитие DSL
с графической нотацией, приемы трансформации кода, а также DSL
описания элементов программной архитектуры. Наиболее популярные DSL
сегодня: SQL, BNF, HTML,
PIC, SCATTER, CHEM,
LEX, YACC.
Рассматривая
концепцию DSL, важно понимать, что предметно-ориентированный язык можно
охарактеризовать не только как язык программирования, но и как язык исполняемой
спецификации благодаря свойству декларативности. Такой язык через
соответсвующий набор нотаций и абстракций способен проявить свою выразительную
силу, сфокусировавшись лишь на определенной предметной проблеме и обычно
ограничиваясь ею же. DSL обычно малы, и в
литературе их иногда называют микро-языками или маленькими языками. Программирование
на таком языке является программированием для конечных пользователей, которые
могут реализовывать и выполнять простые задачи, используя макросы или
скриптовые языки. Типичным примером может служить программирование для
электронных таблиц с использованием макро-языка Excel.
Применение
DSL при разработке программного средства имеет определенные
риски, а также ряд возможностей. Основные достижения хорошо спроектированных
предметно-ориентированных языков в том, что:
·
DSL позволяет выражать решения в
форме идиом и на уровне абстракций.
·
DSL программы лаконичны,
самодокументированы до больших объемов и могут быть повторно использованы в
различных целях.
·
Использование
DSL увеличивает продуктивность, надежность, удобство сопровождения и
переносимость.
·
Все DSL заключают в себе предметные знания и это делает возможным их
сохранение и повторное использование.
·
DSL разрешают валидацию данных и
оптимизацию на доменном уровне.
·
Использование
DSL благоприятно влияет на тестируемость программного средства.
Недостатки, оказывающие
негативное влияние на применение DSL в
программных проектах, рассмотрены ниже.
·
Стоимость
проектирования, реализации и сопровождения DSL.
·
Стоимость
обучения пользователей DSL.
·
Трудность
выявления подходящего контекста для DSL.
·
Трудность
создания баланса между DSL и GPL (general-purpose language).
·
Потенциальная
потеря эффективности по сравнению с программным обеспечением, написанным
вручную.
Методология
проектирования DSL обычно состоит из приведенной ниже
последовательности действий.
·
Анализ:
1) определение проблемы предметной области; 2) собрание информации о предметной
области; 3) объединение знаний в семантические нотации и операции над ними; 4)
проектирование DSL, который может лаконично описать
предметную область.
·
Реализация:
1) конструирование библиотеки, реализующей семантические нотации; 2)
проектирование и реализация компилятора, транслирующего DSL
программу в последовательность библиотечных вызовов.
·
Использование:
1) написание DSL программ для возможных приложений; 2) компиляция программ.
Наиболее известными
методологиями предметно-ориентированного программирования являются ODM
(Organizational Domain
Modeling), FODA (Feature-Oriented Domain Analysis),
DSSA (Domain-Specific Software Architecture).