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

转自: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的极好的参考资源。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《领域专用语言实战》是一本介绍领域专用语言(Domain-Specific Language,简称DSL)的实战手册。DSL是一种用于特定领域编程语言,旨在解决特定领域的问题,提供更高效、更直观的编程方式。本书通过实战的方式,详细介绍了DSL的设计原则、开发流程以及实际应用。 首先,《领域专用语言实战》首先介绍了DSL的概念和优势。DSL相对于通用编程语言,更贴近特定领域的需求和概念,能够减少冗余代码,并且提高开发效率和可读性。本书通过实例演示了如何使用DSL来解决不同领域的问题,并对比了DSL与通用编程语言的差异。 其次,《领域专用语言实战》详细讲解了DSL的实际开发过程。包括DSL的设计原则、语法和语义规则的定义、解析器和编译器的构建等。通过具体案例的介绍,读者可以了解如何定义DSL的语法和语义,以及如何将DSL化为可执行的代码。 最后,《领域专用语言实战》还介绍了DSL的实际应用场景。包括领域建模、软件开发、数据处理等多个领域。通过实际案例的演示,读者可以了解DSL在不同领域的应用方式和优势,以及如何通过DSL解决实际问题。 总之,《领域专用语言实战》是一本深入浅出的DSL实战指南,通过理论和实例相结合的方式,帮助读者了解DSL的概念、开发过程和实际应用,培养读者设计和使用DSL的能力,提高软件开发效率和质量。无论是对于软件开发者还是对于对特定领域有需求的人群,本书都是一本实用的指南。 ### 回答2: 《领域专用语言实战.pdf》是一本关于领域专用语言(Domain-Specific Language,DSL)实际应用的书籍。领域专用语言是一种针对特定领域编程语言,用于解决该领域的问题。这本书主要介绍了DSL的基本概念、设计思想以及在实际项目中的应用。 在《领域专用语言实战.pdf》中,作者详细解释了领域专用语言的定义和分类。他们介绍了内部DSL和外部DSL两种常见类型,并比较了它们的优缺点。此外,书中还涵盖了DSL的设计原则和开发过程,包括如何识别并定义领域概念、如何设计DSL的语法和语义,以及如何实现DSL编译器或解释器。 《领域专用语言实战.pdf》还包含了丰富的实例和案例分析,帮助读者理解如何使用DSL解决具体问题。通过这些案例,读者可以学习到如何为领域定制语言,提高软件系统的可读性和可维护性。此外,书中还介绍了一些常见的DSL工具和框架,如Antlr和Xtext,以及它们的应用场景和使用方法。 总体而言,《领域专用语言实战.pdf》是一本系统而实用的DSL开发指南。它适合那些对领域专用语言感兴趣的软件开发人员和架构师阅读。通过学习本书,读者可以了解到领域专用语言的概念、设计和实现方法,并能够在实际项目中应用DSL来提高软件的开发效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值