【问题标题】:Which language (that runs on JVM) is best suited for creating a DSL?哪种语言(在 JVM 上运行)最适合创建 DSL?
【发布时间】:2011-01-24 04:10:41
【问题描述】:

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

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

【问题讨论】:

  • 它必须有多快?您需要多长时间才能完成?
  • @EnabrenTane - 它不需要超快
  • 那么快呢?会很快吗?还是只有超快? j/k :p
  • 是否需要能够在 12 秒差距内完成 Kessel 运行?因为我不知道那个......

标签: java architecture jvm dsl dsl-tools


【解决方案1】:
【解决方案2】:

Use a Lisp 在 JVM 上运行。您有一些选择:

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

a good free book 解释了如何使用 Lisp 来设计软件自下而上,即如何发展 Lisp 成为解决问题的理想语言就在眼前。

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

  1. Niue
  2. Misty Beach Forth

【讨论】:

【解决方案3】:

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

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

另一种方法是嵌入式 DSL,其中高级域特征用宿主语言表达,或者使用功能语言中常见的高阶结构(如 HOF 和 monad)或通过宏等元编程工具(例如 Lisp )。 Java 没有这些,因此对于 DSL 工作(或大多数其他形式的抽象编程)来说是一个糟糕的选择。 Spring Roo 为使用生成的 java 提供了元编程类型工具,因此可能是一种选择。如果做不到这一点,Scala 可能是最像 Java 的 JVM 语言,它很流行并且拥有你需要的工具。

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

【讨论】:

  • 感谢详细的利弊,而不仅仅是说用我喜爱的时髦 jvm 语言来做
【解决方案4】:

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

【讨论】:

  • 我们广泛使用 oAW 来进行元模型和代码生成。根据我的经验,编辑很弱。它们还没有为面向客户的应用程序做好准备。
  • @Pangea:这可能是因为 oAW 已经两年没有维护了。 Xtext 是一个重写版本,它在上一个 Eclipse 发行版 (Galileo) 中达到了 1.0。该工具非常适合用例 - 它提供验证和自动完成、大纲、超链接、快速修复、突出显示等等。使用任何建议的语言,这些事情中的大多数都无法作为内部 DSL 来完成。
  • @Gabriel 感谢此更新。我现在会调查一下。如果您能指出使用新 Xtext 创建的 DSL 的文章和示例,不胜感激。
  • @Pangea 一些很好的例子可以在这里的官方 Xtext 页面上找到:eclipse.org/Xtext/community
  • Xtext 已经成熟。它得到了积极的维护和增强。如果您需要专业帮助,我还可以推荐 Itemis,这是 Xtext “背后”的公司(我根本不隶属于他们)。
【解决方案5】:

Scala 一路走好! Scala 尤其适用于内部 DSL(请参考this)。

【讨论】:

    【解决方案6】:

    我会为此推荐Groovy

    【讨论】:

      【解决方案7】:

      我会推荐 jruby。我已经做了一些,而且总是很容易得到我想要的。

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

        • 我需要一个 DSL。模板引擎不是一种选择。想法是让用户使用这个 DSL 创建字符串。我已经看过 Velocity、StringTemplate 等。
        • 那么数字是什么 DSL? Velocity 有一种语言,特别适合生成文本内容。它是一种领域特定语言。如果您有模板引擎及其语言无法满足的特定要求,您可能需要更好地描述这些要求。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多