[综述]领域特定语言(Domain-Specific Language)的概念和意义
领域特定语言(Domain Specific Language, DSL)是一种为解决特定领域问题而对某个特定领域操作和概念进行抽象的语言。领域特定语言只是针对某个特定的领域,这点与通用编程语言(General purpose Language)不同,如Java既可以适用于网站开发,也可以适用于手机开发。一旦领域特定语言离开了相关领域,它就会变得不适用。但针对某个特定的领域,领域特定语言能很自然地方便地表述问题,也常常比通用编程语言更快地解决问题。
Martin Fowler 在《领域特定语言》一书中认为:
“Domain-Specific Language: a computer programming language of limited expressiveness focused on a particular domain.”
他突出了四个关键因素:一是计算机编程语言。它是人类设计出的让计算机执行的命令。故其除了要让人容易理解以外,必须要可执行;二是具有语言的表达能力。语法不能是一个个单独的表达式,必须有一定的组合表达的能力;三是有限的表达能力。它不需要像通用程序语言那样宽的表达能力,只需要它支持某个特定的领域即可;四是关注某个特定领域。只有关注某个特定的领域,有限的表达能力才能发挥最大的作用。第三点与第四点是不能割裂的。
领域特定语言有时候也称为第四代语言,它们常是描述式的,只是说明想要什么,而不像通用编程语言(如 C, Java)那样,要详细写出一步步如何做和实现。Debasish Ghosh总结了两点领域特定语言与其它高级编程语言的差异。一是领域特定语言为用户提供了更高层次的抽象。这使得用户不用去关心诸如特殊的数据结构或低层次实现等细节,而仅仅去着手解决当下的问题即可。二是领域特定语言对于其关注的领域提供了有限的词汇。它不用像通用语言那样为特定的建模领域提供额外的帮助。这两点使得领域特定语言更合适非程序员的领域专家使用。也正是这些特性,通过领域特定语言,能在更高抽象级直观地表达应用问题,能在领域级完成需求确认,实现有效的复用,又能通过工具支持和领域知识复用,使许多从规范说明到可执行代码的转换任务能实现自动化,让应用专长和先进技术能在更广范围内一致使用,避免因开发人员技能水平差异带来大的起伏,从而显著提高开发效率和质量,加快产品开发速度,满足客户多变的需求。
在软件工程领域,随着需求和技术的不断更新,领域特定语言的种类也越来越多。以下是一些比较常见的领域特定语言:用于描述Web 页面的 HTML,用于构造软件系统的Ant、RAKE、MAKE, 用于表达语法的 BNF 范式,语法分析器生成语言 YACC、Bison、ANTLR ,用于数据库结构化查询的 SQL,用Ruby的行为驱动测试语言的RSpec, Cucumber,用于描述样式表的CSS,专用的排版系统LaTex等。由Eelco Visser的团队设计的WebDSL[22]语言是Web系统领域最完善的设计,现已拥有了一套全面的工具集。
在互联网环境中,海量用户的个性化需求不断涌现,如何迅速地满足大量最终用户的个性化需求,是软件工程领域面临的一个重要问题,而最终用户编程是有效解决上述问题的方法之一。让最终用户来直接编程可能存在很多问题,如安全性、一致性等,另外最终用户编程时可能面临很多障碍,比如程序的设计,组件的选择等。
为了有效地辅助最终用户编程,国内外学者针对该领域做了大量研究,并提出了一些技术和方法。最终用户编程的主要技术有三种:程序合成、模型驱动开发、sloppy编程。下面分别对这三种技术进行分析。
1)基于程序合成的最终用户编程主要有两种形式,示例编程和演示编程。演示编程是指通过演示一个例子来指明程序的操作和逻辑,即用户演示一个具体的例子,系统通过录制用户的操作序列来生成程序。示例编程是指根据用户的输入输出样例及输入输出样例间的内在逻辑关系来生成目标程序。
2)基于可视化DSL语言的最终用户编程使用的是模型驱动开发的方法。Scratch是由MIT(麻省理工学院)研究组成员共同开发完成的一套新的程序语言, 它主要使用了基于DSL的面向驱动的开发方法。Scratch是属于“积木组合式”的程序语言,采用拖曳、组合的方式来设计程序。另外谷歌推出的一款软件叫App Inventor,App Inventor 主要是让使用者可以跳过那些看不懂的程序代码,直接利用 App Inventor 中的模板来“拼”软件。
3)有文献层提出了一种sloppy编程,目前基于网站的sloppy编程系统主要有以下几种:a)sloppy web command line b)Koala c)Inky(Internet keyword的简写)。以上系统主要针对门户网站,基于关键字的方式来实现sloppy编程。另外文献还分析了针对java集成开发环境的sloppy编程。Quack Eclipse Plugin(QEP)是eclipse的一个插件,这个插件集成了eclipse的java 编辑器,根据用户输入的关键字,可以提供自动补全的功能。Google Calendar的 Quick Add也是基于关键字的一种sloppy编程。用户可以通过输入一些简单的自然语言,在日历上快速地添加日程安排的事件。它主要指将用户的输入解析为表单的一些参数,通过表单自动填充来简化用户添加日程安排时繁琐的表单输入。
综上所述,目前面向最终用户的编程的研究尚处于起步阶段,能够同时满足实际领域的功能描述能力和面向最终用户编程的DSL很少,研究所涉及的主要领域有儿童游戏,手机,门户网站等。
[综述]领域特定语言(Domain-Specific Language)的概念和意义的更多相关文章
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)
前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言1
在Visual Studio 2012中使用VMSDK开发领域特定语言(一) 前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modelin ...
- 七周七语言之用Io编写领域特定语言
如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/06/05/sevenlang-io/. Io 语言 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)
本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...
- 正则表达式与领域特定语言(DSL)
如何设计一门语言(十)——正则表达式与领域特定语言(DSL) 几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情 ...
- Domain-specific language 领域特定语言
https://en.wikipedia.org/wiki/Domain-specific_language A domain-specific language (DSL) is a compute ...
- 如何设计一门语言(十)——正则表达式与领域特定语言(DSL)
几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情. 创建DSL恐怕是很多人第一次设计一门语言的经历,很少有人一 ...
- DSL-领域特定语言(英语:domain-specific language、DSL)
领域特定语言(英语:domain-specific language.DSL)指的是专注于某个应用程序领域的计算机语言.
- Android特定语言 Xtendroid
Xtendroid是一款Android的领域特定语言,它大大降低样板代码,同时提供巨大的工具支持.Xtendroid利用Xtend transpiler实现,它的特点是能够在Java代码编辑或编译期间 ...
随机推荐
- php 时间函数参考
time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计算, 要找出前一天的时间就是 time()-60*60*24; 要找出前一年的时间就 ...
- GAC write failed when upgrade with InstallShield
在接近final-build的时候,突然发现当前版本从上一个版本upgrade的时候,需要写到GAC (Global Assembly Cache)的assambly会写失败掉.但是只会在特定的Mic ...
- Java基础中的一些注意点
1.在Java编程语言中,标识符是赋予变量.类或方法的名称.标识符可从一个字母.下划线(_)或美元符号($)开始,随后也可跟数字.标识符是大小写区别对待的并且未规定最大长度. 2.Java技术源程序采 ...
- 自己画一个ActivityIndicatorView-b
苹果的UI控件中有一个UIActivityIndicatorView,俗称菊花.→_→现在我们仿照它来制作一个其它样式的指示器,如下: ActivityView.png 自定义指示器 首先画一个白色的 ...
- UICountingLabel实现数字变化的动画效果-b
在大多数金融类 app 上或者其他 app 需要数字展示的地方, 经常会有如下的动画效果: 动画效果 怎么做呢? 一.下载UICountingLabel 下载地址: https://github.co ...
- 解决Win8.1 / Win Server 2012 r2 下安装 Visual Studio 时一直要求重新启动的问题(原创)
注:本文为作者原创文章,转载于引用请注明出处,谢谢. 今天在x64的英文版Windows Server 2012 r2上安装最新版的 Visual Studio 2015 Exterprise 时,提 ...
- Computer Vision的尴尬---by林达华
Computer Vision的尴尬---by林达华 Computer Vision是AI的一个非常活跃的领域,每年大会小会不断,发表的文章数以千计(单是CVPR每年就录取300多,各种二流会议每年的 ...
- linux 访问windows共享
1. windows端建立一个用户user用于共享访问 2. 共享一个目录,设置user可以访问,并在windows系统中确认可以访问 3. linux端创建一个用于挂载共享目录的目录 mkdi ...
- VC常用数据类型使用转换
我们先定义一些常见类型变量借以说明 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]=&qu ...
- BMS 项目过程中遇到的问题
环境搭建的问题 Git的ssh私人密钥问题, 路劲不正确的话使用ssh方式连接github进行远程push或clone会出现需要输入密码而怎么输入都不正确的情况,这个时候使用下面的办法: http方面 ...