领域特定语言(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)的概念和意义的更多相关文章

  1. 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)

    前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...

  2. 在Visual Studio 2012中使用VMSDK开发领域特定语言1

    在Visual Studio 2012中使用VMSDK开发领域特定语言(一)   前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modelin ...

  3. 七周七语言之用Io编写领域特定语言

    如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/06/05/sevenlang-io/. Io 语言 ...

  4. 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)

    本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...

  5. 正则表达式与领域特定语言(DSL)

    如何设计一门语言(十)——正则表达式与领域特定语言(DSL) 几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情 ...

  6. Domain-specific language 领域特定语言

    https://en.wikipedia.org/wiki/Domain-specific_language A domain-specific language (DSL) is a compute ...

  7. 如何设计一门语言(十)——正则表达式与领域特定语言(DSL)

    几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情. 创建DSL恐怕是很多人第一次设计一门语言的经历,很少有人一 ...

  8. DSL-领域特定语言(英语:domain-specific language、DSL)

    领域特定语言(英语:domain-specific language.DSL)指的是专注于某个应用程序领域的计算机语言.

  9. Android特定语言 Xtendroid

    Xtendroid是一款Android的领域特定语言,它大大降低样板代码,同时提供巨大的工具支持.Xtendroid利用Xtend transpiler实现,它的特点是能够在Java代码编辑或编译期间 ...

随机推荐

  1. UBUNTU下如何开启SSHD服务

    “人生本来就有很多事是徒劳无功的.”就像青春,虽然徒劳,却在人的心里住得最久,挥之不去,怀念那段青涩年华,怀念它的... sudo apt-get install openssh-server Ubu ...

  2. WPF中的一些常用类型转换

    1.string和Color的转换: //string转Color (Color)ColorConverter.ConvertFromString((string)str); //Color转stri ...

  3. Java学习--Equals与“==”

    在Java规范中,它对equals()方法的使用必须要遵循如下几个规则: equals 方法在非空对象引用上实现相等关系: 1.自反性:对于任何非空引用值 x,x.equals(x) 都应返回 tru ...

  4. STM32的FSMC总线驱动ili9341,掉电重启无法正常显示的问题

    问题描述 通过STM32的FSMC总线驱动ili9341,程序调试和刚下载的时候,显示完全正常.可是就在我掉电关机,重新启动的时候就完全跑飞了.这令我非常疑惑.以下是我的FSMC总线配置程序, sta ...

  5. 一步步学习ASP.NET MVC3 (2)——入门程序

    请注明转载地址:http://www.cnblogs.com/arhat 在上一节中,我们只是简单的介绍了什么是MVC及MVC的运行原理.而本节呢,主要来实现下一ASP.NET MVC3的开发流程,并 ...

  6. 汇编函数调用中bp和sp是指什么?

    bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址sp是栈顶指针,它每次指向栈顶.每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值.像下面这样:在函数进 ...

  7. 汇编语言中,SP,BP ,SI,DI作用?

    这个很简单: sp:表示栈顶指针,指向栈顶地址.与SS相配合使用.ss为栈段. bp:是基址指针,段地址默认在SS中.可以定位物理地址,比如:"mov ax,[bp+si+6]/mov ax ...

  8. 一个灵巧的Delphi多播实事件现方案

    一个灵巧的Delphi多播实现方案.必须是支持泛型的Delphi版本.也就是Delphi2009以后.强烈建议用DelphiXE. 用法就是例如写一个Class指定一个Event,触发的时候会通知多个 ...

  9. Android开发之AlertDialog

    http://www.cnblogs.com/Gaojiecai/archive/2011/12/10/2283156.html http://www.2cto.com/kf/201205/13187 ...

  10. Android开发UI之动画侦听

    动画侦听使用了AnimationListener接口,需要实现三个方法onAnimationStart().onAnimationRepeat().onAnimationEnd() 代码: 实现But ...