领域特定语言

领域特定语言(英语:Domain-specific language缩写DSL),也称为特定域语言,是专门针对特定应用领域[注解 1]计算机语言,和可以用在多种领域的通用语言英语general-purpose language(GPL)恰好相反。像HTML专门用在网页设计上,就属于领域特定语言,也有些领域特定语言只用在一个或几个软体上,例如MUSH英语MESH软体码。领域特定语言还可以依使用的语言分类,像是领域特定的标记语言、领域特定的建模语言(或更广义的规格语言)以及领域特定的程式语言。从电脑发明开始,就已出现特定用途的电脑语言。而“领域特定语言”一词是随著特定域建模(domain-specific modeling)的兴起,才开始广为使用。简单的领域特定语言(特别是只有单一应用程式使用的领域特定语言),有时也会称为迷你语言

领域特定语言和通用语言之间没有明确的界线,因为可能某计算机语言原来有一些适用于特定领域的特征,但也可以应用在更通用的范围,相反的,也有可能某计算机语言理论上可以用在多种领域,但实务上只用在特定领域中。像Perl一开始是设计为文字处理语言以及胶水语言(和AWKshell script的领域相同),但后来成为通用的程式语言。相反的,PostScript图灵完备的语言,但实际上只用作页面描述语言(领域特定语言)。

用途

设计及使用适合的语言,是领域工程英语domain engineering中重要的一环,作法可能是选择适合此领域的现有语言(可能是某个领域特定语言或通用电脑语言),也可能是开发一种新的领域特定语言。面向语言的程序设计会把为了描述问题而创建特定语言一事,视为问题解决流程的标准步骤之一。假如用一种新的领域特定语言描述某种问题,会比用现有语言描述更加清楚,而且这种问题又常常出现,那么创建此一领域特定语言(以及配合的软体)就是值得的。领域特定语言可以针对特定的问题领域、特定的问题表示方式、特定的解决方案技术,或是某一领域的其他层面。

用在设计和实现上

领域特定语言是在设计和实现上有特定目的的语言(或是宣告的语法或是文件)。领域特定语言可以是视觉对话语言(visual diagramming language),例如Generic Eclipse Modeling System英语Generic Eclipse Modeling System中建立的语言,可以是程式化抽象,例如Eclipse Modeling Framework,也可以是文字语言。例如,命名列工具grep正则表达式语法,可以在文字中寻找特殊排列规则的文字。sed工具定义了匹配和取代正则表达式的语法。一般来说,这些小工具可以在壳层内整合使用,以达到复杂的系统工作。

有时领域特定语言和脚本语言之间没有清楚的分界,不过领域特定语言多半没有处理档案系统的低阶功能、跨行程控制、以及一些全功能程式语言或脚本语言必须有的功能。许多领域特定语言不会编译成字节码或是可执行档,而会转换为许多不同的媒体格式。像GraphViz可以输出PostScriptGIF档、JPEG档等。Csound则会编译成声音档。像是POV-Ray之类的光线追踪(ray-tracing)领域特定语言会转换为图形档。像是SQL之类的电脑语言会有种特殊的情形:SQL是针对特定领域(存取和维护关联资料库)的,所以的确是领域特定语言,也常会其他应用程式呼叫,但SQL的关键字及函数比许多脚本语言都多,一般也会视为是独立的语言,有可能是因为在程式中资料库使用的普及性,以及要成为此语言专家需要有的掌握程度。

许多领域特定语言也有提供API,因此可以在其他程式执行时呼叫此API,不影响原程式的流程,此运作方式类似程式的函式库,和脚本语言之间的差异就更小了。

程式开发工具

有些领域特定语言会随著时间扩展,加入全功能的程式开发工具,因此更增加了该语言是否是领域特定语言的问题难度。

模型驱动工程中,有许多领域特定语言的例子,像是用断言说明模型的OCL英语Object Constraint Language、或是领域特定的转换语言QVT英语QVT,不过统一建模语言(UML)反而是通用的建模语言。

有一个类推可以说明超小型语言及领域特定语言:超小型语言像是刀,有许多不同的使用方式,从切食物到锯树都可以。领域特定语言像是电钻,也有很多不同的使用方式,不过都是用来在东西上钻洞上。通用特定语言是完整的完整的工作台,有许多特别用来进行特定工作的工具。程式设计师使用领域特定语言的方式类似他们看工具台,知道他们需要一个较好的电钻,而且找到一个刚好适用的领域特定语言。

优点和缺点

领域特定语言的一些优点如下[1][2]

  • 领域特定语言可以使解决方案以较简洁的方式呈现,而且达到问题域上的抽象层次。意思就是领域专家自身可以理解、验证、修改,甚至开发领域特定语言的程式。不过,可以达到此程度的例子不多[3]
  • 领域特定语言可以达到领域层次的计算机安全。只要其语言构造(language construct)是安全的,以此写的所有程式码可以视为是安全的[来源请求]
  • 领域特定语言有助于将商业资讯系统的开发,从传统的软体开发者转到领域专家身上,此一群体人数较多,对此一领域有较深入知识,但程式技术较为不足[4]
  • 若领域特定语言的scope较小,会比较容易学习。

领域特定语言的一些缺点如下:

  • 学习新语言的成本。
  • 应用范围受限。
  • 设计、实现及维护领域特定语言以及开发工具(集成开发环境)的成本。
  • 寻找、设定及维护适当的语言scope。
  • 设计领域特定语言时,需在领域专门的语言构造,以及通用的语言构造之间取舍平衡。
  • 相较于程式设计师撰写的程式码,领域特定语言的效率可能会比较低。
  • 同一领域可能有计多种非标准语言,例如不同保险公司开发、使用的领域特定语言[5]
  • 非技术背景的领域专家不容易自行撰写或修改领域特定语言的程式[3]
  • 领域特定语言和(用通用语言撰写的)IT系统其他模组不易整合。
  • 特定领域特定语言的专家人数较少,会带来人力成本的增加。
  • 不容易找到相同领域特定语言的程式码范例。

注解

  1. ^ 此处的领域也可能是指业务领域(business area),例如寿险政策、战斗模拟、薪资计算、帐单管理等

相关条目

参考资料

  1. ^ Marjan Mernik, Jan Heering, and Anthony M. Sloane. When and how to develop domain-specific languages. ACM Computing Surveys, 37(4):316–344, 2005.doi:10.1145/1118890.1118892
  2. ^ Diomidis Spinellis. Notable design patterns for domain specific languages页面存档备份,存于互联网档案馆). Journal of Systems and Software, 56(1):91–99, February 2001. doi:10.1016/S0164-1212(00)00089-3
  3. ^ 3.0 3.1 Freudenthal, Margus. Domain Specific Languages in a Customs Information System. IEEE Software. 1 January 2009: 1. doi:10.1109/MS.2009.152. 
  4. ^ Aram, Michael; Neumann, Gustaf. Multilayered analysis of co-development of business information systems (PDF). Journal of Internet Services and Applications. 2015-07-01, 6 (1) [2022-10-08]. S2CID 16502371. doi:10.1186/s13174-015-0030-8 . (原始内容存档 (PDF)于2015-09-07). 
  5. ^ Miotto, Eric. On the integration of domain-specific and scientific bodies of knowledge in Model Driven Engineering (PDF). [2010-11-22]. (原始内容 (PDF)存档于2011-07-24).