Domain Specific Languages-书评
作者不用多介绍了,Martin Fowler,秃顶大叔,重构、UML精粹、企业应用架构模式等一流畅销书的作者,Thoughtworks的Cheif scientist,OO的bigot,XP的zealot,NB的一塌糊涂。
和之前Maritin的书不太一样,这本书的篇幅甚巨,达到了640页的篇幅,而我的mobi电子版则更恐怖,1400页的篇幅差点让我认为买错了。不过好在Martin把本书分成了前后两个部分,用他的话说,this is a duplex book。前面的部分对DSL的各个要点做一个quick tour,大概200页的篇幅,后面的400多页从内部DSL到外部DSL、从代码生成到计算模型简介,覆盖了当今几乎所有DSL的技巧。书中的代码多数为Ruby Java和C#代码,而且需要注意的是,相对于Martin以往的书,这本书的代码量大了不少,所以做好RTFC的准备。
DSL是什么?
首先给出Martin对DSL的定义:
Domain-Specific Language:A computer programming language of limited expressiveness focused on a particular domain
在计算机领域,DSL比比皆是,你可能用到过它但却毫不知情。从Windows里的ini配置文件,到主流编程语言的正则表达式,它们都是DSL:聚焦一个特定的领域,极易读懂,功能很少,异常简洁。
为什么要用DSL?
就拿最最常用的正则表达式为例:"d{3,4}-d{6,8}",稍微有点编程经验的人立刻就能看出来这个诡异的串所代表的含义,如果需要做什么修改也是非常简单。想象一下如果用程序来实现这个正则表达式的功能(匹配一个电话号码)会是一件怎样的工作,再想想对这个程序进行阅读、修改或是扩展是一样怎样的工作,你就可以体会到正则表达式可以为程序员带来多大的便利。
所以说,从开发者的角度来看:DSL是一种用于提高生产力的手段;而更重要的,从客户的角度来看:DSL在开发者和领域专家之间建立起了一座桥梁,从而使开发者能迅速的构建出满足客户需求的软件。本书的封面是一座大桥,我想Martin就是想借桥梁来隐喻DSL的作用。
为什么会有这本书?
DSL并不是一个新的概念,实际上,从六七十年代就已经有DSL的概念了(从某种程度上来说,COBOL和FORTRAN也算是DSL,一个面向商业,一个面向科学计算),然后有Regexp,再到现在的RoR,无一不采用了DSL的思想。那为什么Martin花那么长时间去写这本书呢?是因为DSL一直是一种隐性的知识或是技巧,并没有书面上的记载,这大大局限了DSL的使用。就像Design Pattern建立了OO模式的词汇表一样,Martin试图用此书建立一个DSL的词汇表,以促进DSL开发者之间的交流,加速DSL的发展。
Fred Brook在Mythical man-month提到过:让我看你的流程而不让我看你的数据结构,我仍然一头雾水;让我看你的数据结构,我就不需要再看你的流程了,那将是显而易见的。简单的说,数据结构选对了,代码将会顺理成章;数据结构选错了,代码将会一塌糊涂。
这种说法同样适合于语言,即使是通用语言(General Purpose Language),也有其适合和不适合的领域。选一门和问题域尽可能接近的编程语言,会大大简化你的开发。不要听信一些人所谓的狗屁语言无关论思想重要论。你可以用SQL算100以内的质数,你也可以用C去写GUI,你自己吃饭只吃肯德基,当然会觉着以为世界上所有的餐厅全都卖KFC炸鸡。
其实在这本书之前就有一些关于构建小语言的材料了。最经典的当属Kernighan的The Practice of Programming中的第九章:Notations。虽然篇幅很短,Rob Pike和Brian Kernighan在此章阐述了几乎DSL所有的内容,网络装包和拆包程序(模板替换),正则表达式引擎(外部DSL),Html生成(代码生成)。如果想对DSL有个快速的了解,应该好好看看这本书。
这本书的内容是什么?
当然这本书讲的就是DSL,及DSL相关的内容。
DSL的定义:
给出了DSL的简介,适用场景,和Library的区别,优点,缺点。
内部DSL(Interal DSL):
如何在主流的编程语言中,通过特殊的排版和API调用来实现DSL,一些写法还是挺有趣的,尤其是Method Chain,Josh Bloch也用过这种方式构造对象。
需要注意的是,内部DSL一般要求Fluent API,这和传统的Command-Query API差异甚远。而且由于内部DSL要求方法的连贯调用,从而导致这些方法的单独调用意义不明,请谨慎使用。
外部DSL(External DSL):
这一部分感觉就像是回顾了一把编译课。Delimiter-Directed Tranlation和Syntax-Directed Translation,当然还有BNF是这部分的重头戏。
比较搞笑的是,Martin生怕这些编译的内容把读者吓跑,不停的强调实现一个DSL和实现一个GPL是有很大区别地,编写小语言是很容易地云云。
代码生成(Code Generation):
相对简单实用的一部分。这里的代码生成主要是把DSL代码翻译成可执行的目标语言代码(比如说C),因此可能和编译里的代码生成不太一样。
模板生成和翻译生成是两种很实用的技术,不仅仅可以生成代码,建议仔细阅读。
语义模型:
Martin在DSL一书中从头到尾都在强调,DSL只是领域语义模型上的一层便于使用的Facade,真正重要的是语义模型。就拿正则表达式来说,它背后语义模型无非就是后台的那几个DFA,在几个状态间跑来跑去的。有了语义模型,定义DSL是相当简单的。
Martin在这部分给出了一些常见的语义模型,个人感觉那个自动机模型挺实用。
对这本书的评价:
Martin写的书向来实用不装逼,这本书也不例外。
阅读本书需要一定的实际编程经验,而且会用的语言越多越好。
篇幅很大,不适合直线阅读,建议按照书中的互引来交叉阅读,效果更佳。
内部DSL挺酷,但自己玩玩还行,在公司里用恐怕会有麻烦
外部DSL和代码生成相当实用,运用得当可以省相当大的工作量。
本书大多内容都是点到即止,有种意犹未尽的感觉,这点不太爽。
单独的章节没有引用,所有引用全堆在书尾,这个很不爽。
电子版的代码格式很诡异,这个极度不爽,应该是Amazon的问题。
总之,Martin Fowler本人就是本书质量的保证。
建议延伸阅读:
The Practice of Programming:史上最简洁实用强大高密度的计算机书籍,第9章包含了相当的DSL(估计那会还不叫DSL)内容
DSLs in Action(据说图灵要引进,有兴趣的童鞋报名翻译吧):全是JVM上的东东,神马Scala Clojure的,以实现为主,原理讲的不多
The Definitive ANTLR Reference: Building Domain-Specific Languages 和 Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages: ANTLR作者的两本书,我没有看过,但应该不错,毕竟Martin在DSL一书中用的解析器生成器就是ANTLR
2011-4-28 22:17:28
by Luc
领域特定语言,被忽视多年的编程利器
对“领域特定语言,被忽视多年的编程利器”的回应
《领域特定语言》热门书评
-
领域特定语言,被忽视多年的编程利器
31有用 1无用 figure9 2011-04-28
Domain Specific Languages-书评作者不用多介绍了,Martin Fowler,秃顶大叔,重构、UML精粹、企业应用架构模式等一流畅销书的作者,Thoughtworks的Cheif scientist,OO的bigot,XP的zealot,NB的一塌糊涂。和之前Maritin的...
-
我不想说别人是托,但这无比糟糕的翻译也能9.2分???
8有用 3无用 漂流瓶 2013-06-21
这本书是不是太小众了,居然没有吐槽它的翻译?反正我最近是一边看一边备受折磨,忍不住要上来吐槽几句(处女吐槽)。已经糟到影响阅读的程度了!时不时要拿原版的出来对照,才理解是什么意思。姐姐,我就是英文烂,才要买中文版啊,能不能走点心,靠点谱啊!细节就不用说了,就挑几个标题来说(以下翻译意见不代表我的翻译...
-
比较失望,很一般的书
3有用 0无用 sunglowlee 2013-11-26
看到评价才买的,买来粗读了一遍,实在比较失望。首先,书的翻译水平欠佳。其次,内容组织缺乏逻辑性,缺乏对领域定义语言的明确定义、分类、处理方法的完整、一致的介绍。感觉作者写作时东拉西扯,虽然也算言之成理,但是并没有看到什么真知灼见。第三,各种模式缺乏足够的背景介绍和应用说明,并且对大多数模式的介绍都浅...
-
DSL实践地图册! (敬谢何编赠书)
2有用 2无用 Zoom.Quiet 2013-04-21
书是 130325 寄送到珠海的,超乎相象的厚!- 好象趁出差帝都,用原先的家务时间替换为读书时间,才将此书啃完的- 果断是当初: 编程语言实现模式 (豆瓣) http://book.douban.com/...
-
内容太泛了
2有用 0无用 棍子上的萝卜 2013-09-20
讲内部DSL的部分 还行 挺不错的, 但是没学到什么 或者只是对之前的有些想法产生了共鸣,不知道是不是翻译问题 ,反正这本书的例子感觉很不好。而且通篇几乎都是基于一个例子扩展开来,很生涩。 外部DSL的部分,不如去自己嚼一下龙叔,或者那本简单的编程语言实现模式。 章节分太细,每章连皮毛都不是...
书名: 领域特定语言
作者: [美] Martin Fowler
出版社: 机械工业出版社华章公司
原作名: Domain-Specific Languages
译者: ThoughtWorks中国
出版年: 2013-3
页数: 488
定价: 89.00元
装帧: 平装
ISBN: 9787111413059