我想在我的应用程序中嵌入dsl或现有的完整语言。它应该是一个简单,完整的图灵完整语言,但是简单而且足够轻,可以在不需要太多开销的情况下解释代码。
其他“进程”也不会影响任何其他进程。
我正在考虑使用Clojure并在Clojure代码上调用Clojure解释器/运行时编译器,但Clojure运行时需要比我需要的时间长得多。此外,我对使用Clojure语言进行此项目并不过分兴奋。我在考虑更多程序性和类似C语言。
我考虑过Ola Bini的Ioke语言。 http://ioke.org/index.html
另外,我考虑在Scala中编写DSL?或者使用现有的DSL。
更新:看起来Rhino是一个很好的示例嵌入式语言。
答案 0 :(得分:14)
JavaScript怎么样?
http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html
它内置于Java 6。
答案 1 :(得分:9)
Groovy的动态特性非常适合编写DSL。事实上,Grails Web框架实现了大量Groovy DSL,以及大量教程和书籍,教授如何使用Groovy编写DSL。
另外,Groovy的语法几乎是Java的超集,所以它应该相对容易上手(与Clojure相比)。在Java和Groovy代码之间调用是无缝的,因此您可以轻松地在Groovy代码中使用所有您喜欢的JDK类。
我倾向于避免IOKE因为它不成熟而且出于DSL的目的,我认为像Groovy或JavaScript这样的动态类型语言是比Scala更好的选择。
答案 2 :(得分:2)
我建议使用Java。它是:众所周知,快速,易于与Java集成,稳定,静态类型,易于迁移的代码等等。
答案 3 :(得分:2)
查看scripting.dev.java.net以获取用于在Java应用程序中嵌入其他语言的脚本引擎列表。请注意,一些引用的语言现在附带了自己的JSR 223集成,因此不需要第三方库来使用它们。
答案 4 :(得分: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语言,而不是稍微更改一下代码。
答案 5 :(得分:-1)
根据你的规范,一个小的BrainF * ck翻译应该没问题。)
如果它不是完全您的想法,那么请考虑您想要解决的问题。你的案例研究是什么?是否能够在以后随意添加新代码而无需重新部署应用程序的新版本?