天天看点

DSL简介

领域专用语言简介

主要回答几下几个问题 

1 什么是 DSL 

2 为什么使用 DSL 

3 何时使用 DSL

什么是 DSL

DSL(Domain Specified Language)领域专用语言。 

要理解什么是领域专用语言,需要先了解其创建背景。即为什么会诞生这样一种事物,其发明的目的是为了解决什么问题。

总的来说 DSL 是为了解决系统(包括硬件系统和软件系统)构建初期,使用者和构建者的语言模型不一致导致需求收集的困难。 

举一个具体的例子来说。在构建证券交易系统的过程中,在证券交易活动中存在许多专业的金融术语和过程。现在要为该交易过程创建一个软件解决方案,那么开发者/构建者就必须了解证券交易活动,其中涉及到哪些对象、它们之间的规则以及约束条件是怎么样的。那么就让领域专家(这里就是证券交易专家)来描述证券交易活动中涉及的活动。但是领域专家习惯使用他们熟练使用的行业术语来表达,解决方案的构建者无法理解。如果解决方案的模型构建者要理解交易活动,就必须让领域专家用双方都能理解的自然语言来解释。这种解释的过程中,解决方案的模型构建者就理解了领域知识。这个过程中双方使用的语言就被称为“共同语言”。

共同语言称为解决方案模型构建者用来表达解决方案中的词汇的基础。构建者将这些共同语言对应到模型中,在程序中就是模块名、在数据模型中就是实体名、在测试用例中就是对象。

在上面的描述,可以看到在需求收集的过程中,如果要成功构建模型,则需要一种领域专家和构建者(也就是通常的领域分析师/业务分析师)都能理解的“共同语言”。但是这种共同语言的创建过程没有保证,不能够保证在收集过程中得到的信息完整的描述了领域活动中所有的业务规则和活动。

如果能够让领域专家通过简单的编程方式描述领域中的所有活动和规则,那么就能在一定程度上保证描述的完整性。

DSL 就是为了解决这个问题而提出的。

常见的 DSL

  • 软件构建领域 Ant
  • UI 设计师 HTML
  • 硬件设计师 VHDL

DSL 的特点

  • 用于专门领域,不能用于其他领域
  • 表现力有限
  • 不描述解答域,仅描述问题域

DSL 与通用编程语言的区别

  • DSL 供非程序员使用,供领域专家使用
  • DSL 有更高级的抽象,不涉及类似数据结构的细节
  • DSL 表现力有限,其只能描述该领域的模型,而通用编程语言能够描述任意的模型

DSL 分类

要理解DSL 分类需要先理解一个概念。“元语言抽象”。 

它是指通过一种语言来构建另一种语言。比如 Java 就是构建在 C 上的语言。 

其中,从什么语言构建而来,这种构建来源的语言称为“宿主语言”。

根据是否从宿主语言构建而来,DSL 分为:

  • 内部 DSL(从一种宿主语言构建而来)
  • 外部 DSL(从零开始构建的语言,需要实现语法分析器等)

还有一种属于外部DSL的“非文本DSL”,即尽量使用图形化表述。比如 JetBrains 的 MPS。

我们通常所用的框架实际上就是一种内部 DSL。比如 Rails 框架就是基于 Ruby 的用于 Web 开发领域的内部 DSL。

如何构建 DSL

构建DSL 要满足三个原则:

  • 能够完整描述领域
  • 简单易用
  • 隐藏实现细节

何时使用 DSL

DSL 的构建难度比较大,从零构建不合适。建议使用比较完善的构建。

背后的概念

简单的领域建模

继续阅读