领域特定语言,被忽视多年的编程利器_领域特定语言书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > 领域特定语言 > 领域特定语言,被忽视多年的编程利器
figure9 领域特定语言 的书评 发表时间:2011-04-28 22:04:48

领域特定语言,被忽视多年的编程利器

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

您对该书评有什么想说的?

发 表

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

对“领域特定语言,被忽视多年的编程利器”的回应

RickRashidTang 2015-01-01 18:58:34

楼上的不是看电子版吗? 对于引用, 您加上一个tag, 然后看到的时候就 `跳转到定义出`, 这不就不会不爽了? :-D
如果您改成看纸书了, 把index页面扯下来就行了哈, 我就是这么干的.

hooliganstreet 2014-02-10 17:33:40

>>看来又是老马来骗钱了,被忽悠了还拜做大神~~╮(╯▽╰)╭
>>废话一堆,老马是最擅长把一些计算机基础问题吹的天花乱坠的作家,书可以不>>用看,但他的blog可以读读,有电子版的就看看吧,没有也无妨。

严重同意。


》》   Martin写的书向来实用不装逼,这本书也不例外。

正好相反,看过他写的重构,装逼的很,连译者都说看过一次再也没看过。


》》   本书大多内容都是点到即止,有种意犹未尽的感觉,这点不太爽。
》》   单独的章节没有引用,所有引用全堆在书尾,这个很不爽。
  
这个同意。

遥远天空下 2013-06-12 17:32:45

中文版的怎么才488页?

残影 2013-03-15 09:44:13

终于有了啊……

何艳 2013-03-15 08:46:05

亲们,翻译版已经出版了哈
http://book.douban.com/subject/21964984/
译者是ThoughtWorks中国团队的:)

善为 2012-06-01 13:49:30

那里有电子版卖啊

残影 2012-05-29 20:41:32

难道是因为这书市场不被看好……雪藏了么。

残影 2012-05-28 17:12:59

……哪个出版社引进了啊,现在还有消息么……

廖师虎 2012-01-28 12:18:13

快一年了,还不见踪影啊!

I'm Lazing 2011-05-06 01:17:29

不客气,大家一起学习交流

hex 2011-05-03 20:20:59

非常感谢呵,有电子版终于可以看到内容了~~

figure9 2011-05-03 19:26:08

多谢楼上的电子版

I'm Lazing 2011-05-03 14:32:37

没出版之前martin在网站上有WIP,基本上有很多内容,看了一些,确实醍醐灌顶。不过需要有对编译原理有些了解,不然看起来非常困难。

hex 2011-04-28 23:38:55

嗯,3Q~ 只能等等了,看看Language Implementation Patterns (http://book.douban.com/subject/4030327/) 也不错

figure9 2011-04-28 23:35:05

已经有出版社引进这本书了,等下翻译版吧

http://martinfowler.com/dsl.html 上面有本书的简介和相关视频
http://www.informit.com/articles/article.aspx?p=1592379 提供了第一章的试读


hex 2011-04-28 23:30:40

有电子版看也很幸福呵

figure9 2011-04-28 23:05:56

似乎Martin Fowler的书都没有电子版
我是在Amazon上买的电子版看的

hex 2011-04-28 22:56:24

书太贵,又没有电子版。。。