`
yimlin
  • 浏览: 139475 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

DSL(Domain Specific language): How to get it

阅读更多
DSL:基于规则系统组织业务规则我提出DSL,不过在该文没有太多关于DSL的东东,显得有些牵强。

先要说明一下什么是DSL(Domain Specific language),援引《产生式编程》一文:
“DSL(领域特定语言)是一种特化的,面向问题的语言。”
《产生式编程》对DSL的做如下分类:
1. 固定和独立的DSL(fixed, sparate DSL),如SQL,用独立转换器实现的,导致技术孤岛
2. 嵌入式的DSL(Embedded DSL),如类和过程,还有嵌入式的DSL
3. 模块可组合的DSL(Modularly Composable DSL),包含两种DSL:封装的DSL(encapsulated DSL)和方面性(aspectual DSL)。这个两个关系就象OOP和AOP之间的关系。
 
好了,DSL是面向问题域的。换句话说,DSL是用来解决(特定)问题
1. DSL更多的是表述特定问题域的,这是和常见编程语言的最大区别,编程语言不是面向特定的问题域的,而是一般问题域
  1.1 DSL中关于问题域的名词是关键字,而编程语言不是。
对于保险行业来说: 代理人,保单都是DSL中的关键字,而在编程语言中不是,需要建立起该对象(OO语言中)。
同时注意:OO追求的是一个细粒度的设计,而在DSL中可以是相对的一个粗粒度的概念。DSL中对象体系的观念并不直接。
  1.2 DSL不处理编程语言中所涉及到的技术问题。
 
2. DSL是针对一个问题域的过程化表述。DSL基于特定问题域的关键字——名词,给出一个特定问题的流程。
按我在《小议领域模型Domain Model》一文中的观点,Domain Object都是DSL的关键字,而DSL表述的是Domain Service所包含的流程和规则。
 
举个例子:
如果某学生的这个学期期末考成绩90分以上超过5门,那么该学生就可以获得一个小红花。
 
用DSL来描述就可能是: 
foreach students
 
if the total number of { the courses of {the student} {this term} that {it's grade > 90} } >  5  then
   the student get a red flower
 end 
if
end foreach


 而用Java程序代码(假想代码) 
Iterator studentIterator = students.iterator();
while(studentIterator.hasNext()){
    Student student 
= (Student)studentIterator.next();
    
// 从教务处获取学习成绩, 
    
// SchoolService表示教务处,"200602"是学期代号。
    CourseGrade[] grades = SchoolService.getCourseGrade(student, "200602");
    
int i = 0;
    Iterator gradeIterator 
= grades.iterator();
    
while(gradeIterator.hasNext()){
        CourseGrade courseGrade 
= (CourseGrade)gradeIterator.next();
        
if(courseGrade.getGrade() > 90){
            i
++;
        }
    }
    
if(i>5){
        
// 学校为该生记一个小红花的奖章。
        SchoolService.addMedal(student, "200602"new RedFlower());
    }
}

从上面可以看出,用DSL描述很简洁。(自己立了靶子,然后开打) 
这里我要说明的是:student和course都DSL的关键字,而在java代码中不是,是开发中建立的对象体系。
DSL中没有涉及到编程语言的技术处理问题:
1. java代码中的转型:(Student)studentIterator.next();
2. 临时变量:int i = 0;
3. 新建对象: new RedFlower()
同时:DSL中我们隐藏了一个SchoolService对象,在技术上,SchoolService教务处记录学生的成绩和奖惩,student本身不带有这些信息。
(当然关于这个例子的设计,或许有人认为student本身可以拥有这些记录,不过由于这个course还关联教师对象等,所以单独管理。BTW:例子而已表太认真嘛!)
 
通常来说Use Case描述更多是是问题域的描述。
 
这里面DSL的关键字:所谓的问题域名词(也就是我们所说的Domain Model)的设计和建立就是DSL的实现的关键,现有的手段无非就两种:
1. 工具本身内置支持Domain Object的设计和实现。这个是正统的路子。
2. 利用外置工具实现,这个有点剑走偏锋的意思。
 
常见的有以下几条路子:
一.映射法。
如Drools3推出的DSL实现方式。来看看springside的例子 
package org.springside.dsl 
  
import org.springside.bookstore.domain.Order 
import java.lang.Double 
import java.math.BigDecimal 
  
expander orderPricing.dsl 
  
rule 
" order 0.9 discount" 
    when 
       order price larger than 
100 
    then 
       
do 0.9 discount 
       #加入 
> 就可以在drl/dsl 中直接写入drl 语法 
       
>System.out.println("original price:"+order.getOriginalPrice()+" discount price:"+order.getTotalPrice()); 
end 
 
注意这个expander orderPricing.dsl将导入DSL映射: 
[when]order price larger than {topPrice}=order : Order( totalPrice >= {topPrice} ) 
[then]
do {discountRate} discount=order.setTotalPrice(new Double(new BigDecimal(order.getTotalPrice().doubleValue() * {discountRate}).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())); 
 
Oracle的Rule编辑器和JRule也属于这一类。
 
二.解析法
1. 脚本解析:
用脚本做有天然的好处,动态类型,语法的易用性等等。
出名的有Ruby:http://www.artima.com/rubycs/articles/ruby_as_dsl.html
2. 程序解析:
ajoo同学的jaskell的dsl方案:
http://forum.iteye.com/bloglist.php?userid=6423
http://forum.iteye.com/viewtopic.php?t=17579&start=120
 
或许这样分不太好,不过从本质上看,两者都通过提供相对灵活的语法解析来使代码简洁更贴近问题域描述。 
  
映射法和解析法两者都不提供Domain Model的设计支持,两者只是在代码生成手段上有所不同。 
在《DSL:基于规则系统组织业务规则》一文中所提出的组织业务规则的DSL就是指这两种。 

三.元数据生成法。
这类属于正统手法,当然也是复杂性最大的。
1. JetBrains的MPS(Meta Programming System)。
MPS的定义流程很严格
1. 首先定义基本的关键字--Struture,然后要定义其对应的editor,相当于MS VS的Designer,
2. 有了这个后就可以作为high level的模型,用来设计Model,就可以设计描述领域问题。
3. 定义low level的代码产生器,定义转换映射关系。
 
可以参照Drools的设计实现来理解MPS的工作原理:
1. 定义DSL文件的左表达式(MPS在这里还需要设计好editor,drools合二为一了)。
2. 基于这个表达式定义领域问题。
3. 定义DSL的右表达式,以便代码生成。
 
MPS采用XML结构化的节点扩展能力来实现Type的定义,可以看到其GUI工具生成的mps文件是晦涩难懂的。
 
2. Microsoft的意图编程(Intentional Programming),只在《产生式编程》中闻其大名,未见真身。
不过微软推出了VS.Net的DSL Tools,不知道是不是意图编程的成果。
http://msdn.microsoft.com/vstudio/DSLTools/
http://www.microsoft.com/downloads/details.aspx?familyid=57a14cc6-c084-48dd-b401-1845013bf834&displaylang=en
 
MS DSL的model定义也是采用XML,没有designer的帮助,也是晦涩难懂的。
不过,其模版生成采用类似ASP.NET一样的语法结构,来定义模版(Text Template)。而不是想MPS那样,在MPS和IntelliJ两个工具切换来切换去的,同时也相对容易上手。
相比而言,MPS显的庞大,VS DSL则简单明了。
这正好反应了JAVA世界和MS世界的不同,MS一向是怎么样简单就怎么来,而JAVA更多像学院派风格。  
 
准备另外写Blog详细介绍MPS和MS的DSL Tools,这是后话。
 
另:TW的taowen同学在BJUG的google groups上有过讨论,还发了一文《DSL简单观察报告》。有很好讨论,不过不好贴出来。
 
分享到:
评论

相关推荐

    Eclipse Modeling Project A Domain-Specific Language (DSL) Toolkit

    《Eclipse Modeling Project: A Domain-Specific Language (DSL) Toolkit》是关于利用Eclipse平台进行领域特定语言(DSL)开发的重要资源。DSL是一种为特定领域或问题设计的编程语言,通常比通用编程语言更为简洁、...

    Domain Specific Languages(martin fowler)

    通过以上对《Domain Specific Languages》这本书的概述和关键知识点的详细解读,我们可以深刻地认识到DSL在软件开发中的重要性和潜力。无论是对于软件架构师、开发人员还是领域的专家来说,掌握DSL的设计和实现方法...

    敏捷开发:Domain Specific Language

    ### 敏捷开发中的领域特定语言(Domain Specific Language, DSL) #### 一、DSL概念介绍 领域特定语言(Domain Specific Language, DSL)是一种为解决某一特定领域问题而设计的计算机程序设计语言。它通常用于软件...

    [Xtext Xtend] 领域特定语言 (Xtext & Xtend 实现) (英文版)

    Learn to quickly develop a domain-specific language with Xtext Implement any aspect of a DSL using Xtend, a fully featured Java-like programming language Discover how to test a DSL implementation and ...

    Implementing.Domain.Specific.Languages.with.Xtext.and.Xtend.2nd.Ed

    Leverage the latest features of Xtext and Xtend to develop a domain-specific language. Integrate Xtext with popular third party IDEs and get the best out of both worlds. Discover how to test a DSL ...

    SQL DSL (Domain Specific Language) for Kotlin and Java. Su.zip

    SQL DSL(领域特定语言)是为特定编程语言设计的、用于简化数据库操作的专用语法。在Kotlin和Java中,SQL DSL提供了一种更简洁、类型安全的方式来编写SQL查询,使得开发者可以像编写代码一样编写SQL,提高了开发效率...

    Visual Studio 2005 Team Edition软件架构系列课程(4):模型驱动开发的领域特定语言(Domain Specific Language )工具

    在这一系列课程中,我们重点关注Visual Studio 2005 Team Edition中的一个重要工具集——模型驱动开发的领域特定语言(Domain Specific Language,DSL)工具。这些工具提供了一种高效的方法,使开发人员能够为特定...

    On the Use of Cryptol, a Cryptography Domain Specific Language

    1. Cryptol是一门领域特定语言(Domain Specific Language,DSL),专门用于实现密码算法。它允许代码更直观地反映算法本身的操作,而不是更加抽象的代码。 2. 在常规编程语言中实现密码算法时会遇到很多问题,主要...

    DSLs in Boo Domain Specific Languages in .NET

    领域特定语言(Domain Specific Languages,简称DSLs)是一类专为解决特定问题领域而设计的编程语言。它们通常具有高度抽象、易于理解和使用的特性,使得在特定领域内的开发工作更为高效。在.NET框架下,DSLs的应用...

    给DSL开个脑洞:无状态的状态机

    DSL(Domain Specific Language)是一种为特定领域设计的编程或配置语言,它专注于解决特定问题,使代码更易理解和维护。在本文中,我们将探讨DSL如何应用于状态机的设计,尤其是创建一种无状态的状态机。 状态机是...

    Implementing Domain-Specific Languages with Xtext and Xtend(PACKT,2013)

    “Implementing Domain-Specific Languages with Xtext and Xtend” will teach you how to develop a DSL with Xtext, an Eclipse framework for implementing domain-specific languages. The chapters are like ...

    Groovy DSL

    ### Groovy DSL:基于领域的特定语言开发指南 #### Groovy简介 Groovy是一种基于Java平台的灵活、强大的脚本语言,它与Java高度兼容,能够直接调用Java库中的类和方法,反之亦然。这种无缝集成使得Groovy成为一种极...

    Eclipse Modeling Project(A Domain-Specific Language Toolkit)

    ### Eclipse Modeling Project (EMP): A Domain-Specific Language Toolkit #### 概述 《Eclipse Modeling Project:一种领域特定语言(DSL)工具包》是Richard C. Gronback编写的一本全面介绍Eclipse Modeling ...

    DSLs in Boo Domain Specific Languages in .Net

    在IT领域,尤其是在软件开发与编程环境中,"DSLs in Boo: Domain Specific Languages in .Net"这一主题聚焦于探讨特定领域语言(DSLs)在Boo编程语言中的应用及其在.NET框架下的实践。该主题涉及的关键知识点丰富且...

    Addison.Wesley.Domain.Specific.Development.with.Visual.Studio.DSL.Tools.May.2007.pdf

    《特定领域开发与 Visual Studio DSL 工具》是微软.NET开发系列书籍之一,主要介绍了如何利用 Visual Studio 的 Domain Specific Language (DSL) 工具进行高效、专业的软件开发。本书由 Steve Cook、Gareth Jones、...

    Manning.DSLs.in.Boo.Domain.Specific.Languages.in.NET.Jan.2010

    《DSLs in Boo: Domain Specific Languages in .NET》是一本由Manning出版社于2010年1月发行的专业技术书籍,主要探讨了在.NET框架下如何使用Boo语言来构建领域特定语言(DSLs)。这本书是针对那些对DSLs有深入兴趣...

    dsl.rar_dsl

    DSL(Domain-Specific Language,领域特定语言)是一种为了特定应用领域设计的计算机语言,它通常比通用编程语言更简洁、直观,更容易理解。在VHDL(Very High-Speed Integrated Circuit Hardware Description ...

Global site tag (gtag.js) - Google Analytics