领域专用语言(DSL)收藏
原文:DomainSpecificLanguage 设计 2004年2月13日 Bliki 索引
所谓领域专用语言(domain specific language / DSL),其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖一切软件问题,而是专门针对某一特定问题的计算机语言。几乎自计算机发明伊始,人们就开始谈论DSL使用DSL了。
Unix社群是一个频繁使用DSL的社群,他们通常称之为小语言或迷你语言。(关于这一传统,Eric Raymond的《Unix编程艺术》有上佳探讨。)要构建一种DSL,按最常见的Unix风格的做法,就是先定义它的语法,然后通过代码生成技术把DSL代码转成一种通用语言代码,或者写一个这种DSL的解释器。Unix有很多工具能让这件事做起来轻松些。我为这类DSL定了一个术语:“外部DSL”。XML配置文件是外部DSL的另一种常见形式。
DSL也是Lisp和Smalltalk社群的一项重要传统,但方式不同,他们不是动手新造一套语言,而是让Lisp或Smalltalk这种通用目的语言换个颜面变成DSL。(Paul Graham的文章《自底向上编程》对此有精彩讲述。)利用编程语言自带的语法结构定义出来的DSL,我称之为“内部DSL”,也叫做“内嵌DSL”。这是种通用策略,不仅适用于Lisp和Smalltalk,用任何语言都可以这么做,我面对问题时总是考虑着用这种策略定义出具有DSL功能的东西来解决,不过Lisp和Smalltalk程序员走得要深远得多。
关于这两类DSL,在我最近的文章《语言工作台(Language Workbench)》中有进一步的例子,我希望DSL能使用得更普遍,文中详细讨论了这两种风格各自的优缺点,还介绍了语言工作台工具的最新进展。
直到出现了一位人物,原本内外分流的DSL走向了一个有趣的汇合,他就是PragDave。沿袭Unix的传统,用本主义程序员们(The pragmatic programmers)老早就是DSL粉丝了(《用本主义程序员》(中译本链接)第十二节对这个话题的讨论引人入胜——我干脆把它称作“用本要义12”好了)。Dave在一次富有见地的访谈里说到,尽管代码生成是他的惯用技术,但在用Ruby编程时很少用到。
我做设计时,经常借构建一套DSL的思路来类推——有意把class和方法设计成DSL的样子。不论用什么语言,我都尽量这么做,如果做不到,我就乐得转用代码生成技术了。在我们ThoughtWorks公司的较大型系统上,代码生成以及类似的技术使用得非常普遍。
什么时候需要把DSL和主语言划清界线,我认为这个问题的答案因主语言而异,用Smalltalk时我几乎从没感觉有必要分离出一种DSL来,而这种需求在用C++/Java/C#时则非常常见。
因此,我认为有的语言适合设计内部DSL,有的不适合。适合的是那种“一条道跑到黑”的风格简约的语言,它们在某一方面比其他传统语言走得更远更纯粹(例如Lisp的函数式风格,Smalltalk的“对象-消息”思想),这是我分析Lisp和Smalltalk得出的结论。再看Ruby,它比前两者更常规化一些,也比它们都庞大,但仍不失为一门用来构建内部DSL的好语言。
这么看来,语言设计者需要对语言的精练程度有一个良好的决策,既要保证常规性内容可以轻松地表达,又要为原本费神的复杂东西提供舒适的语法支持。总之,我认为这是非常重要的一点。我喜欢用Smalltalk和Ruby的程度比喜欢用Java或C#的程度高那么多,其原因我总是觉得难以言传,最常听到的解释是静态类型与动态类型的区别所致,但我总觉得这个说法并没有抓住要害,更接近两者区别本质的是它们对构建内部DSL友好程度的差异。
译注:Brian W. Kernighan与Rob Pike合著的《程序设计实践(The Practice of Programming)》第9章也是一份关于DSL的极好的参考资源
分享到:
相关推荐
LSM6DSL是一款由STMicroelectronics生产的高性能惯性测量模块,具有多种传感器功能,包括3D加速度计和3D陀螺仪,它们被封装在一个系统内。本文手册主要提供了关于LSM6DSL的使用信息和应用提示,深入讲解了如何进行...
### DSL技术概述与演变 #### 一、DSL技术简介 DSL(Digital Subscriber Line,数字用户线路)是一种通过传统电话线提供高速数据传输的技术。它利用现有的铜线电话网络,在不干扰普通电话服务的情况下,实现宽带...
840DSL v4.5 Toolbox 是一个专为西门子NCU730.3PN设计的软件工具集,它提供了对840DSL数控系统进行编程、诊断和维护的功能。840DSL是西门子的一款高端数控系统,广泛应用于精密加工中心和重型机床。这个版本的...
LSM6DSL是意法半导体(STMicroelectronics)推出的一款高度集成的六轴传感器,集成了3D加速度计和3D陀螺仪。这款传感器广泛应用于移动设备、物联网(IoT)、穿戴设备、机器人、无人机以及健康监测等领域,提供精确的...
标题中的“828D_840Dsl_工具_EasyXML_例程合集.zip”表明这是一个关于828D和840DSL数控系统使用的工具——EasyXML的相关程序集合,存放在一个zip压缩文件中。828D与840DSL是西门子数控系统(Siemens Numerical ...
### 西门子840Dsl利用PC备份PCU50的数据 #### 知识点一:西门子840Dsl简介与特点 西门子840Dsl是一款高端数控系统,适用于复杂加工任务,如车削、铣削等。该系统具有高度的灵活性和可扩展性,能够满足不同工业应用...
【840dsl Toolbox Step7 5.5:西门子PLC编程工具深度解析】 840dsl Toolbox是一款专为西门子SINUMERIK 840Dsl数控系统设计的软件工具箱,它与Step7 5.5紧密集成,是西门子SIMATIC自动化系统中的一个重要组成部分。...
ST原厂LSM6DSL I2C总线驱动 In the 'driver' folder there are the driver files of Mems Sensor (.h and .c) to be included in your project. Driver documentation can be generate using Doxigen tool. The ...
在数控系统领域,西门子840Dsl是一个非常著名的控制系统,而五轴功能的调试对于复杂曲面的加工至关重要。840Dsl数控系统提供了一个集成的环境,允许用户高效地进行五轴机床的编程、调试和操作。 五轴机床的应用广泛...
西门子840Dsl是西门子推出的数控系统系列之一,广泛应用于机床和加工中心。它以功能强大、操作方便、高度集成而著称,特别是其数控系统操作方法在数控技术领域具有很高的影响力。为了便于用户更好地了解和使用西门子...
标题中的“840Dsl_STEP7_ToolBox4.8.07.rar”指的是Siemens公司的840DSL数控系统与STEP7编程软件的一个工具箱版本。840DSL是Siemens高端数控系统,常用于加工中心、铣床、车床等精密机械设备,具备高效、精确的加工...
从给定的文件内容中,我们可以提取关于SINUMERIK 840Dsl和S120驱动器的大量知识点。以下是对文件内容的详细解析: 首先,文件标题为“840Dsl_S120_参数手册”,它指的是一个包含SINUMERIK 840Dsl数控系统和S120驱动...
标题中的“828D_840Dsl_工具_OPC+UA2.2功能测试客户端”指的是一款专为西门子828D和840DSL数控系统设计的OPC UA(OPC统一架构)功能测试工具。OPC UA是一种工业自动化通信标准,用于不同设备和系统的互操作性,它...
在这篇资源中,我们将详细介绍如何使用DSL来构建复杂的查询语句,以满足各种搜索需求。首先,我们将学习DSL的基本结构和语法规则,包括查询、过滤器、聚合和排序等核心概念。通过深入了解DSL的语法,您将能够灵活地...
西门子840D/840DSL机床伺服电机电流速度读取步骤详解 西门子840D/840DSL机床伺服电机电流速度读取是许多初学者难以掌握的技术难点。本文将详细介绍如何通过西门子840D/840DSL机床伺服电机电流速度读取步骤,希望...
自创Groovy DSL 动态规则(rule)执行引擎, 流程引擎. 特色 风控系统, 规则引擎, 动态接口配置(低代码)Groovy DSL 动态规则(rule)执行引擎。DSL(特定领域语言): 开发 和 业务 共识的语言。方便业务表达需求, 方便开发...
西门子840DSL的TOOLBOX是一个强大的软件工具集,主要用于840DSL数控系统的编程、诊断和维护工作。这款工具对于理解和操作西门子840DSL控制系统至关重要,因为它提供了全面的功能来支持从最初的系统配置到日常运行的...
赠送jar包:dsl-1.2.7.jar; 赠送原API文档:dsl-1.2.7-javadoc.jar; 赠送源代码:dsl-1.2.7-sources.jar; 赠送Maven依赖信息文件:dsl-1.2.7.pom; 包含翻译后的API文档:dsl-1.2.7-javadoc-API文档-中文(简体)版...
【标题】Kotlin DSL Kotlin DSL(Domain Specific Language)是一种使用Kotlin语言构建的特定领域语言,它允许我们以更简洁、更直观的方式编写构建脚本,特别是针对Gradle构建系统。在Android开发中,Kotlin DSL...
DSL测试方案的知识点涵盖了宽带DSL接入方式下的运营维护问题,并提出了相应的自动测试解决方案以及对其中的关键技术点进行讨论。以下是对文中提及的关键知识点的详细说明: 1. DSL测试的背景与意义 - 宽带DSL接入...