哪种语言(在JVM上运行)最适合创建DSL?

我们需要创建复杂的固定长度和可变长度的字符串。 这些字符串可能代表客户档案,订单等。您建议使用哪种基于JVM的编程语言?

想法是让最终用户使用此DSL创建字符串。 所以我正在寻找validation,代码完成等。

使用Xtext ( http://www.eclipse.org/Xtext/ ),您可以在指定DSL时免费获得一个漂亮的编辑器。

使用在JVM上运行的Lisp 。 你有一些选择:

  1. Clojure的
  2. JScheme
  3. SISC
  4. ABCL
  5. Bigloo (不在JVM上运行,但具有良好的Java互操作性)。

有一本很好的免费书籍解释了如何使用Lisp从头到尾设计软件,即如何将Lisp发展成一种理想的语言来解决手头的问题。

Forth系列中的语言也非常适合定义DSL。 有一些在JVM上运行:

  1. 纽埃
  2. Misty Beach Forth

有两种类型的DSL; 外部和嵌入式。

外部DSL与您的宿主语言完全分开,即您在语言之外编写它,但通常用于生成宿主语言的代码。 对于这种方法,带有XPand的XText可能是最好的工具,因为简单的语法文件为新的DSL生成一个完整的基于Eclipse的编辑器,您可以在XP中使用代码模板来生成实际的Java代码。 XTend和XPand是用Java编写的,但这是偶然的,因为它们可以用任何东西编写,只要你在流程结束时最终得到Java代码。 这种方法的缺点是,对于任何相当复杂的问题,语言将变得非常复杂,语法中需要大量工作,甚至代码生成模板中也需要更多工作。 您不能使用任何主机语言function,如表达式评估,因此如果您需要,所有这些都需要在DSL中重建。 XText将很快包含XBase,这是一种部分语言,将包含表达式以帮助解决此问题。

另一种方法是嵌入式DSL,其中高级域特征以宿主语言表达,或者通过function语言中常见的高阶构造(如HOF和monad)或通过诸如宏的元编程工具(例如Lisp)来表达。 Java既不具备这些function,也不适用于DSL工作(或大多数其他forms的抽象编程)。 Spring Roo为使用生成的java提供了元编程类型工具,因此可能是一个选项。 如果不这样做,Scala可能是最受Java欢迎的Java语言,并且拥有您需要的设施。

嵌入式DSL通常比外部DSL容易得多,因为您完全支持宿主语言,因此我的建议是尝试使用Scala。

Scala一路走来! Scala特别适用于内部DSL(请参阅此内容 )。

我会推荐Groovy 。

我会建议jruby。 我做了一些,总是很容易得到我想要的东西。

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

听起来像Apache Velocity模板引擎的问题。 如果您愿意,它是一个带有模板语法或DSL的Java库。