原文地址:http://blog.csdn.net/u010278882/article/details/50554299

主要回答几下几个问题 
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 的构建难度比较大,从零构建不合适。建议使用比较完善的构建。

背后的概念

DSL 是在需求分析阶段中为了解决需求收集过程中需求描述方(遇到问题方/问题描述者[注意:遇到问题方通常是客户或者用户,而描述方通常是出现该问题的所在行业的专家,这两个角色可能是同一个人,也可能是不同的人])与解决方案提供方(构建者)间互相理解困难而设计的专门工具。在需求收集中,首先需要理解问题方遇到的问题,然后将其映射到解决方案提供方的解决技术上。用术语描述的话,问题描述者(描述领域活动的背景和问题)称为“领域专家”,其使用“行话”来说明;解决方案提供者称为“模型构建者”,其通过对领域活动及其问题的理解,加上对技术解决方案的理解,提出解决方案模型。该模型最终映射到技术方案中。这个过程中的活动成为“领域分析/领域建模”。其目的是确定并理解领域中的重要元素、过程以及其间的关系。

简单的领域建模

我(模型构建者/业务分析师):“你来描述一下你的日常工作/生活的活动和过程” 
领域专家:(他会习惯使用行话来描述) 
我:(不理解)”你能用我们日常使用的语言来描述一下吗?“ 
领域专家:(他仍然会习惯性的使用行话来进行解释) 
我:(通过不断的询问来手机领域信息(即问题域)以及问题) 
我:(最终整理出领域模型[需求分析的结果],接下来用技术方案(即解决域)来对问题域中的问题设计出解决方案[最终的解决方案/产品/项目])

领域专用语言(DSL)简介相关推荐

  1. 【Kotlin】Kotlin 领域特定语言 DSL 原理 二 ( 中缀表达式 )

    文章目录 I . 中缀表达式 ( 中缀调用 ) II . 中缀表达式 ( 中缀调用 ) 示例代码 I . 中缀表达式 ( 中缀调用 ) 1 . 中缀表达式作用 : 中缀表达式是 Kotlin 领域特定 ...

  2. 【Kotlin】Kotlin 领域特定语言 DSL 原理 一 ( DSL 简介 | 函数 / 属性扩展 )

    文章目录 I . DSL 简介 II . Kotlin 函数扩展 III . Kotlin 属性扩展 I . DSL 简介 1 . DSL ( Domain Specific Language ) 领 ...

  3. 使用Xtext/Xtend 实现域专用语言DSL(2)

    在前面的几篇博文中,我们已经介绍了如何用Xtext 来描述一个领域特定语言(DSL)的方法,你通常要对已经语法分析的EMF 模型(也就是语法抽象树AST)进行某种处理,比如转换成为另一种语言(例如Ja ...

  4. ·使用Xtext/Xtend 实现域专用语言DSL(1)

    本博文通过一个简单的例子介绍如何使用Xtext 编写一个简单DSL 的语法. 建立一个DSL语言 假设我们要建立一个DSL 语言来描述一个会议的信息:最终的描述文本是这样的: datatype Str ...

  5. dsl java 语言_Java DSL简介(收集整理)

    一.领域特定语言(DSL) 领域特定语言(DSL)通常被定义为一种特别针对某类特殊问题的计算机语言,它不打算解决其领域外的问题.对于DSL的正式研究已经持续很多年,直 到最近,在程序员试图采用最易读并 ...

  6. drools 7.x 领域语言dsl详细语法

    1 领域特定语言(DSL) 我们将要讨论的第一个关于DRL的抽象是领域特定的语言,或者仅仅是DSL. DSL是为特定上下文定制DRL的一种很好的方法. Drools DSL背后的概念很简单.创建一个包 ...

  7. DSL 领域特定语言

    一.DSL介绍 DSL(Domain Specific Language)是针对某一领域,具有受限表达性的一种计算机程序设计语言. 常用于聚焦指定的领域或问题,这就要求 DSL 具备强大的表现力,同时 ...

  8. 【转】开发者需要了解的领域特定语言(DSL)

    转自:开发者需要了解的领域特定语言(DSL) - 知乎 领域特定语言是在特定领域下用于特定上下文的语言.作为开发者,很有必要了解领域特定语言的含义,以及为什么要使用特定领域语言. 领域特定语言doma ...

  9. 开发者需要了解的领域特定语言(DSL)

    领域特定语言是在特定领域下用于特定上下文的语言.作为开发者,很有必要了解领域特定语言的含义,以及为什么要使用特定领域语言. 领域特定语言 domain-specific language (DSL)是 ...

最新文章

  1. 3模型大小_分布式训练中数据并行远远不够,「模型并行+数据并行」才是王道...
  2. java 算法 排序算法_Java七种排序算法以及实现
  3. codevs2574 波兰表达式
  4. laravel中migrate的使用
  5. 矩阵快速幂及斐波那契数列模板
  6. 地表水预测模型软件_前沿科技 | 中科院等科学家合作研究开发出高速列车关键构件疲劳寿命预测软件系统...
  7. Objectc 基础类型
  8. Flutter AnimatedSwitcher 实现优美的图片切换动画
  9. python续行_python 控制台单行刷新,多行刷新
  10. Xcode之断点调试
  11. Unity Koreographer 之 音乐制作插件介绍学习,一般使用步骤介绍(包括:一般音乐游戏制作流程简绍) 一
  12. Postman下载与安装操作步骤(只有两步骤下载)
  13. yolov3模型训练——使用yolov3训练自己的模型
  14. 华为员工离职心声:菊厂15年退休,感恩,让我实现了财务自由!
  15. php 页面日历形式显示,日历页面展示-PHP制作阴阳历转换的日历插件-PHP中文网教程...
  16. 年度回顾篇:2018年的亚马逊,众生虽苦,诸恶莫作
  17. 路由器桥接成功后,仍然没有网络
  18. java mediator_Java 实现中介者(Mediator)模式
  19. php 什么是占位符,php中的占位符
  20. 剑指数据仓库-Hive02

热门文章

  1. 松下机器人进行数据备份与恢复的具体方法
  2. oracle通过软连接裸设备建库
  3. 如何再IED中搭建webService服务器
  4. [SSL证书].pfx格式和.Cer格式的区别以及格式互相转换
  5. 评分高的前端书籍推荐(上)—好书知时节
  6. 中质协和优思学院的六西格玛认证
  7. [Matlab] 使用 solve 和 null 代替 eig 求解特征方程可能得到不一样的结果
  8. The following paths are ignored by one of your .gitignore files
  9. python调用ECMWF欧洲中心api下载数据
  10. 零基础能学好UI设计吗 相关学习规划是什么