Языки предметной области
(В оригинале - Domain-Specific Languages)
Когда бы вы не вслушались в разговор экспертов в какой-либо предметной области, будь то шахматисты, работники детского сада или страховые агенты, вы всегда заметите, что они используют слова, отличающиеся от обычных, используемых повседневно. Это то, что называется «язык предметной области» (далее для краткости ЯПО) – набор слов и выражений, описывающий вещи, характерные для данной предметной области.
В мире программного обеспечения под ЯПО подразумевается набор исполняемых выражений на языке, специфичном для данной области, с ограниченным словарем и грамматикой, которые при этом читабельные, понятные и (хорошо если так) используемые экспертами предметной области. ЯПО предназначен для разработчиков или научных работников, находящихся в этой предметной области долгое время. Например, язык конфигурационных файлов Unix или языки, созданные при помощи LISP-макросов.
ЯПО принято разделять на внутренние и внешние.
Внутренние ЯПО создаются при помощи языков программирования, чей синтаксис близок к обычному языку людей. Сделать такое проще на языках, предлагающих больше «синтаксического сахара», как например Ruby или Scala, и сложнее на тех, которые такого не предоставляют (например, Java). Большинство внутренних ЯПО представляют собой обертки для существующих API, библиотек, предоставляя менее головоломный вариант использования существующей функциональности. Их можно исполнять напрямую. В зависимости от реализации и домена, ЯПО могут создавать структуры данных, определять зависимости, запускать процессы и задачи, связываться с другими системами или проверять пользовательский ввод. Синтаксис внутренних ЯПО ограничивается языком программирования, на котором они реализованы. Существует много шаблонов, например, построители выражений, цепочечные методы, аннотации, которые могут помочь вам «привести» ваш язык программирования к вашему ЯПО. Если используемый язык программирования не требует перекомпиляции, то внутренний ЯПО может быть весьма быстро разработан при непосредственном участии эксперта предметной области.
Внешние ЯПО – это текстовые или графические выражения языка, причем текстовые, как правило, используются чаще. Текстовые выражения могут обрабатываться инструментарием, включающим лексический анализатор, грамматический разбор, модификатор модели, генераторы и другие виды постобработки. Внешние ЯПО часто преобразуются во внутреннюю модель, представляющую базис для дальнейшей обработки. Хорошо помогает задать грамматику (например, расширенную форму Бэкуса-Наура). Грамматика предоставляет начальную точку для всего остального (редактор, визуализатор, грамматический разборщик). Для простых ЯПО ручной разборщик грамматики может быть достаточным (например, можно использовать регулярные выражения). В более сложных случаях лучше посмотреть в сторону специально разработанных для работы с грамматиками инструментов, таких как openArchitectureWare, ANTlr, SableCC, AndroMDA. Определение внешнего ЯПО как диалекта XML тоже часто встречается, хотя читабельность такого языка часто является проблемой, особенно для тех, кто не знаком с XML.
Вы всегда должны отслеживать, для кого предназначен ваш ЯПО. Для разработчиков, менеджеров, заказчиков или конечных пользователей. Вам нужно адаптировать технический уровень языка, доступные инструменты, помощь по синтаксису, раннюю проверку, визуализацию для уровня тех, кто будет этим пользоваться. Скрывая технические детали, ЯПО может помочь пользователям, давая им возможность настраивать систему под себя без помощи разработчиков. Это может также ускорить разработку путем распределения работы после того, как ЯПО займет свое место в системе. ЯПО может постепенно развиваться. Существуют различные способы миграции уже существующих выражений и грамматик.
Автор оригинала - Michael Hunger