领域专用语言

 

领域专用语言

 

翻译:http://en.wikipedia.org/wiki/Domain-specific_language

 

在软件开发中,领域专用语言(domain-specific language,DSL)是编程语言或者规范语言的一种类型,领域工程致力于一个特定问题领域,一个特定的问题表示技术,或者一个特定的解决技术。

 

特定目的的编程语言和所有种类的模型/规范语言总是存在于计算机时代,但是由于领域专用模型的崛起,这个属于变的比较流行。

 

领域专用语言的例子包括HTML、类铅笔绘图的LogoVerilogVHDL硬件描述语言、矩阵编程的Mata、用于符号数学的MathematicaMaxima、电子表格公式和宏、关系数据库的SQL、创建解析器的YACC语法、指定词法分析器的正则表达式、创建图表语言的通用Eclipse模型系统、声音和音乐合成的CsoundGraphVizGrGen的输入语言、用于图布局和图重写的软件包。

 

相反的是:

1、相通用目的的编程语言,诸如C、Java 或Python

2、 通用目的的模型语言诸如UML

 

创建一个领域专用语言(软件支持的话)是值得的,如果语言允许特定类型的问题或解决方法比现存语言表达更清楚,则是允许的,且讨论中的问题类型经常充分再现。面向语言的编程(Language-Oriented Programming)认为特殊用途语言的创建是为了表达问题解决过程中问题的一个标准部分。

 

 综述

 

一个领域专用语言被专门创建去解决一个特定领域里的问题,而不是打算能解决问题之外的(尽管在技术上是可行的)。与此相反,通用目的的语言被创建用于解决许多领域的问题。领域也许是一个商业领域。一些商业领域的例子包括:

 

在一个大型保险企业里人寿保险政策自行开发的领域专用语言

1、 作战模拟的DSL

2、 工资计算的DSL

3、 记账的DSL

 

DSL某些时候,在微小编程语言和脚本语言之间,常被类似于编程库的方式去使用。在这些感念之间的边界相当模糊,很像脚本语言和通用语言之间的边界。

 

设计与实现

 

在设计和实现中,DSL是一种有着特定目的语言。一个DSL可以是可视化编程语言的一种,诸如由通用Eclipse模型系统创建的;编程抽象,诸如Eclipse模型框架,或文本语言。例如,命令行公用程序 grep有一个正则表达式语法,在一个文本行里进行模式匹配。Sed公用程序为匹配和替换正则表达式定义了一个语法。常常,这些微型语言可以在一个shell里一起使用,用于执行比较复杂的编程任务。

 

DSL和脚本语言之间的线在某种程度上是模糊的,但是DSL常常缺乏低级功能,如文件系统访问、进程间控制和其他表征功能齐全的编程语言,脚本或其他等的功能。许多DSL不编译成字节码或可执行代码,但是编译成各种各样的媒体对象:GraphViz导出为PostScript,GIF,JPEG Csound编译成视频文件。一个像SQL的计算机语言代表一个有趣的例子:它被认为是一种DSL,因为它具体到一个特定领域(在SQL's例子里,访问和管理关系数据库),并且它常常被从其他应用程序里调用,但是SQL比其他许多脚本语言有更多的关键字和函数,通常被认为是它自己权利的一种语言,也许因为在编程中,数据库操作的普遍,在这个语言里需要是一个专家。更近一步模糊了这个线,许多DSL有暴露的API,可以从其他编程语言访问,而不需要破坏执行流程,可以被趘程序库操作。

 

编程工具

 

一些DSL随着时间去扩大,包括了全功能的编程工具,其更复杂化了一个语言是DS或不是这个问题。一个好的例子是函数式语言XSLT,专为转换一个XML图标到另一个,已经从它的最初功能呢过扩展到了各种形式的文件系统交互,字符串和日期操纵和数据类型。

 

在模型驱动工程里,像OCL的许多DSL例子,OCL是一种带有断言的装饰模型语言或QVT,一种领域规范转换语言。然而,像UML这样的语言是典型的通用模型语言。

 

简而言之,一个类比也许是有用的:一个非常小的语言像一个小刀,可以用几千种不同的方式使用,从切食物到砍树。一个DSL语言就像一个电钻:它是一个有着广泛用途的强大工具,但是在一个特定的上下文,换句话,putting holes in things。一个通用语言是一个全集,有多种多样的工具用于执行各种各样的任务。DSL应该被正看着他们工作台的程序员使用,意识到他们需要一个更好的钻子,发现一个独有的DSL确切地提供了

 

DSL话题

 

使用模式

 

DSL有几种使用模式:

1、 处理独立的工具,通过直接的用户操作调用,常常是命令行或一个Makefile

2、 DSL是使用编程语言宏系统实现的,在编译时或读出时,其被转换或扩展为一个主机通用的语言

3、 嵌入式DSL,被作为库实现,其采用了它们主机通用语言的语法或一个子集。同时增加了DSL元素(数据类型,惯例,方法,宏等)

4、 在运行时,从用通用语言编写的程序中调用,如C或Perl,去执行一个特定的功能,常常返回操作结果到“主机”编程语言,用于进一步处理,一般请困高相爱,为了DSL,一个解释器或者虚拟机需要被嵌入到主机应用程序

5、 DSL被嵌入到用户应用程序中,(1)用于执行应用程序用户编写的代码;(2)由应用程序动态产生;(3)前两个

 

许多DSL都有多于一种的使用方式

 

设计目标

 

DSL方法应用到软件工程涉及到风险和机会。设计良好的DSL设法在这两者之间找到适当的平衡。

 

与通用语言相比,DSL有重要的设计目标

1、 DSL不全面

2、 DSL在他们的领域中有更富有表现力

3、 依据下述的主观定义,DSL应该存在最小容易

 

一个程序的冗余被定义为文本插入、删除或替换必须实现需求里一个独立变化点的平均数。对于一个语言,这是程序问题域的平均。这个度量是有用的,因为平均数越小,由不完全实现变化所引入的bug就可能越少。

 

风格

 

在编程中,风格是由程序员强加去控制通用开发任务的方法,比如:

1、 确保在床后关闭前保存数据

2、 在指导昂贵的测试前,执行廉价测试可以排除昂测试的需要

3、 当命令行参数变化时,编辑代码,因为它们影响程序的行为

 

通用编程语言几乎不支持这些风格,但是DSL可以描述它们,例如:

1、 脚本可以自动保存数据

2、 一个智能测试装置可以学习哪些是好的测试

3、 DSL可以参数化命令行的输入

 

DSL例子

1、 Unix shell脚本

2、 ColdFusion 标记语言

3、 Erlang OTP

4、 FilterMeister

5、 MediaWiki 模板

6、 软件工程用例

7、 Metacompilers

8、 虚幻引擎和其他游戏

9、 规则引擎策略自动化

10、 统计模型语言

 

 

 

优势与劣势

 

一些优势:

 

1、DSL允许解决方案以习语或者问题域的抽象层面来表达。这个思想是领域专家他们自己可以理解,修改,常常甚至开发出了DSL程序。然而,这是很少的情况

2、 自我文档型代码

3、 DSL提高了质量,生产率,可靠性,维护性,移植性和重用性

4、 DSL允许在域级别校验。只要语言构造是安全的,任何使用它们写的句子都被认为是安全的

 

一些劣势:

 

1、学习新语言的成本 vs 它有限的适用性

2、 设计,实现和维护一个DSL的成本和用来开发所需的工具

3、 查找,设置和维护正确的范围

4、 在域规范和通用编程语言构造之间的平衡取舍是困难的

5、 与手工编码软件相比,处理器效率的潜在损失

6、 类似非标准DSL的扩散,例如,保险公司A使用DSL对抗保险公司B使用DSL

7、 非技术域专家发现他们自己写或修改DSL程序是困难的

8、 与IT系统的其他组件集成DSL的难度增加

9、 在一个特定的DSL,专家供应不足,倾向于增加了劳动力成本。

10、 很难找到代码例子

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值