在Java上使用DSL的第一步?

在Java上使用DSL的第一步?,java,language-design,Java,Language Design,伙计们。。。女孩们,我正在做一个项目,我认为可以通过实现一种特定于领域的语言来为某种类型的工作流程定义一套规则和/或条件,从而增强这个项目 我想牢牢掌握这个主题、基础知识、最佳实践等,特别是如何用Java实现它们 你有什么建议?正如其他人评论的那样,Java确实不是创建DSL的好选择。Scala、Clojure、Groovy、Ruby/JRuby都是不错的选择。然而,考虑到您正在考虑使用Java,我认为Groovy或Scala似乎是最自然的选择。对于这两种语言,java开发人员的学习过程是相当缓

伙计们。。。女孩们,我正在做一个项目,我认为可以通过实现一种特定于领域的语言来为某种类型的工作流程定义一套规则和/或条件,从而增强这个项目

我想牢牢掌握这个主题、基础知识、最佳实践等,特别是如何用Java实现它们


你有什么建议?

正如其他人评论的那样,Java确实不是创建DSL的好选择。Scala、Clojure、Groovy、Ruby/JRuby都是不错的选择。然而,考虑到您正在考虑使用Java,我认为Groovy或Scala似乎是最自然的选择。对于这两种语言,java开发人员的学习过程是相当缓慢的。以下是一些可以帮助您入门的链接:


首先,我建议您阅读Kernighan和Pike的《圣经》第9章(记谱法)

完成后,请带着具体问题回到这里,讨论如何将该章中的概念映射到您想要解决的问题的具体设计

基本模式是编写一个解释器,该解释器被传递一个“command”参数,可能还有一个“environment”参数,并(在环境中)执行命令。然后,您可以选择编写解析器,该解析器接受“脚本”字符串并将其转换为有效的“命令”对象(即外部DSL);或者,您提供一个库来帮助用户以您正在使用的相同语言(内部DSL)显式构建“command”对象

Kernighan和Pike很好地展示了解释器的琐碎和复杂程度。如果您想要更深入的了解,那么我建议您阅读Daniel Friedman等人的著作。该著作每章至少构建一个不同的解释器,并演示如何实现变量、函数、作用域、对象、类、静态类型和连续性等功能

不过,我建议您先尝试一下简单的DSL,否则这都只是理论——如果您以前的经验使一本书变得相关和实用,那么它会更有趣。

我曾经定义和使用过DSL。oAW是eclipse的插件,现在是eclipse建模框架的一部分,但当然它也可以在EMF之外使用

我喜欢它,因为它很容易定义DSL,oAW将自动生成一个编辑器,其中包含syntacx高亮显示和DSL的错误检查

如果您打算使用DSL中编写的文档自动生成Java、XML或其他文件,它还提供了一个模板引擎,这非常方便


(我链接了旧的oAW URL,因为该页面仍然提供了一些细节和指向eclipse项目页面的所有链接)

只是@Recurse的一个补充。我实际上在做他提到的第9章中的正则表达式示例,直到我更改了主函数中的一行,它才起作用:

            if (grep(argv[1], f, argc>3 ? argv[i] : NULL) > 0)
应该是:

            if (grep(argv[1], f, argc>2 ? argv[i] : NULL) > 0)
注意argc>2。从那以后,它对我起了作用。书上没有勘误表(考虑到它的年代,这并不奇怪)


是的,这是一本密集但珍贵的书,所以我不得不说我同意@Recurse。老实说,这本书对学生来说是一本时间敏感的书(几年前我可能会感到困惑)。

严肃的建议:使用Groovy、Scala或Clojure实现它。这完全取决于您希望DSL有多复杂。+1不使用Java。如果有的话,我会使用Ruby(或JRuby),我使用Java脚本API和JavaScript绑定来提供脚本支持,从而允许用户编写脚本,在本地或远程运行和测试我的Java应用程序。它可以被定义为DSL解决方案吗?如果我不清楚,我的建议是:1。阅读《编程实践》第9章。2.尝试实现一个简单的DSL3。遇到麻烦时问具体问题4。当你开始想在你的DSL中包含更像“编程”的功能时,请阅读编程语言的要点,例如变量、函数、作用域等。有趣的是,我现在打开了那本书的第216页,我想我应该在谷歌上搜索“符号”和作者的名字,这就出现了。我很高兴能读到这一章(我只花了8美元就买到了这本书!)哇,我一直在玩regex one,而且(对我来说)225页上有一个小错误,我在他们的勘误表中看不到。如果您正在这样做:对grep的调用应该是如果(grep(argv[1],f,argc>2?argv[i]:NULL)>0)/*而不是argc>3*/忘记我的最后一条注释,看看下面的“补充答案”(代码可以在注释之外更容易地阅读),我肯定会看看Scala和Groovy:)