`
javatar
  • 浏览: 1700189 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

[转]领域专用语言(DSL)

    博客分类:
  • HTTL
阅读更多
转自:http://blog.csdn.net/mfowler/archive/2006/08/16/1069927.aspx

原文:DomainSpecificLanguage (http://www.martinfowler.com/bliki/DomainSpecificLanguage.html)

所谓领域专用语言(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的极好的参考资源。
分享到:
评论

相关推荐

    DSL领域定制语言实战

    本书是第一本领域专用语言(DSL)的实战类图书,它面向真正的实践者,是一本让奋战在开发第一线的实干家备感实用的专著! 《领域专用语言实战》基于一系列JVM语言(Java、Ruby、Groovy、Scala和Clojure),分析了...

    使用Xtext和Xtend实现域特定语言(第二版)-中文-第四章.pdf

    在本章中,我们将深入探讨如何使用Xtext和Xtend来实现域特定语言(DSL)的验证功能。验证在DSL开发中起着至关重要的作用,因为它允许在用户编辑DSL时实时检查并报告错误和警告,确保代码符合既定的语法规则和约束。 ...

    PHP版本的Sinatra极其轻量优雅的web领域专用语言框架

    【标题】"PHP版本的Sinatra极其轻量优雅的web领域专用语言框架"指的是一个名为Pinatra的PHP框架,它是对Ruby的Sinatra框架的一种实现。Sinatra在Ruby世界里以其简洁、高效的语法而著名,使得开发者能快速构建Web应用...

    dsl:计算法领域专用语言

    L4 DSL的未来之家 该规范目前处于早期草案阶段,并且有望在2020年余下时间内不断发展。根据该规范编写L4的唯一人员是核心开发团队,它甚至并不总是为他们服务。语言规范草案v0.3.0 我们回顾一个简单的案例。 然后,...

    Python-Selda用于与关系数据库交互的嵌入式特定领域专用语言

    Python-Selda是一个创新的工具,它为Python开发者提供了一种类型安全、高级的SQL领域特定语言(DSL),使得与关系数据库的交互变得更加简洁和高效。Selda的设计灵感来源于Haskell中的Selda库,它将SQL语句直接嵌入到...

    DynamicPPL.jl:动态概率编程的领域专用语言(DSL)的实现

    使用的领域特定语言和概率编程语言的后端。 你想做出贡献? 如果您认为自己有一些相关技能并且对贡献有所兴趣,请联系并在Github上发表文章。 贡献者指南 该项目遵循 ,除了以下细微变化: master分支包含任何...

    Java8采用Martin Fowler的方法创建内部DSL

    内部DSL是通过在已有的编程语言内部构造一种专用的语言来实现的,使得代码更贴近所要解决的问题领域。Martin Fowler是一位知名的技术作家和软件咨询师,他在他的著作中多次探讨了DSL的设计与实现。 首先,让我们...

    840dsl toolbox_step7_5.5

    840dsl Toolbox针对SINUMERIK 840Dsl系统,是Step7的强大补充,它包含了一系列专用工具,如NC(数值控制)编程、PLC编程、HMI(人机界面)设计等,用于实现机床控制、工艺逻辑和数据管理等功能。840dsl Toolbox使得...

    mapping-master:支持用于将电子表格映射到OWL本体的Mapping Master DSL的库

    测绘大师MappingMaster是一个开源库,可用于将电子表格的内容转换为OWL本体。 有关文档,请参见 。建造要构建此库,您必须安装以下项目: 用于签出存储库的工具。 Apache的 。... 提供了一个来构建与Mapping Master相关...

    asip-dsl:用于制作 ASIP 的特定领域语言,该语言将转换为 VHDL 代码,以便随后在 FPGA 上运行它们

    这是我编写的一种领域特定语言,用于简化 FPGA 程序的开发。 仍在开发中的杀手级功能是允许硬件和软件在同一个地方共存。 与其他工具不同,您必须多次单击才能使来自 VHDL 的信号在软核中可见,您可以在一个文件中...

    eclipse-dsl-2023-09-R-win32-x86-64.zip

    Eclipse DSL 2023-09-R-win32-x86_64.zip 是一个专为Windows操作系统设计的软件包,它包含了Eclipse IDE的特定版本,用于支持领域专用语言(Domain Specific Language, DSL)开发。这个压缩包的核心是Eclipse集成...

    基于C语言的自定制脚本语言设计与研究.pdf

    在深入分析《基于C语言的自定制脚本语言设计与研究》这一文档之前,需要明确几个核心概念,包括C语言、自定制脚本语言、领域专用语言(DSL),以及语言设计的关键要素。本文档将探讨如何利用C语言作为基础,设计一种...

    840Dsl_828D_commissioningmanual_OPCUA_released

    它支持跨平台、跨语言和跨厂商的通讯,因此被广泛应用于工业自动化领域。 西门子840Dsl和828D控制器简介: 西门子840Dsl和828D数控系统是西门子公司生产的高性能数控系统,用于机床控制与管理。840Dsl作为840D系列...

    SQL DSL (Domain Specific Language) for Kotlin and Java. Su.zip

    SQL DSL(领域特定语言)是为特定编程语言设计的、用于简化数据库操作的专用语法。在Kotlin和Java中,SQL DSL提供了一种更简洁、类型安全的方式来编写SQL查询,使得开发者可以像编写代码一样编写SQL,提高了开发效率...

    DSL-tao:用于基于模式的DSL构建的工具

    DSL-tao 主要面向那些需要为自己的应用或系统设计专用语言的开发者,特别是对于那些复杂度较高、业务规则繁多的项目,使用DSL-tao 可以提高代码的可读性和可维护性。这个工具的核心理念是利用模式来驱动DSL的设计,...

    轻量,快速,稳定,可编排的组件式规则引擎/流程引擎 拥有全新设计的DSL规则表达式 组件复用,同步/异步编排,动态编排

    liteFlow 是一个高效、轻量级且稳定的组件式规则引擎和流程引擎,它提供了一种全新的设计思路,即专用的领域特定语言(DSL)规则表达式,使得业务逻辑的编写和执行更加便捷。该引擎的核心特性包括组件复用、同步与...

    Gradle:真正简化流程图的DSL

    Cradle是一种DSL(领域专用语言),用于使流程图和图形变得非常容易。 交互和UX设计涉及复杂的逻辑和结构,但我们的设计经验工具通常仅限于在Figma / Sketch / Omnigraffle /中使用手动绘制框和箭头/无论您使用哪种...

Global site tag (gtag.js) - Google Analytics