03-DSL分类
14.1.2 DSL分类
根据是否从宿主语言构建而来,DSL可分为内部DSL和外部DSL,它们的关系和区别包括以下几点。
- 内部DSL:从某一种宿主语言构建而来。
- 外部DSL:无宿主语言,需要实现具体的语法分析器等。
1.内部DSL
内部DSL是指与项目中使用的通用目的编程语言紧密相关的一类DSL,这些语言包括Java、C#或Ruby等,它基于通用编程语言实现。例如Rails框架,它被称为基于Ruby的DSL,用于管理Ruby开发的Web应用程序。Rails之所以被称为DSL,是因为Rails应用了一些Ruby语言的特性,使得基于Rails编程看上去与基于通用目的的Ruby语言编程并无不同。
根据《领域特定语言》的作者Martin Fowler的观点,框架或者程序库的API是否满足内部DSL的关键特征之一就是它是否有一个流畅(fluent)的接口。这样,就可以用很多短小的对象表达式去组织一个原本很长的表达式,使它读起来更加自然。
2.外部DSL
外部DSL与通用编程语言(GPL)类似,但是外部DSL更专注于特定领域。创建外部DSL和创建通用编程语言的过程是相似的,它可以是编译型的编程语言,也可以是解释型的编程语言。它具有形式化的语法,只允许使用良好定义的关键字和表达式类型。经过编译的DSL通常不会直接产生可执行的程序,但外部DSL是可以的。
大多数情况下,外部DSL可以转换为一种与核心应用程序的操作环境相兼容的资源,也可以转换为用于构建核心应用的通用目的编程语言。例如,在后端Hibernate框架中使用的对象—关系映射文件,就是外部DSL转换为资源的实例。