[综述]领域特定语言(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代码编辑或编译期间 ...
随机推荐
- js实现瀑布流的一种简单方法实例分享
现在说瀑布流式布局似乎有点晚了,但是每一项技术都是向着“精”和“简”的方向在不断发展,在发展到极致之前,需要一个相当漫长的过程,因此,从这个角度来说,当瀑布流被应用得越来越多的时候,反而更应该讨论它, ...
- jquery 循环显示div的示例代码
我们用一个语句就让下面五个div显示成功,具体实现如下,感兴趣的朋友可以参考下 直接看例子 复制代码代码如下: for(var p=1; p<=5; p++){ $("#proper ...
- 将TIBCO Host 实例注册为Windows服务
安装了TIBCO ActiveMatrix BPM及成功创建了ActiveMatrix Administrator 和 BPM Server后,每次都要手动启动tibcohost,比较麻烦,实际上TI ...
- Python SqlAlchemy使用方法
1.初始化连接 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create ...
- Android分类前言
柚子园项目搁置后,半年多时间里都在开发微信公众平台和在公司实习,用的都是python,django,bottle,已经很久没有开发android了.技术的东西,不用就容易生疏甚至忘掉.刚好现在需要写毕 ...
- CODEVS 2102 石子归并 2
[题目描述 Descriptin] 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.试设计出1个算法, ...
- Centos 6.4上面用Shell脚本一键安装vsftpd
Centos 6.4上面用Shell脚本一键安装vsftpd install.sh #!/bin/bash if [ `uname -m` == "x86_64" ];then m ...
- 对html进行SEO的一点点总结
1. 要考虑用户用哪些关键在查找您的网页 2. SE无法识别图形中的内容 3. 确保title和alt中的内容准确 4. 尽量用静态页,如果是动态页,参数要少 5. 每个图片都尽量用alt 6. 不用 ...
- COOKIE之安全设置漫谈
一.标题:COOKIE之安全设置漫谈 副标:httponly属性和secure属性解析 二.引言 经常有看到XSS跨站脚本攻击窃取cookie案例,修复方案是有httponly.今天写出来倒腾下... ...
- HDU1632+半平面交
模板题 题意:给定两个凸多边形,求出合并后的面积,这个合并后的面积不包括重叠部分. #include<stdio.h> #include<string.h> #include& ...