Куделько Т.Н.

Белорусский государственный университет информатики и радиоэлектроники, Республика Беларусь

Концепция 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).