вторник, 25 сентября 2007 г.

DSL (domain-specific language)

DSLs(domain-specific language, DSL) - языки программировая, позволяющие решать строго определённые задачи. Часто DSL-программа не компилируется в байт код или исполняемый код. Результат "компиляции" такой программы - объект предметной области.

Возьмем для примера парсеры, которые применяются повсеместно (компиляторы, браузеры, текстовые редакторы и т.д.) Был разработан стандарт генератора парсера для Unix систем, который называется Yacc (Yet Another Compiler Compiler). Релизация этого стандарта (Berkley Yacc, Yaxx, Yecc) служит только для одной цели - генерация парсеров. Yacc генерирует код парсера на языке С основываясь на группе правил (аналитической граматике). Это один из примеров DSL.

Любую задачу предметной области лучше всего описывать языком, специально созданным для этого. Это отличает DSL от объектно-ориентированных языков, таких как например С++, Java и т.д. ОО язык позволяет создавать любые конструкции, DSL оперирует только понятиями предметной области. Поэтому последний имеет очень ограниченный синтаксис, не позволяющий ничего лишнего (например создание потоков, чтение файлов и т.д.)

Самая идея языков предметной области не нова. Уже давно используются макросы, shell-скрипты (grep, awk, yacc), язык для работы с базами данных SQL.

Мартин Фаулер в своей статье Языковой инструментарий: новая жизнь языков предметной области выделяет 2 типа языков предметной области: внешние и внутренние.

Внешними я называю те DSL, которые написаны на языке, отличном от основного языка программного приложения - как две последние формы в нашем несложном примере. Примерами DSL такого типа могут служить "малые языки" Unix и конфигурационные XML файлы...

Что касается внутренних DSL, то они превращают в DSL сам основной язык приложения. Лучшим примером такого языка служит Lisp.

Если нужен язык для решения спецефических задач, а чего нет, то его можно реализовать. В реализации нового внешнего DSL нет ничего хитрого. Просто нужно определиться с терминами, которым оперирует предметная область и отобразить их в синтаксисе. Здесь можно посмотреть пример разработки нового DSL на Java. А здесь - разработка нового DSL на Ruby.

DSL DLS'ем, но возникает вполне резонный вопрос. А не дорого ли каждый раз разрабатывать DSL. Т.е. сама по себе разработка - это еще пол дела. Ведь в дальнейшем нужен супорт, редактор по красивше, обучение синтаксису пользователя, да еще и отладку не плохо было бы иметь. В этом и заключаются минусы языков предметной области.

Сейчас развивает новый тип программного обеспеченя - языковой инструментарий (language workbenches). Это полноценные среды для создания DSL. Например, Meta Programming System (MPS) компании JetBrains, Майкрософтовский Software Factories. О разработке и проектировани DSL с использованием MPS можно почитать здесь.

1 комментарий:

Alex комментирует...

Добрый день. Я разыскиваю информацию о DSL. Статьи Мартина Фоулера я конечно читал. Но в последнее время появилась еще одна DSL-платформа, о которой Мартин не упоминал - eclipse EMF/GMF/OCL. У вас есть какая-либо информация о реализации DSL с применением этого инструментария?