Какой язык (который работает на JVM) лучше всего подходит для создания DSL?

У нас есть требование создавать сложные строки фиксированной длины и переменной длины. Эти строки могут представлять профиль клиента, заказ и т. Д. Какой язык программирования на основе JVM вы, ребята, предлагаете?

Идея заключается в том, чтобы конечный пользователь создал строки, используя этот DSL. Поэтому я ищу проверки, дополнения кода и т. Д.

8 ответов

Решение

С Xtext ( http://www.eclipse.org/Xtext/) вы получаете бесплатный редактор при указании DSL.

Используйте Лисп, который работает на JVM. Некоторые варианты у вас есть:

  1. Clojure
  2. JScheme
  3. SISC
  4. ABCL
  5. Bigloo (не работает на JVM, но имеет хорошую совместимость с Java).

Есть хорошая бесплатная книга, которая объясняет, как использовать Lisp для разработки программного обеспечения снизу вверх, то есть, как вырастить Lisp в язык, который идеально подходит для решения поставленной задачи.

Языки в семье Forth также отлично подходят для определения DSL. Некоторые из них работают на JVM:

  1. Niue
  2. Мисти Бич Форт

Есть два типа 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 (пожалуйста, обратитесь к этому).

Я бы порекомендовал Groovy для этого.

Я предложу Джруби. Я сделал несколько, и всегда было довольно легко получить то, что я хочу.

http://www.artima.com/rubycs/articles/ruby_as_dsl3.html

Похоже, проблема для шаблонизатора Apache Velocity. Это библиотека Java с синтаксисом шаблонов или DSL, если хотите.

Другие вопросы по тегам