Первые шаги с DSL на Java? - PullRequest
5 голосов
/ 22 июля 2010

Ребята ... Девочки, я работаю над проектом, который, я думаю, можно улучшить, внедрив язык, специфичный для предметной области, для определения набора правил и / или условий для некоторого типа рабочего процесса.

Я хочу получить четкое представление о предмете, основах, лучших практиках и т. Д., Особенно о том, как их как-то реализовать с помощью Java.

Что вы предлагаете?

Ответы [ 4 ]

8 голосов
/ 22 июля 2010

Сначала я бы порекомендовал прочитать главу 9 (Обозначения) Практики программирования Кернигана и Пайка.

Когда вы это сделаете, вернитесь сюда с конкретными вопросами о том, как сопоставить концепции в этой главе с конкретными планами для задач, которые вы хотите решить.

Основной шаблон - написать интерпретатор, которому передан аргумент «команда» и, возможно, аргумент «окружение» и который выполняет команду (в окружении). Затем у вас есть возможность написать анализатор, который берет строку 'script' и преобразует ее в действительный объект 'command' (т. Е. External-DSL); или вы предоставляете библиотеку, чтобы помочь пользователям явно создать объект 'command' на том же языке, который вы используете (internal-DSL).

Керниган и Пайк хорошо показывают, насколько тривиальным и сложным может быть переводчик. Если вы хотите глубже, то я бы предложил прочитать Основы языков программирования , автор Daniel Friedman et al. Который создает как минимум один интерпретатор для каждой главы и демонстрирует, как реализовать такие функции, как переменные, функции, области действия, объекты, классы, статическая типизация и продолжения.

Однако я бы предложил сначала попробовать свои силы в тривиальном DSL, иначе это всего лишь теория - книга гораздо интереснее, когда она сделана актуальной и практичной из вашего предыдущего опыта.

3 голосов
/ 22 июля 2010

Как уже отмечали другие, Java действительно не является отличным выбором для создания DSL.Scala, Clojure, Groovy, Ruby / JRuby были бы отличным выбором.Однако, учитывая, что вы думали об использовании Java, я думаю, что Groovy или Scala кажутся наиболее естественным выбором.Кривая обучения для разработчиков Java довольно постепенная для обоих языков.Вот несколько ссылок, с которых вы можете начать:

0 голосов
/ 28 марта 2011

Просто дополнение к @Recurse. Я на самом деле делаю пример регулярного выражения в главе 9, на которую он ссылался, и это не сработало, пока я не изменил строку в основной функции:

            if (grep(argv[1], f, argc>3 ? argv[i] : NULL) > 0)

действительно должно быть:

            if (grep(argv[1], f, argc>2 ? argv[i] : NULL) > 0)

обратите внимание на argc> 2. Это сработало для меня после этого. Не было в книгах ошибок (что неудивительно, учитывая его возраст).

Да, это плотная, но сокровищница книги, поэтому я должен сказать, что согласен с @Recurse. Честно говоря, это чувствительная ко времени книга для студента (я бы, наверное, запутался пару лет назад).

0 голосов
/ 22 июля 2010

Однажды я использовал openArchitectureware для определения и использования DSL. oAW - это плагин для затмения, который теперь является частью среды моделирования затмений, но, конечно, его можно использовать и вне EMF.

Мне понравилось, потому что было довольно легко определить DSL, и oAW автоматически сгенерирует редактор с подсветкой syntacx и проверкой ошибок для DSL.

И он предоставляет механизм шаблонов, который довольно удобен, если вы планируете использовать документы, записанные в вашем DSL, для автоматической генерации Java, XML или других файлов.

(я связал старый URL-адрес oAW, потому что на странице все еще есть некоторые детали и все ссылки на страницы проекта eclipse)

...