领域特定语言指南

领域特定语言 (DSL) 是一种针对特定类型问题的计算机语言,而不是针对任何类型软件问题的通用语言。领域特定语言的讨论和使用几乎与计算的历史一样悠久。

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

我所做的一个重要且有用的区分是内部 DSL 和外部 DSL。内部 DSL 是使用宿主语言的特定方式,使宿主语言具有特定语言的感觉。这种方法长期以来一直是 Lisp 传统的一部分,并在过去十年中被 Ruby 社区重新赋予活力。虽然在像这样低仪式感的语言中通常更容易,但您可以在更主流的语言(如 Java 和 C#)中有效地使用内部 DSL。内部 DSL 也称为嵌入式 DSL 或流畅接口

外部 DSL 具有自己的自定义语法,您需要编写一个完整的解析器来处理它们。在 Unix 社区中,这样做有着悠久的传统。这种方法的一种变体是将 DSL 编码为数据结构表示形式,例如 XML 或 YAML。

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

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

martinfowler.com 上有关领域特定语言的资料指南。

领域特定语言

在 00 年代的最后几年,我对 DSL 的复兴产生了浓厚的兴趣,这得益于 Ruby 社区的努力、创建流畅接口的愿望以及语言工作台诱人但又模糊的前景。我看到相当多的项目使用了 DSL 的思想,但大多数人对构建和良好使用 DSL 的选择没有很好的认识。所以我决定通过写一本关于简单内部和外部文本 DSL 的模式的书来解决这个问题。虽然在过去的几年里,这种兴趣已经减弱了很多,但我仍然觉得这本书很好地捕捉到了这些技术。特别是,它阐明了使用自适应模型来捕获替代计算模型,例如规则引擎、决策表和状态机。

作者:Martin Fowler

2010

阅读更多…

书籍

DSL 问答

有人要求我为非技术人员整理一份关于 DSL 的讨论。也许我读了太多Stephen O'Grady的文章,但我感到有一种不可抗拒的冲动,想以问答的方式来做这件事。所以它来了。

作者:Martin Fowler

2008 年 9 月 9 日

阅读更多…

博客文章

领域特定语言

DSL 边界

当谈到领域特定语言这个话题时,一个常见的难题是究竟什么是 DSL,什么不是 DSL。问题在于,DSL 没有精确的定义,而且在 DSL 和其他事物之间存在很大的灰色地带。

作者:Martin Fowler

2006 年 8 月 1 日

阅读更多…

博客文章

领域特定语言

语言工作台:领域特定语言的杀手级应用程序?

软件开发中的大多数新思想实际上都是旧思想的新变体。本文介绍了其中之一,即我称之为语言工作台的一类工具的日益增长的想法,其例子包括 Intentional Software、JetBrains 的元编程系统和微软的软件工厂。这些工具采用了一种古老的开发风格——我称之为面向语言的编程,并使用 IDE 工具,试图使面向语言的编程成为一种可行的方法。虽然我不敢断言它们是否会实现其雄心壮志,但我确实认为这些工具是软件开发领域最有趣的东西之一。有趣到足以让我写这篇文章来尝试解释,至少是概述,它们是如何工作的,以及围绕它们未来用途的主要问题。

作者:Martin Fowler

2005 年 6 月 12 日

阅读更多…

文章

语言工作台

重构为自适应模型

我们的大多数软件逻辑都是用我们的编程语言编写的,这些语言为我们提供了编写和演化此类逻辑的最佳环境。但在某些情况下,将该逻辑移动到我们的命令式代码可以解释的数据结构中是很有用的——我将其称为自适应模型。在这里,我将展示一些 JavaScript 中的产品选择逻辑,并展示如何将其重构为以 JSON 编码的简单生产规则系统。此 JSON 数据允许我们在使用不同编程语言的设备之间共享此选择逻辑,并在不更新这些设备上的代码的情况下更新此逻辑。

作者:Martin Fowler

2015 年 11 月 19 日

阅读更多…

文章

重构 领域特定语言

业务可读 DSL

DSL 是否允许业务人员在不涉及程序员的情况下编写软件规则?

当人们谈论 DSL 时,通常会提出业务人员自己编写代码的问题。我喜欢将 COBOL 推论应用于这种思路。也就是说,COBOL 的最初目标之一是允许人们在没有程序员的情况下编写软件,我们知道结果如何。因此,当任何计划在没有程序员的情况下编写代码时,我不得不问,这次有什么特别之处,可以让它在 COBOL(以及许多其他事物)失败的地方取得成功。

作者:Martin Fowler

2008 年 12 月 15 日

阅读更多…

博客文章

领域特定语言

语法噪音

在谈论领域特定语言(或实际上是任何计算机语言)时,一个常见的短语是语法噪音。人们可能会说 Ruby 比 Java 的噪音小,或者外部 DSL 比内部 DSL 的噪音小。语法噪音是指那些不是我们真正需要表达的意思的一部分,而是为了满足语言定义而存在的无关字符。噪音字符是不好的,因为它们会掩盖我们程序的含义,迫使我们去费解它在做什么。

作者:Martin Fowler

2008 年 6 月 9 日

阅读更多…

博客文章

语言特性 领域特定语言

DSL 目录

我关于领域特定语言的书使用模式结构来组织我用来描述 DSL 的概念。此目录是该书中模式的列表。每个模式都链接到一个页面。虽然这些页面没有包含很多细节,但它们确实为每个模式提供了一个参考 URI。

作者:Martin Fowler

阅读更多…

目录