注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天地不仁,以万物为Googol!

天行有常,不以物喜,不以己悲……

 
 
 

日志

 
 

蓦然回首:C++历史上的五组五魁首,第一组:五本永远最重要的C++书籍

2006-09-20 00:00:27|  分类: 翻译 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

原文地址:http://www.artima.com/cppsource/top_cpp_books.html

 

作者:Scott Meyers

2006年8月9日

 

摘要:

在这篇文章中,Scott Meyers与大家分享他认为C++史上最重要的五本书,以及他对这五本书的看法。

 

我在1991年写了Effective C++。在那之前的几年,我开始学习C++。我坐下来开始写这篇文章,是因为我曾经认为我从1986年开始学C++,这篇文章就是为了纪念我学这门语言20周年,以及纪念我写的那本书15周年。唉,记忆——至少是我的记忆——实在是不可靠的。历史记录表明,我从1988年开始学习C++。因此2006年就是我学习的第19个年头。虽然这个数字看上去不那么有纪念意义(as round a number,这咋翻?),它依旧说明我与这门语言打交道已经很长时间了。而且我发现,不知道是什么原因,我今年不仅仅在畅想C++的未来,而且在回顾它的过去。关于未来,我们有很多可说的东西,尤其在下一版本的语言标准(C++0x)将要出台的时候——TR1已经发布了,而TR2也箭在弦上。但我现在想要回顾一下我们已经完成的事情,而且我想用一种前所未有的方式来描述:我想选出在C++的不同领域,贡献最大的事物,这种贡献是永恒的。

 

我想以五本最重要的和C++有关的书,作为这个系列的开始。且慢,在进入正文前,或许我应该先做个自我介绍。不用说,我这份列表将是主观的,基于我个人经历和看法的。因此,大概我应该先介绍一下我的经历和观点。

 

我将以你们大家都不敢相信的事情作为开始:从开始学C++算起,这将近20年间,我没有写过一个成品软件,当然也没有用C++写过一个成品软件。以前不写,以后也不会写。更进一步,我从来没有打算尝试用C++写成品软件,所以我不是一个真正的C++开发者,我甚至丝毫不打算成为这个样子。但另一方面,在我在校研究期间(1985年-1993年,应该是他从本科毕业到获得博士学位的那段时间)我确实用C++写过研究软件,但那只是个很小的(只有几千行),一个程序员很快就能写出来的东西(single-developer to-be-throw-away-quickly stuff)。而且,在我成为顾问的这些年里,我写C++程序也局限在娱乐程序“看看这个是怎么工作的”(有些时候,是“看看编译器能报多少错误”),而且这些程序一般都只有一个文件。(make?谁需要那难堪的make?)我靠C++吃饭,但并不是说我在用C++方面有多么高深的功力。

 

我也没什么能力与C++语言标准扯上关系,因为我不是C++标准委员会的成员,我不在委员会的邮件列表里,而且我也没出席过任何制定标准的会议。我所了解到的委员会内部工作——包括那些产生重大影响的事情——都是我从别的地方看到或者听说的。这意味着我对使C++成为现在这个样子的关键因素(important forces)毫不知情,可能只有在委员会内部,才能察觉到这些因素。

 

在谈到我既没有真正使用C++,又没有参与标准的制定过程后,估计你一定很想知道我到底在做什么。基本上,我在研究C++以及相关程序。我尽可能的收集与这门语言及使用相关的信息(通过书籍,杂志,新闻组,邮件,和程序员或者委员会成员的面对面交谈,我写玩具程序的经验,诸如此类),并把信息提供给像你们一样的人——C++的使用者。你们的工作是用C++来写出有用的软件。我的工作是发现并打包(package)那些能让你们更好的使用它的信息。

 

我更喜欢把自己看成个旁观者,不用一天到晚非常辛苦的编程,也不用非常敏锐的关心标准化中的琐碎细节,虽然我对这两种工作都很熟悉。那么,这一系列文章,就是一个自称旁观者的人,对C++出现后对其最重要的贡献的一个总结。

 

“最重要”,是指那些对使用C++的人产生了重大影响的事物。我列表中的很多事情都有重大影响,换个话说,开发者能直接感受到这些影响。比如说,广泛使用的编译器和库以及广泛阅读的书和文章就有直接的影响。有些事物会有间接影响,因为它们对那些有直接影响的事物产生了直接或者间接的影响(啊哈,递归了,你喜欢么?)举个例子,你很快会看到我在最有影响的书单中提到了《ISO C++标准》,这是因为此书通过影响编译器和库的实现,对开发者造成了间接影响。

 

有些事物会很快造成重要影响,比如《ISO C++标准》就是个例子。更一般的情况是,这些影响通过时间的考验,慢慢显示出来。正是这个原因,我表中可能更多列举的是已经发生过一段时间的事物,而没有那些对C++社区来说是很新的东西。比如,书籍列表中,最新的一本是2001年出版的。这并不是说之后的这些年没有有影响的书籍。这只是说,在我的观念中,近五年的新书,没有比我列表中的书更重要的。如果过几年再问我这个问题,我的想法也许就会改变了。

 

五本最重要的C++书籍

 

为了使这个列表(还包括这个系列的其他列表)更有意义,我给自己定了两个规矩。第一,我一定要限制自己只列五本书。既不会出现有更多的书享受同一殊荣的情况,也不会提及其他备选书。五个机会,五本书。第二,我举贤不避亲。我要评判别人的书,我也要评判自己的书。

 

上面提到的规矩是公平的,也是严格的。所以,我决定在另一方面给我自己松绑:我不会给这张表上的书(或者其他列表的内容)从高到低排序。我选择的粒度是:“在列表中”和“不在列表中”。在每张表中,我将按时间进行排序,具体到本表,是第一次出版的日期。

 

那么,现在,是给出我选出的五本最重要的书的时候了:

 

蓦然回首:C++历史上的五组五魁首,第一组:五本永远最重要的C++书籍 - null - 天地不仁,以万物为Googol!

- The C++ Programming Language,作者:Bjarne Stroustrup(中译本《C++程序设计语言》,译者:裘宗燕)。出版社:Addison-Wesley,1986年第一版,1991年第二版,1997年第三版,2000年特别版。对C++的老前辈来说,本书第一版是开天辟地的——我们所有知识的源泉。现在的版本已经膨胀到1000多页,包括了早期没有的语言特性,比如模版,异常,多重继承,更别提标准模版库了。但是第一版——我唯一逐行读过的一版——只有简洁的328页。对那些1980年后半段的C++程序员来说,这本书是必读的,而且它对C++早期支持者和反对者的影响都是不容忽视的。甚至现在,在众多可供选择的介绍C++的书籍中,我仍然推荐真正的程序员应该拥有本书(的最新版),因为我认为这本书能够在语言和使用两方面,都提供全面翔实的参考。

 

Stroustrup在写作上是十分简洁的,而且我知道有人这么评价:如果在看《TC++PL》(这本书的常用缩写)忽略了那怕是一个句子,都有可能漏掉很重要的内容。(再想想当前版本那1000多页的厚度,你就会了解我为什么夸这本书是全面的参考书了)同时,简洁也是这本书很有吸引力的地方。比如,下面是第一版里提到的处理自赋值情况的所有内容:

 

if (this == &a) return;      // beware of s=s;

 

在《Effective C++》的第一版里,我花了五页半,来描述同样的陷阱。这本书只用了半行注释就覆盖了这一点,你不得不佩服这本书。

 

蓦然回首:C++历史上的五组五魁首,第一组:五本永远最重要的C++书籍 - null - 天地不仁,以万物为Googol!

- Effective C++,作者:Scott Meyers(中译本《Effective C++中文版》,译者:侯捷)。出版社:Addison-Wesley,1992年第一版,1998年第二版,2005年第三版。这纯粹是个天才的产物!等等,别介意我这么说。我的这本书确实好运,因为这是一本在正确时间出现的正确的书。在1991年,很多程序员掌握了C++的基本语法。他们可以用C++完成任何事情,但是他们发现他们犯了很多本应该避免的错误。与仅仅是学习语法不同,这本书是第一本专注于“使用C++”的书,集中在帮助开发者避免常见的错误,并且更好的运用语言中“非C”的特性(比如,构造和析构,继承,虚函数,小类内存分配器(per-class allocators),等等)而且,本书以条款方式组织内容。书的内容,与当时的主流完全不同,当时更多的方式是讨论C++的弹性。我的经验是,程序员需要知道处理这种弹性的方法,本质上,就是告诉他们如何去做。因而,这本书就是这样的。“一定要这样做。”“永远不要那样做。”一代程序员将这些建议熟记于心,并提供了诸多类似lint的程序来自动检验程序是否违反了这些建议。GNU C++甚至提供了一个编译选项,提示程序中与建议不一致的地方(注1)。这本书最重要的特性——也是我在我的第二本书(More Effective C++)中没有遵从的——就是每一条目都很短小,可以用来打发坐车的时间,等待会议开始的时间,或者,就像我说过的,在上厕所的时候。

 

蓦然回首:C++历史上的五组五魁首,第一组:五本永远最重要的C++书籍 - null - 天地不仁,以万物为Googol!

- Design Patterns,作者:Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides(中译本《设计模式》,译者:李英军 马晓星 蔡敏 刘建中)。出版社:Addison-Wesley,1995年出版。这不是针对C++的书,但是对如何设计优秀的C++程序以及其他面向对象语言写的程序,产生了深远的影响。这本书在专业开发者中掀起了模式运动,并且提供了一系列的模式以供参考。本书中对模式的命名沿用至今。(注2)如果你对命令模式(Command),访问者模式(Visitor),修饰模式(Decorator)和单体(Singleton)很熟悉的话——甚至是完全了解,你真应该好好感谢这本书。

 

受这本书中提到的模式影响,C++评论者们一直在坚持进一步的讨论各种模式。比如,Herb Sutter在2003年九月号《C/C++ Users Journal》的专栏中,写了一个观察者模式(Observer)的新实现,而Andrei Alexandrescu则在2005年六月号和八月号《C/C++ Users Journal》的专栏中再次讨论这个模式。

 

蓦然回首:C++历史上的五组五魁首,第一组:五本永远最重要的C++书籍 - null - 天地不仁,以万物为Googol!

- International Standard for C++,(据我所知,尚无中译本)。出版者:ISO/IEC,1998年第一版,2003年第二版。定义标准的文档并不为了吸引人阅读,而是用来定义什么是和什么不是C++。在标准出现之前,Margaret Ellis’ 与Bjarne Stroustrup合写的《The Annotated C++ Reference Manual》(出版社:Addison-Wesley, 1990年出版——一般被称作ARM)是最明确的标准。用编译器检验你的代码,之后再来看看Stroustrup是怎么想的(你可以把这本书看作Stroustrup的思想代理)。1998年那版的标准文档没能回答所有问题(也没有任何文档可以做到),并且没能回答一些标准制定者认为已经回答了的问题(比如,vector的内存布局必须要兼容C的数组么?(注3)),但标准本身具有强制性,并为编译器实现者和使用者提供了权威的参考。2003年的“第二版”实际只修改了一些错误,就版本号来说,也许1.1会比2.0更合适,但这也是对C++官方定义的一个重要补充。

 

蓦然回首:C++历史上的五组五魁首,第一组:五本永远最重要的C++书籍 - null - 天地不仁,以万物为Googol!

- Modern C++ Design,作者:Andrei Alexandrescu(中译本《C++设计新思维》,译者:侯捷,于春景)。出版社:Addison-Wesley,2001年出版。模版确实只是为了支持“类型T的容器”这个功能而设计的,但是模版的能力却大大超乎想像 。一些人在本书出现前就意识到了这一点,并且,实际上STL——这个已经成为了1998年版的标准的一部分——对实现模版的技术,已经远远超过了实现“T的容器”所需要的技术。但是这本书的出版,才真正敲开了模版编程的大门,使整个C++社区为之一变。最明显的一点,就是目前的C++编程时代,是以这本书的名字命名的:“现代C++”(modern C++)一般是指在编程时使用本书介绍的模版技术。(用Google查找新闻组里关于“modern C++”的帖子,在1985年到2000年之间只有662个,而从2001年至今已经超过了3200个。)

 

在提到C++的历史时,很少会提到这本书的重要性。但是要知道,在Alexandrescu出版本书的时候,他都不能找到一个能正确编译书中代码的编译器,而这些代码确实是符合标准的!

 

在对这个列表的内容进行评论前,我需要提醒你,我是Addison-Wesley的签约作者,因此如果需要,我有资格免费得到很多Addison-Wesley出版的书。因此与别的出版社的书相比,我更熟悉Addison-Wesley的书。不过我还要说的是,我认为,如果别的出版社也有震动C++界的书籍出版,我一定会听说过那本书。

 

在下一篇文章中,我将列出我认为C++历史中最重要的非书籍出版物(比如杂志文章之类的)。

 

注:
1 这个选项是-Weffc++
2 每次,我用Google在网页和帖子里搜索最常被提到的模式名称,我都会得到这样的结果:20个最经常提到的模式名称,其中大部分都是这本书中定义的。这对一本已经出版了十年的书来说,是很了不起的。
3 答案是:是的

 

后记:
翻了4天,才把这篇短文翻完,这水平真不是盖的……希望接下来的几篇能快一些吧。

 

我还想补充几本书,虽然Scott没有提到它们,但它们对我的帮助颇多。

1 C++沉思录。我接触OO还是很早的,早在当年的《Turbo Pascal大全》的最后一章,就提到了OO。但是,我真正了解OO是什么,还是通过这本沉思录。书中以例子开始,详细讲解了为什么要OO,怎么样用OO。这本书,不仅仅是针对C++的OO介绍,其他语言也可以用来参考学习。

 

2 C++设计与演化。这本书,乃是C++的创造者写的一部编年体+纪传体的史书。前半部分按照时间顺序(编年体)写了语言的早期发展,后半部分按照不同特性(纪传体),描写了每种特性在当初引入的原因,对现有特性的影响,实现细节等。与TC++PL一样,这也是一本字字见真经的书。(一个人写的嘛,都是一种风格)

 

3 深入探索C++对象模式。C++的优点在于封装细节,但缺点也是。由于使用者看不到细节,因此使用时经常会陷入低性能的陷阱。这书详细揭示了当年cfront 2.0对C++特性的实现细节。而且,到今天为止,绝大部分编译器(反正是我所知的所有编译器)都是按照本书描述的实现的。

 

4 STL原码解析。STL是模版应用的神迹。如果看完了《C++设计新思维》,却还不会应用里面提到的技巧,看这个书吧。(虽然STL早在《C++设计新思维》出版前就存在了……)

 

5 标准C++输入输出流及本地化。呃……这是我目前最想看的书。C++标准输入输出的设计极为复杂,甚至出现了难于驾驭的钻石型继承。如果看看当年设计者怎么说怎么想,对使用好标准输入输出一定大有帮助。至于本地化,要知道现在可使全球化的时代了。

 

  评论这张
 
阅读(748)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017