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 можно почитать здесь.
вторник, 25 сентября 2007 г.
DSL (domain-specific language)
Автор: sash_ko на 17:45
Ярлыки: Программизм
Подписаться на:
Комментарии к сообщению (Atom)
1 комментарий:
Добрый день. Я разыскиваю информацию о DSL. Статьи Мартина Фоулера я конечно читал. Но в последнее время появилась еще одна DSL-платформа, о которой Мартин не упоминал - eclipse EMF/GMF/OCL. У вас есть какая-либо информация о реализации DSL с применением этого инструментария?
Отправить комментарий