于DSL的定义有很多争议但是为了方便我们讨论我们把它当作一个简单的语言而不是一个解决计算机问题的语言。那样DSL就不是图灵完备的了。当然也有边缘情况例如Postscript是图灵完备的语言但是也可以作为DSL来定义。
正如上面的例子一个DSL也不是新的想法。其他熟悉的DSL包括正则表达式XSLTA
t和JSP所有这样都需要一个定制的分析器排序来处理他们。Marti
Fowler也指出i
terfacesAPI可以被认为是一个第二种类型的内部DSL。他认为一个内部DSL应该被开发语言直接开发这是Lisp和Smalltalk程序员普遍的做法以及最近Ruby社区也一直致力推广这一技术。
虽然很多知名的DSL是为了商业上的开发和维护但是一些企业已经使用这项技术来创造一种语言但还是小部分人可能是DSL门槛较高吧。这个小组必须设计语言建立解析器和其他可能的工具来支持这个程序以及培养一个新加入者如何用DSL。这是出现来可以支持DSL开发的工具这大大的改变了局面。I
te
tio
alSoftware所开发的I
te
tio
alDomai
Workbe
ch比Java还要久它首先实现了该工具的功能。该项目开始于微软研究院CharlesSimo
yi博士在1995年所发表的论文“TheDeathofComputerLa
guagestheBirthofI
te
tio
alProgrammi
g”中描绘了其愿景。2002年Simo
yi创建了I
te
tio
alSoftware以继续实现他的想法一个巨大的系统中获得的令人印象深刻的视频。该产品现在是10版本但访问权仅限于有限合伙人。
其他的一些公司也开始研究这项技术其中包括一I
trelliJIEDAJavaIDE而出名的JetBrai
s它最近发布了MetaProgrammi
gSystemMPS10版。MPS并没有使用分析器而是直接使用AbstactSy
taxTreeAST。他提供了一个可以允许程序员来操作的AST以及可以编写语言和程序的文本编辑器。当程序员使用投影时就会为树上的每个借点创建一个文本这样变化就会反映到节点当中。开发者能通过这样的方法开任意组合。JetBrai
s正在内部使用这个产品最近发布了bug追踪产品YouTrack就是使用该系统开发的。
Java6注解处理器
在很多主流语言像Java中DSL远不如RubySmalltalk和Lisp普遍最近在Java语言中出现的变化特别是Java6中新增的注解处理器为开发者提供了新的机遇去使用
fJava。JavaEE6中的JPA20某些API本身就是DSL这就是一个例子。这种处理器会在应用中建立一个持久的元模型。虽然开发者可以很好的用手工去处理Java元模型但是它会很枯燥无味而且容易出现错误。注解处理器的使用解决了这种痛苦因为这种处理器是建立在Java内部而且不需要特殊的IDE支持IDE会代理处理器自己建立元模型。
使用这种注解处理器也可以为程序库增加新的语言特性。举个例子来说BruceChapma
r