在Java上使用DSL的第一步?

时间:2010-07-22 04:12:19

标签: java language-design

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

我希望能够牢牢掌握主题,基础知识,最佳实践等,特别是如何使用Java以某种方式实现它们。

你有什么建议?

4 个答案:

答案 0 :(得分:8)

首先,我建议您阅读Kernighan和Pike的The Practice of Programming第9章(符号)。

完成后,请回到此处,提出有关如何将该章中的概念映射到您想要解决的问题的具体设计的具体问题。

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

Kernighan和Pike很好地展示了翻译人员的琐碎程度和复杂程度。如果你想要更深入,那么我建议你阅读Daniel Friedman等人的The Essentials of Programming Languages。每章至少构建一个不同的解释器,并演示如何实现变量,函数,范围,对象,类,静态类型和延续等功能。

然而,我建议你首先尝试一个简单的DSL,否则它只是理论 - 当你的书经验与以前的经验相关和实用时,这本书会更有趣。

答案 1 :(得分:3)

正如其他人所评论的那样,Java确实不是创建DSL的绝佳选择。 Scala,Clojure,Groovy,Ruby / JRuby都是不错的选择。但是,考虑到您正在考虑使用Java,我认为Groovy或Scala似乎是最自然的选择。对于这两种语言,Java开发人员的学习曲线非常渐进。以下是一些可以帮助您入门的链接:

答案 2 :(得分:0)

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

我喜欢它,因为定义DSL非常容易,oAW会自动生成一个编辑器,其中包含针对DSL的syntacx突出显示和错误检查。

如果您计划使用在DSL中编写的文档来自动生成Java,XML或其他文件,它提供了一个非常舒适的模板引擎。

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

答案 3 :(得分:0)

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

            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。老实说,这对学生来说是一本对时间敏感的书(几年前我可能会感到困惑)。