前面介绍过模型驱动开发(MDD)、软件工厂(Software factory)、特定领域建模 DSM(Domain Specific)等都是高抽象的开发方法,这些方法使用的语言都是特定领域语言(DSL)。相比于通用目的语言(C#/C++/JAVA/Delphi等)而言,DSL是一种为了特定任务而设计的开发语言,例如SQL是一种专门处理数据库的语言,本篇将介绍一下DSL。

一种语言

  我们熟知的编程语言(如C#、Ruby等)是一种通用语言,MDA基于UML语言,而模型驱动开发(MDD)基于DSL。DSL是一种基于特定领域的语言,它使工作更贴近于客户的理解,而不是实现本身,这样有利于开发过程中,所有参与人员使用同一种语言进行交流。

DSML

  DSML是 特定领域模型语言(domain-specific modelling language),之前介绍的MetaEdit+使用的DSM方法中使用的就是DSML,它是一种可以用来构建图形模型的一种DSL,DSM的GOPPRR就是一个用来构建DSML语言的元模型。

DSL涉及内容

  • 问题域、问题空间
  • 语法、语义
  • 案例、方法、工具

DSL架构

  • DSL脚本(DSL Script):每一个DSL的核心都是一个域模型,它定义了这一语言所代表的各种概念,这些概念的属性,以及它们之间的关系

    • 在问题域中用于构建、配置或者其他用途的一种语言
    • 可以是文本,也可以是图形,或者两者混合使用
      • 图形语言不只是图表,否则使用Visio之类的画图软件就行了,它实际上是要创建模型,这个模型要能够从概念上描绘你正在创建的系统,并对其内容进行图表化的表示。一个模型可以同时由多个图表来表示,每个图表表示模型的某个方面
      • 文本语言用户输入,可以快速的打字。
      • 文本语言的优势在于可以进行比较和合并,而图形表达式可以更容易的看出内容之间的关联。
      • 相对来说,文本语言比图形复杂
  • 语义模型(Semantic Model)
    • DSL脚本的一种内存完整表示
    • 有时候这个就是抽象语法树(AST)
    • 分离Parse和Generate
  • 生成代码(Generated Code):DSL的一个最重要的应用是用来生产简单的文本形式的工件,例如源代码、数据库脚本
    • DSL脚本的一种可执行表示
    • 解释语义模型

DSL应用的优点

  1. 高级别的重用:如果仅适用通用编程语言,则每次只能解决一个问题,但如果应用特定领域开发方法设计并实现一些特殊语言,每个特殊语言可以高效地解决一类相似的问题
  2. 使用DSL的软件架构可以跨接软件工程过程各阶段之间的鸿沟,特别是通过代码生成可以很好的进行设计和实现阶段的衔接
  3. 让领域专家参与开发过程,不仅仅是需求阶段,架构阶段也需要参与
  4. 通过在问题空间工作,可以让不熟悉如何实现技术的人,包括商业人士,也能够更了解模型
  5. 使用DSL表达的模型,可以在问题空间这个较高的抽象层次进行验证,这意味着可以在开发周期的更早期发现因为理解和表述而造成的错误。
  6. 一个模型中具备了重要的业务知识,将解决方案从一种技术迁移到另一种技术,或在同一技术的不同版本之间迁移,就变的相对容易。一般通过适当修改生成器或解释器就可以做到。

样式(Styles)

  之前在信息系统开发平台OpenExpressApp:【OpenTest】 之 如何实现自动化测试框架介绍了在OEA上使用Ruby语法实现的一个自动化测试语言,这个就属于内部DSL。而在OpenExpressApp对建模支持的初步计划中介绍的MetaModelEngie属于外部DSL。

  外部DSL可以摆脱内部DSL寄宿语言的限制,可以重新设计一种新的语言,但是增加了学习新的语言的学习成本,并且需要工具的支持。

设计DSL

  为了降低风险,我们并不是马上就从头开始开发框架及其DSL,而是应该从现有的可以在某些应用中使用的代码开始,逐步的对其进行参数化,逐步的发现那些在不同应用中变化的部分,然后使这些部分依赖于DSL。

  自上而下的方法倾向于快速建立一个完整且自包含的模型,具有更长远的考虑,有助于保证结构的一致性。但是从另一方面看,这种方法容易导致在概念层设计出很复杂的模型,并且该模型难于实现。因此在实际应用中,将自上而下和自下而上两种方法交替使用会更有效。采用渐进的方式可以避免早期投入过大风险,但是需要定期进行一致性检查。

  在《Visual Studio DSL工具特定领域开发指南》书中对设计DSL做了如下步骤:

  1. 识别可变性与发现DSL:DSL是用你的框架具体的实现你的体系架构模式中可变的部分
  2. 开发领域模型捕获可变性
  3. 定义标记:在适当的地方使用常见标记法或与标记法相关的约定
  4. 开发验证的约束:识别树形之间的依赖性,认出快照中的强制或禁止的循环
  5. 开发并演进框架:理解你的DSL针对的代码体系结构,并在框架中编写它
  6. 测试DSL:包括验证的约束与规则、生成器与命令、以及生成的代码
  7. 演化和移植DSL:确保旧的模型在新版本的DSL中能够使用
  8. 识别好的DSL:范围、最小性、常见标记法,适度的冗余,合理的使用句法空间,使用用户术语

应用场景

  ......

书籍

Martin Fowler花了几年时间写了一本DSL的书籍《Domain Specific Languages》,我还没有看,感兴趣的可以先看看它在网站上写的系列文章 Domain Specific Languages

Best Practices for DSLs and Model-Driven Development

读书笔记:Visual Studio DSL工具特定领域开发指南

DSL的演进

转载于:https://blog.51cto.com/zhoujg/403112

DSL(Domain Specific Language)介绍相关推荐

  1. Elastic Stack核心技术实战02--Elasticsearch中的Domain Specific Language详解

    上一篇博客中给大家介绍了Elasticsearch单机版的环境搭建以及简单的增删改查,今天我们就来学习一下Elasticsearch的Domain Specific Language,也就是我们常说的 ...

  2. MDSF:DSL(Domain Specific Language)介绍

    前面介绍过模型 驱动开发(MDD) .软件 工厂(Software factory) .特定领 域建模 DSM(Domain Specific) 等都是高抽象的开发方法,这些方法使用的语言都是特定领域 ...

  3. MDSF:特定领域建模 DSM(Domain Specific)介绍

        在读书笔记:Visual Studio DSL工具特定领域开发指南中介绍了特定领域开发的一些相关技术有:模型驱动开发 MDA.面向语言编程 LOP .语言工作平台 Language Workb ...

  4. Domain Specific Compiling: 领域编译器发展的前世今生 • 面向AI的编译技术

    from: 领域编译器发展的前世今生 • 面向AI的编译技术 作者简介: 张朔铭,博士研究生,正在中国科学院计算技术研究所崔慧敏研究员指导下攻读计算机系统结构博士学位,目前主要的研究方向是AI编译. ...

  5. EMNLP-21-TEBNER: Domain Specific Named Entity Recognition with Type Expanded Boundary-aware Network

    领域:NER领域--无监督条件下的NER识别任务. 总结 这篇文章是从NER的实体边界检测上,做了改进,是在边界检测方面,融合了BIO和文中提出的一种机制(Break or Tie)和phrase m ...

  6. spring elasticsearch 按条件删除_Elasticsearch系列之Query DSL

    1 前言 我们先通过阅读官方文档,了解一下什么是 Query DSL . 1.1 Query DSL Elasticsearch provides a full Query DSL (Domain S ...

  7. BDD 与DSL 入门

    正文: Behavior Driven Development,行为驱动开发是一种敏捷软件开发的技术,它鼓励软件项目中的开发者.QA和非技术人员或商业参与者之间的协作. 在了解Behavior Dri ...

  8. 【ES系列】ES的数据结构与DSL语法

    ES的数据结构与DSL语法 数据结构部分 正向索引与倒排索引 定义 结构 分词(keyword) DSL语句 常用DSL语句 索引部分 创建索引 查看es所有索引 查看单个索引 删除索引 文档部分 创 ...

  9. ElasticSearch的介绍与安装

    -学习目标 ElasticSearch介绍 安装 ElasticSearch 安装 Kibana 安装head Es快速入门 IK分词器 filed的详细介绍 Spring Boot整合Elastic ...

最新文章

  1. Docker容器制作
  2. Spring-profile设置
  3. 拖动效果,防止选中文字兼容代码
  4. 序列化技术的选型-选型建议
  5. sklearn自学指南(part14)--Logistic回归
  6. python 退出程序_Python:用Ctrl+C解决终止多线程程序的问题!(建议收藏)
  7. 解决问题SyntaxError: Unexpected token import
  8. python开发的一些tips
  9. Linux下Samba服务器的安装和配置
  10. tpc-c值大于46万_超过46万人参加了2018年慕尼黑啤酒节
  11. java线程并发库之--线程阻塞队列ArrayBlockingQueue
  12. 结对-结对编项目作业名称-测试过程
  13. 08.Thymeleaf的应用(国际化和抽取公共页面)
  14. 外卖红包小程序0基础搭建附教程+源码
  15. 如何设计简单的网站Favicon图标?ICO图标制作
  16. 互联网装修O2O模式是否可行? 1
  17. 北京邮电计算机课程表,北京邮电大学课表管理规定
  18. 下载安装eiigui工具
  19. 程序员选什么方向好?前端还是后端?
  20. 产品创新案例分析|大疆如何从初创到无人机帝国的进阶之路

热门文章

  1. 计算机组装虚拟实验,组装计算机的虚拟实验室
  2. prim求最短路径C语言,[图论]Prim算法求最小支撑树和最短路径
  3. disp语句怎么格式 matlab_Matlab使用技巧总结-1
  4. 计算机网络日志查询,系统资源管理_百络网警内网管理软件_电脑配置统计,系统日志,日志查询...
  5. android关键应用程序,Android应用程序的四个关键点
  6. 制作简单的java应用程序_使用exe4j工具制作简单的java应用程序
  7. mysql 5.7.13 安装配置方法图文教程(linux)
  8. 链表删除功能实现演示
  9. PC版微信,也终于上线了这个超赞的功能
  10. 2021中国新锐品牌发展研究:食品饮料行业报告