Какой язык (который работает на JVM) лучше всего подходит для создания DSL?
У нас есть требование создавать сложные строки фиксированной длины и переменной длины. Эти строки могут представлять профиль клиента, заказ и т. Д. Какой язык программирования на основе JVM вы, ребята, предлагаете?
Идея заключается в том, чтобы конечный пользователь создал строки, используя этот DSL. Поэтому я ищу проверки, дополнения кода и т. Д.
8 ответов
С Xtext ( http://www.eclipse.org/Xtext/) вы получаете бесплатный редактор при указании DSL.
Используйте Лисп, который работает на JVM. Некоторые варианты у вас есть:
Есть хорошая бесплатная книга, которая объясняет, как использовать Lisp для разработки программного обеспечения снизу вверх, то есть, как вырастить Lisp в язык, который идеально подходит для решения поставленной задачи.
Языки в семье Forth также отлично подходят для определения DSL. Некоторые из них работают на JVM:
Есть два типа DSL; внешний и встроенный.
Внешний DSL полностью отделен от вашего языка хоста, т.е. вы пишете его вне языка, но обычно используется для генерации кода на языке хоста. Для этого подхода XText с XPand, вероятно, являются лучшими инструментами, поскольку простой файл грамматики генерирует полный редактор на основе Eclipse для нового DSL, и вы можете использовать шаблоны кода в XPand для генерации реального кода Java. XTend и XPand написаны на Java, но это случайно, так как они могут быть написаны на чем угодно, если в конце процесса вы получите Java-код. Недостатком этого подхода является то, что для любой достаточно сложной проблемы язык станет довольно сложным, и потребуется много работы по грамматике и даже больше по шаблонам генерации кода. Вы не можете использовать какие-либо функции на главном языке, такие как оценка выражений, поэтому все это необходимо перестроить в DSL, если вам это нужно. XText в ближайшее время будет включать XBase, который является частичным языком, который будет включать выражения, чтобы помочь здесь.
Другой подход - это встроенный DSL, в котором высокоуровневые доменные функции выражаются на языке хоста либо с помощью конструкций более высокого порядка (таких как HOF и монады), обычно встречающихся в функциональных языках, либо с помощью средств метапрограммирования, таких как макросы (например, Lisp). В Java нет ни одного из них, поэтому это плохой выбор для работы с DSL (или большинством других форм абстрактного программирования). Spring Roo предлагает средство типа метапрограммирования для Java с использованием генерации, так что может быть вариант. В противном случае Scala, вероятно, самый популярный язык Java, как JVM, и обладает необходимыми средствами.
Встроенные DSL обычно намного проще, чем внешние DSL, потому что у вас есть полная поддержка основного языка, поэтому я рекомендую попробовать Scala.
Скала полностью! Scala особенно подходит для внутренних DSL (пожалуйста, обратитесь к этому).
Я предложу Джруби. Я сделал несколько, и всегда было довольно легко получить то, что я хочу.
Похоже, проблема для шаблонизатора Apache Velocity. Это библиотека Java с синтаксисом шаблонов или DSL, если хотите.