当前位置:嗨网首页>书籍在线阅读

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转换为资源的实例。