领域特定语言

2008年5月15日

领域特定语言 (DSL) 的基本概念是一种针对特定类型问题的计算机语言,而不是针对任何类型软件问题的通用语言。自从计算机出现以来,领域特定语言就一直被讨论和使用。

DSL 在计算领域非常常见:例如 CSS、正则表达式、make、rake、ant、SQL、HQL、Rails 的许多部分、JMock 中的期望、graphviz 的 dot 语言、FIT、strut 的配置文件……

我做了一个重要且有用的区分,即内部 DSL 和外部 DSL。内部 DSL 是使用宿主语言的特定方式,使宿主语言具有特定语言的感觉。这种方法最近因 Ruby 社区而流行起来,尽管它在其他语言(尤其是 Lisp)中有着悠久的历史。虽然在低仪式性的语言(如 Ruby)中通常更容易,但您可以在更主流的语言(如 Java 和 C#)中进行有效的内部 DSL。内部 DSL 也称为嵌入式 DSL 或 流畅接口

外部 DSL 具有自己的自定义语法,您需要编写一个完整的解析器来处理它们。在 Unix 社区中,这样做有着非常悠久的传统。许多 XML 配置最终都变成了外部 DSL,尽管 XML 的语法不太适合此目的。

当今最常见的 DSL 是文本形式的,但您也可以使用图形 DSL。图形 DSL 需要类似于 语言工作台 的工具。语言工作台不太常见,但许多人认为它们有可能深刻地改变我们编程的方式。

DSL 可以通过解释或代码生成来实现。解释(读取 DSL 脚本并在运行时执行)通常最简单,但有时代码生成是必不可少的。通常,生成的代码本身就是一种高级语言,例如 Java 或 C。

我在 2010 年底出版了 一本关于 DSL 的书。我有一个 指南页面,我在其中汇总了我关于 DSL 的工作。