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

时间:2011-01-24 04:10:42

标签: java architecture jvm dsl dsl-tools

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

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

8 个答案:

答案 0 :(得分:8)

答案 1 :(得分:7)

在JVM上运行的

Use a Lisp。你有一些选择:

  1. Clojure
  2. JScheme
  3. SISC
  4. ABCL
  5. Bigloo(不在JVM上运行,但具有良好的Java互操作性)。
  6. a good free book解释了如何使用Lisp设计软件自下而上,即如何 成长为一种理想的语言手头的问题。

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

    1. Niue
    2. Misty Beach Forth

答案 2 :(得分:6)

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

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

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

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

答案 3 :(得分:5)

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

答案 4 :(得分:4)

Scala一路走来! Scala特别适用于内部DSL(请参考this)。

答案 5 :(得分:2)

我会为此推荐Groovy

答案 6 :(得分:0)

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

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

答案 7 :(得分:-2)

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