在Java上使用DSL的第一步?

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

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

你有什么建议?

首先,我建议阅读Kernighan和Pike 的“编程实践”第9章(符号)。

完成后,请回到此处,了解如何将该章中的概念映射到您想要解决的问题的特定设计。

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

Kernighan和Pike很好地展示了解释器的复杂程度和复杂程度。 如果你想要更深入,那么我建议阅读丹尼尔弗里德曼等人的“编程语言要点” 。 每章至少构建一个不同的解释器,并演示如何实现变量,函数,作用域,对象,类,静态类型和连续等function。

但是我建议你首先尝试一下这个简单的DSL,否则它只是理论 – 一本书在你以前的经验变得相关和实用时会更有趣。

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

  • 针对特定领域语言的Groovy(书)
  • DSLs – 强大的Scalafunction
  • Scala中的DSL组合技术

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

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

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

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

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