2

我想在我的应用程序中嵌入 dsl 或现有的完整语言。它应该是一种简单、完整的图灵完备语言,但足够简单和轻便,可以在没有太多开销的情况下解释代码。

其他“过程”也不能影响任何其他过程。

我正在考虑使用 Clojure 并在 Clojure 代码上调用 Clojure 解释器/运行时编译器,但 Clojure 运行时所需的时间比我需要的要长得多。此外,我对在这个项目中使用 Clojure 语言并不过分兴奋。我在想更多的程序化和类似 C 的东西。

我考虑了 Ola Bini 的 Ioke 语言。http://ioke.org/index.html

另外,我考虑过在 Scala 中编写 DSL 吗?或者使用现有的 DSL。

更新:看起来 Rhino 是一个很好的示例嵌入式语言。

http://www.mozilla.org/rhino/tutorial.html

4

6 回答 6

14

JavaScript 怎么样?

http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

它内置于 Java 6。

于 2009-10-20T21:55:13.863 回答
9

Groovy 的动态特性非常适合编写 DSL。事实上,Grails Web 框架实现了大量的 Groovy DSL,并且有大量教程和书籍教授如何使用 Groovy 编写 DSL。

此外,Groovy 的语法几乎是 Java 的超集,因此它应该相对容易上手(与 Clojure 相比)。Java 和 Groovy 代码之间的调用是无缝的,因此您可以在 Groovy 代码中轻松使用所有您喜欢的 JDK 类。

我倾向于避免使用 IOKE,因为它不成熟,出于 DSL 的目的,我认为像 Groovy 或 JavaScript 这样的动态类型语言比 Scala 更好。

于 2009-10-20T21:53:00.977 回答
2

我建议Java。它是:众所周知、快速、易于与 Java 集成、稳定、静态类型、易于迁移代码等。

于 2009-10-20T22:22:00.853 回答
2

查看scripting.dev.java.net以获取用于在 Java 应用程序中嵌入其他语言的脚本引擎列表。请注意,一些引用的语言现在带有自己的 JSR 223 集成,因此不需要 3rd 方库来使用它们。

于 2009-10-21T09:38:16.880 回答
1

如果你想要一个 DSL,那么你真的不想嵌入现有的语言,你想创建一个“领域特定语言”。对我来说,这不仅仅意味着更改一些关键字而不使用括号。

例如,我现在正在做电视节目安排。当我们为测试创建虚假指南数据时,我们总是添加如下所示的注释(直接从我正在处理的测试中删除):

 * TIME:8.....30....9.....30....10....30....11....30....12....30....
 * 4FOX:____________[Spotlight.............][Jeopardy..]____________
 * 6CBS:[Heroes....][Heroes....][Heroes....]________________________
 * 8HMK:xx[A.River.Runs.Through.It....][Blades.Of.Glory...]_________

如果我必须创建更多指南数据,我将直接将这些注释解释为 DSL(使它们成为长字符串或字符串数​​组而不是注释)。

那将是一个合适的DSL。

如果您刚刚嵌入了一种灵活的语言,那么 Groovy 或 JRuby 都是为此而设计的,BeanShell 也是如此。

事实上,有一个完整的 API 围绕可替换的插件脚本语言构建,因此您应该能够使用任何您想要的 JVM 语言,而无需稍微更改您的代码。

于 2009-10-20T22:11:22.090 回答
-1

根据您的规范,一个小的 BrainF*ck 解释器应该没问题:)

如果这与您的想法不完全一样,请考虑您要解决的问题。你的案例研究是什么?是否能够在以后随意添加新代码而无需重新部署应用程序的新版本?

于 2009-10-20T22:54:03.173 回答