[声明]:本文由kingofark创作。本文中的所有内容仅代表kingofark个人的观点,与任何其他个人或团体无关。任何人或团体都可以复制、传播本文,但需附上完整的本声明。kingofark对于不同意上述各点或不履行上述各要求的个人或团体的言行不负任何责任。特此声明。
kingofark的第2个“五评计划”——五评C++(2)
[kingofark的话]:第1个“五评计划”的发表已经是相当久远的事情了。kingofark并无意“评”出个什么,只不过看书之余随便发作一下。文字写出来了,谓之“杂感”,与“评”并无多大关系。所谓“推荐度”,也多多少少是个人情绪化偏执的部分体现,不外乎主观随机数发生器的一次输出,因此请大家千万别当回事儿——民间的说法,听听罢,可以全不信,不宜全信。……好,回到正题——呃,那个……可以暂停向我掷烂西红柿吗?好的,好多了。谢谢——本期继续上期的C++主题,涉及的内容仍是以C++语言本身为议题,包括3本参考书、一本“课外书”以及一个著名的期刊。……哦,可以继续掷烂西红柿了。
[一]:《标准C++宝典》,[美] Al Stevens/Clayton Walnum 著,林丽闽/别红霞 等译,电子工业出版社 2001年
[推荐度]:1
[推荐理由]:
美国IDG“宝典”丛书笔者买过两本,一本是《Flash 4宝典》——不幸的是该书内容于笔者太过专业,笔者从中找不到太多给门外汉使用的实用信息(买错了书?唔,看来是这样);另一本就是这里的《标准C++宝典》,原书名为《Standard C++ Bible》。
该书在内容的组织形式上是“传统的”参考书形式,分为五大部分。第一部分“C++语言”,介绍计算机语言的基础要素,从“C语言和C++语言的简要历史”开始讲起,接着便是——关键字啦、函数啦、if-else-then啦、数据类型啦,直至库函数、预处理、类、模板等的概念和描述;第二部分“类的使用”着重介绍运算符重载、继承、类模板,却在该部分的最后一章(第16章)以“面向对象程序设计”为标题,用9页篇幅对面向对象作了个简介(算不上精辟)——给人一种错觉,大有“前面介绍的都不是OO的”之误导嫌疑(对一个“阳春”初学者的心理影响可想而知),至少也是“先斩后奏”(为了让初学者“豁然开朗”?为何不让顺序阅读的、循规蹈矩的入门者先对自己要了解的东西有个较高较广角度的概观和认识?)——似乎更应该放到第一部分去,作者如此这般的意图实在无法推敲;第三部分“C++标准库”;第四部分“标准模板库”,居然没有讲auto_ptr(当然不排除笔者没找到的情况;由于该书没有索引,因此倘若auto_ptr窝在哪个角落,笔者甘拜下风——实在找不着!),其内容覆盖面可见一斑,实在不值一提;第五部分“C++高级主题”,讨论的(竟然)是namespace、转型(cast)以及本地化(std::locale)——使用STL的时候,不了解namespace概念怎么行?怎么着也算不上高级吧!?——给笔者印象深刻的是作者对书中using namespace语句例子的说明:
(清单26-2中写了一个简单的程序,在main()之前使用了“using namespace std;”)
“……然而请注意,并没有一种可以推荐的程序设计惯例,因为使用名字空间语句基本上是在全局层次设置特定的名字空间,这几乎完全违背了名字空间最初的目标。清单26-3示例了在将using namespace语句包含于程序中时可能遇到的问题。”
*******************************************
全书处处包含完整的例子代码,有助于初学,当然也带来问题——由于该书没有索引,所以参考查阅者不得不屡屡翻过丰富的例子代码以便找到自己需要的只言片语。还有一个揪心的地方是该书第1章对C++的一句话简介:
“C++是具有面向对象扩充内容的过程型程序设计语言”。
(沉默)
我们先看看C++设计者Bjarne Stroustrup是怎样用一句话介绍C++的吧:
“C++是一种使用静态类型机制的(statically-typed)、通用目的(general-purpose)的语言,它通过类机制和虚拟函数机制来支持面向对象程序设计,通过模板机制来支持泛型程序设计,并通过提供底层的语言设施来支持详细的系统程序设计。”(摘自A Brief Look At C++,kingofark译)
“C++ is a general-purpose programming language with a bias towards systems programming that
- is a better C,
- supports data abstraction,
- supports object-oriented programming,and
- supports generic programming”(摘自The C++ Programming Language 3rd Edition)
话可以说的不一样,但是基本意思必须相当才行啊。好在上面那句话并没有影响全书对标准C++的描述。作为一本普通的语言参考书,此书内容不够丰厚、细节不够全面,对STL的涉及面差强人意,愧对其书名(无论中文还是英文),所以推荐度为1。
翻译方面还是不错的,笔者感觉一般,不影响阅读。
想要权威的C++参考书,不妨看看下面的[六]。
[二]:《掌握标准C++类》,[美] Cameron Hughes/Tracey Hughes著,健莲科技 译,人民邮电出版社 2000年
[推荐度]:3.5
[推荐理由]:
原书是1999年出版。该书是人民邮电出版社“计算机技术译林精选系列”图书之一(上期五评计划介绍的《C++面向对象高效编程》也属于这个系列),有条理的介绍了C++标准库/STL的基本概念和用法。全文并没有揭示STL背后那些深奥(且恐怖?)的泛型技术内幕,而是纯粹站在程序库使用者的角度,先将使用库所需的基本知识作简洁明了的介绍,然后便将库中所包含的主题(iostream啦,container啦,内存管理啦,泛型算法啦,等等)一一罗列并讲解用法。
该书470页,篇幅并不算大,在深度和广度上也不如即将出版的几本关于C++标准库的经典著作,但是笔者认为该书的一大特点是经常使用图表作为辅助手段来阐释概念和例子,对于读者理解正在讨论的内容有着颇好的效果。其中的图包括示意图(“图1.1 对象如何从外部输入设备,经过临时缓冲区,传输到内存的目标位置”里画了一个天文望远镜)、关系图(描述类层次结构、存储模型结构、功能关系图等)、行为图(列出例子里使用的逻辑或物理结构,形象的描述算法或操作对其的作用)等,这些图简单明了、形象逼真(比如其中“图10.7”虽然只是逻辑图,但其通过对auto_ptr对象前后状态及内容的图示,很好的描述了auto_ptr所有权的传递);其中的表大部分是对各种内容的归纳(比如各种container提供的算法之罗列)和比较(比如容器所支持的访问方法之比较),非常方便读者参考和概览,也有一些表用来演示操作的执行(比如“表9.4 单步跟踪累加算法中百分比函数对象的使用”等)。
另外,书中的第十三章“用Java连接(interfacing)C++”也是格外引人注目的一章。本章篇幅很小(12页),包括Java API、C++与Java的通信、Java本地接口以及“一个JNI的例子”四个小节。事实上,这一章的内容也许算不上丰富,甚至让人感觉有些仓促和不知所云,而其之所以引起笔者注意,一来是因为该章的内容与全书其它料想之中的章节(container啦,泛型算法啦等等)迥异,二来则是因为作者在该章开头说的一些话令人思考到关于C++的问题。下文摘自该书第十三章:
“尽管C++语言有一个大而且令人生畏的类库,它涵盖了从内存管理到国际化的整个领域,但是还是有几个领域该库不能访问:尤其是Internet编程和数据库编程。……如果目标是对于Internet或基于SQL、基于PC的数据库,提供一种平台独立(platform-independent)的访问。那么集成C++类库和Java类库,对于销售商提供的和私人拥有的库来说,就是一种很好的选择。C++类库和Java类库的集成……,而集成来自两种语言的类对于开发平台独立软件也不失为一种好的方法。Java Swing类和AWT类也可以为用C++写成的软件提供一个平台独立的图形用户接口(GUI)。”
无论我们对作者此言持有什么意见,至少其似乎反映了C++相关的某些值得讨论的议题。
大家从上面引用的书中段落就可以一窥该书的翻译质量了。笔者平心而论:不优秀,但也不是很差——一般般了,并不太影响阅读。有一点让笔者揪心的是,STL中的set、map等container也被译成了中文(“集合容器”、“映像容器”),感觉有些多此一举,不太好(?)。
随书的光盘包括例子代码和html文档格式的快速参考。“快速参考中有重要C++类和对象的信息……包含每个类在C++标准类库中的UML类关系图”——但是说到快速参考,其确实不如各个开发环境提供的帮助好用;而“UML类关系图”则不知道为什么很不清晰(中译本制作问题还是原书品质问题?),令人比较失望。
笔者对该书给了3.5的推荐度,而实际上笔者对该书的推荐度很为难,主要有三个原因:其一,笔者(kingofark)本身对标准库并不熟悉,更没有丰厚的实践经验,所以无法站在高的角度衡量该书的参考价值;其二,笔者作为STL的初学者,并没有通读全书(惭愧中……),并不知晓书中的技术细节或例子代码具体存在多少正误;其三,大家可能也知道,有几本经典的C++标准库/STL书籍也陆续要与大家见面了,因而就有了一个“值不值得买”的问题——谁不想把血汗钱花在最值得的地方?当然,仁者见仁,智者见智,不同的书适合不同的读者;书的好坏则是另外一个问题了。“萝卜白菜,各有所爱”——这萝卜白菜,包不包括烂萝卜和烂白菜呢?
笔者觉得这本书作为一本入门书还是不错的,因为该书不仅罗列了各种主题,还对各个主题有着较好的归纳、总结以及提示,例子代码也比较多,便于初学者学习使用,无论如何还是值得推荐。
[三]:《C/C++程序员实用大全——C/C++最佳编程指南》,[美] Kris Jamsa/Lars Klander著,张春晖/刘大庆 等译,中国水利电力出版社 1999
[推荐度]:2
[推荐理由]:
原书名为Jamsa’s C/C++ Programmer’s Bible/The Ultimate Guide to C/C++ Programming。这块958页的“枕头”分为三大部分,以1500个条款(应该说是1250个条款)的形式讲述了在使用C/C++进行编程时遇到的方方面面的基本细节:
第一部分(1至433页/条款1至条款802)专门讲述C编程,通过802个条款从“编程简介”(条款1)讲到“判断可用的盘空间”(条款352),乃至“执行一个子进程”(条款757),在分类上则以“C语言入门”、“宏与常量”、“字符串”、“函数”、“键盘操作”、“数学”、“文件、目录和磁盘”、“数组、指针和结构”、“DOS和BIOS服务”、“内存管理”、“日期和时间”、“重定向I/O和进程命令行”、“编程工具”、“高级C语言编程”等作为章节标题划分区块。每个条款的篇幅大多很小,有“一次讲一点”的感觉,就连一个printf语句的用法竟也横跨23个条款(条款53至76),光是用printf显示无符号整型数、长整型数、浮点型数、字符型数就被分为4个条款逐一讲述——笔者认为这样的组织形式最大优点是一目了然,演示性强(比如该书几乎每一条款都有例子,从全书整体上讲内容也许并不算包罗万象,但是像这样一本以实践要点为导向的书至少也可以戴“细节完美主义”的帽子,算得上“傻瓜参考书”);而其最大缺点则是可能在理论叙述方面的结构性、逻辑性不强,不容易让读者形成完整的总体印象。笔者认为这样的书不适合完全“阳春”的入门者,而非常适合对内容略知一二的入门者当作学习、实践的参考之用,更可以作为在睡前、便中、午后信手拈来的阅读资料——是的,因为其将内容划分成琐碎的小块,从心理上便于读者短时间分散阅读。
本书的第二大部分(434页至714页/条款803至条款1250)专门讲述C++编程。笔者在买书之初最担心的就是害怕其C++部分走“C和C++纠缠不清”的老路(这个话题不再多说——大家也知道,前好几年的时候,人们对C++的误解是普遍存在的)。令人高兴的是,该书作者在C++的第一个条款(条款803)就写道:“C++是C语言的超集,因为它支持从本书学到的C语言的特性,但是C++不仅仅是‘面向对象的C’——它增加了许多新的提高编程能力的特征。”虽然说得不够贴切,但至少没有蛊惑读者。随后的400多个条款从cout说起,然后便是类啦、继承啦、多态啦、STL啦,不讨论艰深的细节和绞人的语法、语义谬误,完全站在入门者角度,用大量的例子说明C++的基本用法。也没有提到auto_ptr——笔者认为学习C++,实在有必要很好的了解STL,尤其象auto_ptr这样有意义且有用(auto_ptr可以被用来防止资源泄漏)的东西更应该心里有数。STL为我们提供了那么多现成的有用的东西,干嘛不去用,干嘛不去学?
第三大部分(716页至957页条款1251至条款1500)介绍了Windows编程(WIN32)的基本知识,内容涉及消息、菜单、对话框、内存管理、进程线程、GDI、位图以及输入输出。显然,要掌握WIN32编程,这些条款是远远不够的。就像笔者在上面提到过的一样,这样一本书是无法给“阳春”入门者看的——学习WIN32编程,似乎更需要Programming Windows这样的书。所以想来想去,笔者觉得这一部分的价值似乎明显不如该书的前两部分——大约只能留给那些想对WIN32编程临时抱一下佛脚、沾一下边的急切者参考查阅了。
这三大部分可以说是三本算不上“足够份量”的小书。然而“三个臭皮匠,顶个诸葛亮”,本书众多(但不全面的)便于查阅的细节还是可以迎合不少读者(就好像我用英文字母拼单词,你从26个字母中随便抓一把,我总还能从你手里挑几个用得上的字母——如果我比较愚昧,26对我来说是个“非常巨大”的数字,那你可就帮了大忙了),毕竟这本价格不菲的书目前已经是2001年7月第四次印刷了(1999年7月第一版),印数达12000册。
对本书的翻译,笔者没什么特殊感觉,毕竟该书技术难度算不上高。其翻译不影响阅读。
随书光盘(居然!?竟然!?)包含了Borland Turbo C++ Lite这个只适用于DOS的编译器——还是Lite(清谈的、轻度的)。另外封底的内容简介有一句“掌握C编程语言,平滑过渡到C++”也让人揪心(到底是谁写的?他/她在向初学者暗示什么?)。
推荐度为2,因为我们既不能将该书作为C或C++的入门第一本书,也无法将该书当成一本系统化的、权威的参考书。真正值得关注的,是其独到的“细节完美主义”特色(?笔者写到这里,觉得似乎“细节完美主义”使用不当,“对诸多细节进行筛选主义”或者“选择性描述主义”似乎更贴切,但“细节完美主义”一词现在流行,保留之J)。另外,特别遗憾(正常?)的是该书没有索引。大家可以想象,像这样一本专门用来给我们查阅的书没有索引,似乎有如诸葛亮分裂成三个臭皮匠——嘿,说正经的,刘备是愿意要三个臭皮匠还是愿意要诸葛亮?
好了,喜欢说‘主义’主义者kingofark闭嘴,再张嘴——喝口茶。
[四]:《C++语言的设计和演化》,[美] Bjarne Stroustrup 著,裘宗燕 译,机械工业出版社 2002年
[推荐度]:5
[推荐理由]:
kingofark自己觉得推荐此书似乎有些多此一举——这样的好书,谁会错过?
Bjarne Stroustrup这个名字就是C++书籍品质的保证(如果你恰好暂时还不认识这位C++设计者、AT&T贝尔实验室大规模程序设计研究部负责人的话,赶紧去他的网站“补补课”:http://www.research.att.com/~bs/homepage.html)。笔者还要对译者裘宗燕表示敬佩和赞赏,其严谨、细心、认真负责的优良作风,大家在《程序设计实践》(机械工业出版社)中有目共睹。
抛开翻译方面的议题不谈,给笔者印象深刻的是译者的译注:
“public/private,一般被译为共有或公用/私有。这两个词描述的是访问控制问题:某种功能是/否提供给外界使用,因此是关于使用权,而不是所有权(所有权非常清楚,根本无须讨论)。据此,本书中将他们一律翻译为‘公用’和‘私用’,这样更符合原意。——译者注”
(书中有“而且是以一种不适当的‘巴罗克’形式……”一句)
“意为:花哨的形式。——译者注”
(书中有“因为(作为人的)读者喜欢<…>”一句)
“reader,在英文中不能说一定是指人(读者),同样可以用于指处理源文件的分析程序等。作者在这里强调是因为人们不喜欢,而不是程序做不出来。这是一种诙谐的说法。——译者注”
(书中有“在这种国际性会议上,我也没有办法使人们在采用拼写specialize还是specialise的问题上达成一致意见”一句)
“作者的意思是在这里牵涉到英国英语与美国英语之争。——译者注”
(书中有“而且,我还持有这样的观点,Cpp必须被摧毁。——老加图(Marcus Porcius Cato)”一段)
“老加图,公元前234-149,古罗马政治家。Cato的一句名言是‘Delenda est Carthage’,意为‘迦太基必须被摧毁’,迦太基是当时北非的一个奴隶制国家,在今天突尼斯境内。老加图自然不关Cpp的任何事情。作者在这里是模仿老加图的这句名言。——译者注”
…… ……
抛开译注在客观上的正误不谈,这细致的译注本身就说明译者在译文时所保持的态度——这不正是对读者负责么?这不正是对译者自己负责么?kingofark个人比较赞同译者关于public/private的看法(虽然笔者认为更应该保留原文术语),而事实上,笔者认为无论读者对译者的看法是否认同(甚至也无论译者的看法是否在客观上足够准确),能够在译书过程中深入思考、说出自己独到见解的译者,首先就是对自己认真负责的。
其实说得苛刻一些(是的,读者有时候是苛刻的),作为译者翻译一本书,本来就应该有如此这般的优秀作风和一丝不苟的态度,但纵观目前国内的技术翻译状况,我们能排出一百单八将吗?好像连“十二黄金圣斗士”都排不满呐!
好的译者,难能可贵——吾佩服之,其书吾按需买之,乐此不疲,受益匪浅。
********************************************
kingofark在本期五评计划开头说过了,这是一本“课外书”,因为:
(摘自该书封底介绍)“本书是C++设计者Bjarne Stroustrup关于C++语言的最主要的著作之一(另一本是《C++程序设计语言》)。在这本书中,作者综合性的论述了C++的历史和发展,C++中各种重要机制的本质意义和设计背景,这些机制的基本用途和使用方法,讨论了C++所适合的应用领域及其未来的发展前景。本书在帮助人们深入理解C++语言方面的作用是不可替代的。它值得每个学习、使用和关注C++语言的专业工作者、科研人员、教师和学生阅读。”
最后想说一句:“该书配有中文索引。”(!)——我想在中国大陆,这句话已经够份量了。
**********************************************
题外话:www.technetcast.com 上面有一些Bjarne Stroustrup及其他C++/OOP/GP大师和专家们(Scott Meyers等)的访谈录象和录音,笔者认为其很值得反复聆听。
[五]:《C++ View》,王 曦/虫 虫 主编,以电子版形式发行(http://cppview.yeah.net)
[推荐度]:5
[推荐理由]:
这是一个在国内C++世界中有板有眼的免费系列电子套餐(PDF格式),目前已经发布六期。餐如其名,其以标准C++、面向对象程序设计(OOP)、泛型程序设计(GP)、设计模式(Design Patterns)为正餐,辅以C++开发环境等C++相关方面的甜点/水果,为C++用户和爱好者提供不定期的纯正C++风味套餐。该系列套餐系由江湖上多位C++/OOP/GP名厨联合众多积极分子和热心高手合力而为,当然还有更多站在他们背后的国内外专家、大师。说该餐“有板有眼”,是因为:其一,原创素材皆为心血之作,独到见解、所思所感、经验教训跃然呈现,绝无滥竽充数、鱼目混珠之类;其二,其翻译素材皆挑选国外经典佳作(得到国外专家、大师的许可和对套餐的肯定),其在用心译者的支持下得以被上佳的呈现给读者;其三,该餐的发行及其规范作风为国人的C++世界带来新鲜纯正的风味,一扫往年“语言被淹没在开发环境中”的窘境;其四,该餐量少、料精,不但不会影响正常的消化,反而还有助消化、上下通畅。
笔者特别喜欢该餐中的“C++批评系列”,其讨论了C++的不足之处,为我们更好的使用(甚至改进)C++提供更充分依据;第一期中篇幅不大的《smart pointer访谈录》则可以帮助我们了解smart pointer的原理和用法;对C++设计者Bjarne Stroustrup、WTL之父Nenad Stefanovic的访谈让我们接近大师的思维;Generic 系列文章又让我们紧跟标准C++发展脚步,了解泛型技术;“模式罗汉拳”打出去可就收不回来——谁被打着,谁就对设计模式了解更多;“鸟鸣涧”提出趣题,挑战老鸟、菜鸟……
这是一个有风味的套餐。是的,套餐还太单薄;不错,风味还不够齐全;好吧,封面确实不那么好看。但是笔者品到一种有活力的风味。
[六]:杂谈《C++ Primer》简体中文版
喜闻Stanley Lippman/Josee Lajoie的C++经典巨著《C++ Primer》之简体中文版终于出版。虽然笔者已经买过侯捷先生译的繁体译本,但对此还是免不了在大脑中形成亢奋——国外C++/OOP/GP经典作品之简体版在中国大陆迟来的出版总是值得关注的。笔者还没有具体看过该书,只看过出版前夕开放出来的几个章节,总体感觉很好,不过还是觉得过多的术语被译成了中文(细心的译者还常常费心在中译词语后加括其原文,何不干脆有选择性的多保留一些,译者也省麻烦)——在国内大力推广、提倡使用原版教材教学的今天,我们是不是可以尽量多接受一些“原版正宗术语”呢?
有两点让笔者对此简体版比较有信心:一,该书由潘爱民先生翻译(潘爱民先生不用笔者介绍了吧!?《COM原理与应用》的作者;《Visual C++技术内幕 第四版》的译者之一);二,该书配有索引。……忍不住想买来一睹风采了。