Начать с модели предметной области
Прежде чем придумывать слова и скобки, полезно выписать объекты, действия и ограничения. Для учебного языка расписаний это могут быть занятие, помещение, начало и длительность. Важно понять, какие сочетания допустимы: длительность положительна, помещение существует, время окончания вычисляется однозначно. Такой список описывает смысл будущего языка. Если предметные правила ещё постоянно меняются, ранняя фиксация синтаксиса может закрепить неверную модель. Небольшой набор типичных и ошибочных примеров помогает обсуждать язык с людьми, которые знают область.
Разделить запись и значение
Синтаксис определяет, какие записи допустимы по форме. Семантика объясняет, что они означают. Фраза занятие в комнате семь может выглядеть корректно, но ссылаться на несуществующее помещение. Это уже смысловая ошибка. Полезно различать разбор структуры, проверку имён и типов, а затем выполнение или преобразование в другой код. Сообщение об ошибке должно говорить на языке пользователя: неизвестная комната понятнее внутреннего номера сбоя. Чем ближе ошибка к месту её возникновения, тем легче исправить правило без угадывания.
Выбрать способ реализации
Внутренний DSL использует возможности существующего языка программирования и его синтаксические ограничения. Внешний имеет собственную форму записи и требует отдельного способа её обработки. Кроме текстовых вариантов возможны структурные редакторы, где пользователь непосредственно работает с моделью через таблицы, формы или другие представления. Выбор зависит от аудитории, сложности правил и доступных инструментов. Отдельный язык не всегда лучше библиотеки или обычной конфигурации. Если правила просты и редко меняются, дополнительная инфраструктура может оказаться дороже ожидаемой пользы.
Проверять эволюцию и границы
Язык нуждается в тестах не меньше обычной программы. Для каждой конструкции полезны правильный пример, ошибочный пример и ожидаемый результат. Отдельно проверяют взаимодействие правил: два допустимых занятия могут конфликтовать по помещению и времени. При развитии языка нельзя незаметно менять смысл старых записей. Версия и понятный способ миграции помогают сохранить предсказуемость. Также определяют границы выполнения: DSL для расписания не должен случайно получать произвольный доступ к файлам или сети. Ограниченная область задач должна отражаться и в доступных действиях.
Попробуйте на практике
Спроектируйте на бумаге маленький язык описания занятий без установки программ и написания интерпретатора.
- Выберите четыре понятия: название занятия, помещение, начало и длительность; определите допустимые значения каждого.
- Запишите три понятных примера предложений будущего языка и объясните результат каждого обычными словами.
- Добавьте три ошибки: неизвестное помещение, отрицательную длительность и пропущенное начало.
- Сформулируйте сообщения об ошибках так, чтобы человек мог исправить запись без знания реализации.
- Придумайте два пересекающихся занятия и отдельно опишите правило обнаружения конфликта.
Как проверить результат. У каждого понятия есть точный смысл, ошибки формы отделены от ошибок содержания, а конфликт определяется явно заданным правилом.
Частые вопросы
Является ли любая удобная библиотека отдельным языком?
Не обязательно. Граница зависит от того, насколько выражены предметные конструкции и правила их сочетания. Название менее важно, чем ясность модели и поведения.
Нужен ли DSL только непрограммистам?
Нет. Он может помогать и разработчикам выражать повторяющиеся предметные задачи. Аудитория влияет на запись и инструменты, но не является единственным критерием.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.