[综述]领域特定语言(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代码编辑或编译期间 ...
随机推荐
- linux下tomcat的安装
本文主要内容: (1)安装apr,这是 Apache 为了提升 Tomcat 的性能搞的一套本地化 Socket, Thread, IO 组件也就是说它有高级 IO 功能, 操作系统级别的功能调用, ...
- PHP联合sqlserver2008使用的全过程 ( 原创 亲测)
一.环境 php5.2.5 sqlserver2008 win7 二.配置PHP 1.打开php.in将extension=php_mssql.dll的注释符号去掉. 2.打开php.in将mssql ...
- 【Ubuntu12.04】安装搜狗输入法
我的系统版本是Ubuntu12.04 32位 卸载Ibus输入法 sudo apt-get remove ibus 注意: 安装ibus的命令是 sudo apt-get install fcitx ...
- mysql UNIX时间戳与日期的相互转换 查询表信息
UNIX时间戳转换为日期用函数FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 日期转换为UNIX时间戳用函数UNIX_TIMESTAMP() Sel ...
- Oracle删除所有表
Oracle 清理用户所有的表 PLSQL中执行语句 select 'drop '||object_type||' '||object_name||';' from user_objects; 结果集 ...
- js正则匹配查找
var pattern1 = /好/g; console.log(pattern1.test("你好")); 字符串查找: var pattern1 = /\w/; console ...
- ireport 在 AIX Linux websphere下的字体安装
首先,ireport在linux下有些时候是正常的,而有些时候却不正常,只要是汉字就出不来的情况我今天是遇到了. ireport在Linux下不显示中文汉字的解决方法: 将字体文件(后缀名必须是ttf ...
- Ubuntu使用apt-get安装本地deb包
我们都喜欢使用apt-get,因为它实在是让我们大大的省心.但是,有时候我们会为网速慢,安装源不好而烦恼,所以我们可能会将一些常用软件包的deb文件保存在本地以备不时之需.当然了使用dpkg也可以直接 ...
- IOS 接ShareSDK问题
如果报错AGCommon 等错误 引用libicucore.A.dylib ShareSDK 官网 管理中心 → 创建一个新的应用 获得key之后 啥都别做.! - (BOOL)applicatio ...
- Jmeter 使用笔记之 html 报告扩展(一)
题记:在用 loadrunner 的时候可以生成一个 HTML 的报告,并且里面包含各种图表,各种详细的数据.而在使用 Jmeter 测试完后并不能直接生成 Html 的报告(无论是用 GUI 还是命 ...