C++是一門廣泛用于工業(yè)軟件研發(fā)的大型語言。它自身的復(fù)雜性和解決現(xiàn)實(shí)問題的能力,使其極具學(xué)術(shù)研究價(jià)值和工業(yè)價(jià)值。和C語言一樣,C++已經(jīng)在許多重要的領(lǐng)域大獲成功。
然而,一個不可否認(rèn)的現(xiàn)實(shí)是,在低階程序設(shè)計(jì)領(lǐng)域,C++擠壓著C同時(shí)也在承受著C的強(qiáng)烈反彈,而在高階程序設(shè)計(jì)領(lǐng)域,Java和C#正在不斷蠶食著C++的地盤。也許C++與C合為一體永遠(yuǎn)都是一個夢想,也許Java和C#的狂潮終將迫使C++回歸本位 — 回到它有著根本性優(yōu)勢的開發(fā)領(lǐng)域:低級系統(tǒng)程序設(shè)計(jì)、高級大規(guī)模高性能應(yīng)用設(shè)計(jì)、嵌入式程序設(shè)計(jì)以及數(shù)值科學(xué)計(jì)算等。果真如此,我認(rèn)為這未嘗不是一件好事。
C++吸引如此之多的智力投入,以至于這個領(lǐng)域的優(yōu)秀作品,包括重量級的軟件產(chǎn)品、程序庫以及書籍等,數(shù)不勝數(shù)。文題“C++程序設(shè)計(jì)之四書五經(jīng)”一個不太嚴(yán)格的含義是:C++程序設(shè)計(jì)之四書 ⅹ 五經(jīng)。是的,在本文(及其下篇)中,我將分門別類推薦20多本C++好書,你可以根據(jù)自己的需要選讀。
TCPL和D&E
TCPL和D&E分別是《The C++ Programming Language》和《The Design and Evolution of C++》的簡稱,均出自Bjarne Stroustrup之手。我將它們單列出來,首先是因?yàn)锽jarne是C++語言的創(chuàng)建者,然后是因?yàn)楸取笆紫取蹦莻€原因更重要的原因:這兩本書是C++領(lǐng)域毋庸置疑的杰作。說它們是C++語言圣經(jīng),并不為過。
Bjarne Stroustrup, The C++ Programming Language (Special 3rd Edition)
《C++程序設(shè)計(jì)語言(特別版)》,機(jī)械工業(yè)出版社
《C++程序設(shè)計(jì)語言(特別版)(英文影印版)》,高等教育出版社
迄今為止,TCPL是除了C++標(biāo)準(zhǔn)文獻(xiàn)之外最權(quán)威的C++參考手冊。和大多數(shù)人的看法不大一樣,我認(rèn)為Bjarne的文字語言并不遜色于他所創(chuàng)建的程序語言,至少我喜歡這種學(xué)院氣息濃厚的作品。本書對C++語言的描述輪廓鮮明、直截了當(dāng)。它從C++語言創(chuàng)建者的角度來觀察C++,這是任何別的作者和書籍做不到的 — 沒有任何人比Bjarne自己更清楚該怎么來使用C++。
這是一本嚴(yán)肅的著作,以中、高級C++開發(fā)人員為目標(biāo)讀者。如果你是一名有經(jīng)驗(yàn)的C++程序員,需要了解更加本質(zhì)的C++知識,本書正是為你而寫。它不是那種讓你看了會不斷竊喜的小書,需要用心體會,反復(fù)咀嚼。在閱讀過程中,請?zhí)貏e留心Bjarne先生強(qiáng)調(diào)了什么,又對什么一語帶過。我個人比較喜歡這本書的第四部分“使用C++做設(shè)計(jì)”,這樣的內(nèi)容在類似的程序設(shè)計(jì)語言書籍中很難看到 — 我甚至認(rèn)為Bjarne應(yīng)該將這部分獨(dú)立出來單獨(dú)寫一本書。
Bjarne Stroustrup, The Design and Evolution of C++
《C++語言的設(shè)計(jì)和演化》,機(jī)械工業(yè)出版社
《C++語言的設(shè)計(jì)和演化(英文版)》,機(jī)械工業(yè)出版社
D&E是一本關(guān)于C++語言設(shè)計(jì)原理、設(shè)計(jì)決策和設(shè)計(jì)哲學(xué)的專著。它清晰地回答了C++為什么會成為今天這個樣子而沒有變成另外一種語言。作為C++語言的創(chuàng)建者,Bjarne淋漓盡致地展示了他獨(dú)到而深刻的見解。除了廣受贊譽(yù)的語言特性外,Bjarne沒有回避那些引起爭議的甚至被拒絕的C++特性,他一一給出了邏輯嚴(yán)密、令人信服的解釋。內(nèi)容涵蓋C++的史前時(shí)代、帶類的C、C++的設(shè)計(jì)規(guī)則、標(biāo)準(zhǔn)化、庫、內(nèi)存管理、多重繼承、模板等,對包括異常機(jī)制、運(yùn)行時(shí)類型信息和名字空間在內(nèi)的重要的新特性都分別進(jìn)行了深入探討。每一名C++程序員都應(yīng)該可以從Bjarne的闡釋中加深對手中這門語言的認(rèn)識。
需要再次提醒的是,這兩本書知識濃縮,信息量極大,請不要錯過Bjarne每一句看似漫不經(jīng)意的話。
入門教程
學(xué)習(xí)任何一門語言都需要一個從入門到精通、從新手到高手循序漸進(jìn)的過程。不過,對于一個所謂的新手而言,究竟是一個完完全全的新手,還是一個熟悉某種別的語言的“新手”,甚至是在某種語言程序設(shè)計(jì)領(lǐng)域已經(jīng)頗有建樹的高手,很難一概而論?不同的C++新手需要不同的入門書籍。
Andrew Koenig, Barbara E. Moo, Accelerated C++: Practical Programming by Example
《Accelerated C++中文版》,中國電力出版社
和市面上大多數(shù)C++教程不同,本書不是從“C++中的C”開始講解,而是始于地道的C++特性。從一開始就使用標(biāo)準(zhǔn)庫來寫程序,隨著講述的逐漸深入,又一一解釋這些標(biāo)準(zhǔn)庫組件所依賴的基礎(chǔ)概念。另外,和其他C++教材不同的是,這本書以實(shí)例拉動語言和標(biāo)準(zhǔn)庫的講解,對后兩者的講解是為了給實(shí)例程序提供支持,而不是像絕大多數(shù)C++教材那樣,例子只是用作演示語言特性和標(biāo)準(zhǔn)庫用法的輔助工具。
作者在C++領(lǐng)域的編程實(shí)踐、教育培訓(xùn)以及技術(shù)寫作方面都是世界一流水準(zhǔn)。我喜歡這種大量使用標(biāo)準(zhǔn)庫和C++語言原生特性的清新的寫作風(fēng)格。在這本教材面前,幾乎迄今為止的所有C++教材都黯然失色或顯得過時(shí)。盡管這本教材也許對于國內(nèi)的高校教育來說有些前衛(wèi),不過我仍然極力向我的同行們推薦。順帶一提,在Bjarne和我最近的一封通信里,他這樣評價(jià)本書:對于有經(jīng)驗(yàn)的程序員學(xué)習(xí)C++而言,這本書可能是世界上最好的一本。
Stanley B.Lippman, Josee Lajoie, C++ Primer (3rd Edition)
《C++ Primer (3RD)中文版》,中國電力出版社
這本書的名字多少有點(diǎn)讓人誤解。盡管作者聲稱這本書是為C++新手而寫,但無論是它的厚度還是講解的深度都暴露了似乎并非如此。也許說它是一本“從入門到精通”的C++教程會更合適一些。我個人認(rèn)為它并不適合完全不懂C++的初學(xué)者 — 在閱讀這本書之前,你至少應(yīng)該先有那么一點(diǎn)C或C++的背景知識,或者至少要具有一些其他語言的編程經(jīng)驗(yàn)。
盡管這本書省略了一些高級C++特性的討論,但仍然可以稱得上是迄今為止最全面的C++學(xué)習(xí)教程。事實(shí)上,如果一名C++初學(xué)者能夠扎扎實(shí)實(shí)地讀完本書并對照《C++ Primer Answer Book》完成全部習(xí)題的話,他的水平肯定可以進(jìn)入職業(yè)C++程序員的行列。我個人認(rèn)為,即使你已經(jīng)擁有了TCPL,這本書依然有擁有的價(jià)值,因?yàn)樵谠S多方面它比TCPL來得更詳細(xì)、更易懂。
Stanley B. Lippman, Essential C++
《Essential C++中文版》,華中科技大學(xué)出版社
《Essential C++(影印版)》,中國電力出版社
可以不太嚴(yán)格地認(rèn)為這本書是《C++ Primer》的精簡版。本書一一講述了C++中最具代表性的主題,包括過程式編程、泛型編程、基于對象編程、面向?qū)ο缶幊獭⒛0寰幊桃约爱惓L幚淼取tanley將門檻調(diào)低到“具有其他語言程序設(shè)計(jì)經(jīng)驗(yàn)”的C++新手所能接受的最基本的層次,使他們能夠迅速開始使用C++編程而又免于閱讀《C++ Primer》那樣的大部頭。它以實(shí)例引導(dǎo)學(xué)習(xí),力圖使讀者在最短的時(shí)間內(nèi)把握C++的精粹。
也許換一個人來概述C++編程范型(paradigm)的方方面面需要好幾百頁才能說清楚,但這本小書不可思議地做到了這一點(diǎn)。我個人非常喜歡這種滿是技術(shù)、簡明扼要并且“有話好好說”的書。這本書同樣具有一個明顯的風(fēng)格:所有程序例子全部采用標(biāo)準(zhǔn)庫組件,讓人耳目一新。
以上三本書都不是為了完完全全的編程新手而寫。完全的C++編程新手可以閱讀Francis Glassborow的新書(尚未出版):《A Beginners Introduction to Computer Programming : You Can Do It!》。這也是Bjarne的推薦。Francis Glassborow是ACCU主席,多年來他對幾乎每一本C++經(jīng)典名著評頭論足,他自己的這一本自然會引起C++社群的極大興趣。
高效、健壯編程
兩年前我在負(fù)責(zé)一個省級電力調(diào)度系統(tǒng)項(xiàng)目時(shí)編寫了一個網(wǎng)關(guān)程序,它從SCADA系統(tǒng)獲取電力實(shí)時(shí)信息。通訊接口采用了不常用的數(shù)據(jù)庫直連方式(這個網(wǎng)關(guān)程序一端連接SQL Server 6.5,另一端連接Oralce 8.1.6)。由于實(shí)時(shí)測點(diǎn)近萬,每次將全部取樣更新或插入一遍顯然是低效的。我在網(wǎng)關(guān)程序里建了一個內(nèi)存庫,獲取到的數(shù)據(jù)首先在其中進(jìn)行比較,然后決定是否更新物理數(shù)據(jù)庫(同時(shí)還做了別的更復(fù)雜的事情……),從而在效率和資源占用兩方面達(dá)到了預(yù)期效果。
這個程序一直運(yùn)行得很好,但在離開現(xiàn)場之后的某一天,系統(tǒng)管理員打來電話,說大概因?yàn)榫W(wǎng)絡(luò)故障等原因,有時(shí)這個網(wǎng)關(guān)程序會崩潰掉 — 它自己崩掉也就罷了,問題是它還會把Windows 2000 Advanced Server搞成“藍(lán)屏”!坦白地說,我還從來沒看過哪個非蓄意的程序有這個“能耐”。由于當(dāng)時(shí)正忙于另外一個大項(xiàng)目,無法去現(xiàn)場調(diào)試,最后只有憑經(jīng)驗(yàn)對內(nèi)存庫代碼小心翼翼地封裝以異常處理代碼(同時(shí)也做了一些別的修改……)。這樣,雖然沒有徹底解決問題,但程序終究不再死得那么難看了。
在這兒講這么一段花絮有什么意思呢(當(dāng)初為那個可怕的bug朝思暮想時(shí)我可不認(rèn)為這是一個“花絮”)?我想說的是,對于任何軟件而言,離開強(qiáng)健,效率也就無從談起。而對于C++程序員來說,也許編寫一個高效的程序并不難,但要編寫一個需要7 ⅹ 24小時(shí)持續(xù)運(yùn)行的服務(wù)端軟件就不是那么容易了,需要考慮許多因素,有時(shí)這些因素甚至遠(yuǎn)遠(yuǎn)超出C++語言和開發(fā)工具的本身。作為一名開發(fā)實(shí)際項(xiàng)目軟件的程序員,并非非得自己碰釘子才能積累經(jīng)驗(yàn),只要我們足夠虛心,別人的經(jīng)驗(yàn)往往都是我們很好的借鑒。鑒于此,我推薦以下幾本書供你選讀,它們可以讓你從強(qiáng)健和效率兩方面受益(當(dāng)然了,它們涵蓋的內(nèi)容遠(yuǎn)不限于異常處理J)。
Scott Meyers, Effective C++: 50 Specific Ways to Improve Your Programs and Design (2nd Edition)
Scott Meyers, More Effective C++: 35 New Ways to Improve Your Programs and Designs
《Effective C++中文版》,華中科技大學(xué)出版社
《More Effective C++中文版》,中國電力出版社
《Effective C++(影印版)》,中國電力出版社
如果說《Effective C++》主要討論C++中一些相對基礎(chǔ)的概念和技巧的話,那么《More Effective C++》則著重探討了包括異常處理在內(nèi)的一系列高級技術(shù)。與前者相比,后者具有兩大主要區(qū)別:其一,它包含很多時(shí)新的標(biāo)準(zhǔn)C++的內(nèi)容;第二,它討論的主題傾向于“戰(zhàn)略化”而非“戰(zhàn)術(shù)化”,并且討論得更深入、更徹底。尤其是對虛析構(gòu)函數(shù)、智能指針、引用計(jì)數(shù)以及代理類(proxy classe)等技術(shù)和模式論述的深入程度,讓人很難想象是出現(xiàn)于這樣的一本小書之中。
游刃有余的技術(shù),高超的寫作技巧,Scott無疑是世界上最優(yōu)秀的C++技術(shù)作家之一。在簡潔、清晰、易讀等方面,這兩本書都卓爾不群。總之,Scott提供的這85個可以改善編程技術(shù)和設(shè)計(jì)思維的方法,都是中、高級C++程序員必備的技能。我強(qiáng)烈推薦這兩本書(實(shí)際上還有一本,稍后就會看到)。
Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions
Herb Sutter, More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions
《Exceptional C++中文版》,中國電力出版社
《More Exceptional C++中文版》,華中科技大學(xué)出版社
你自認(rèn)為是一名C++語言專家嗎?讀一讀ISO C++標(biāo)準(zhǔn)委員會秘書長的這兩本書再回答。在這兩本書中,Herb采用了“問答”的方式指導(dǎo)你學(xué)習(xí)C++語言特性。對于每一個專題,Herb首先合理地設(shè)想出你的疑問和困惑,接著又猜測出你十有八九是錯誤的解答,然后給你以指點(diǎn)并提出最佳解決方案,最后還歸納出解決類似問題的普適性原則。
這兩本書是典型的深究C++語言細(xì)節(jié)的著作,很薄,但內(nèi)容密集,遠(yuǎn)遠(yuǎn)超過Scott的那兩本書,讀起來很費(fèi)腦筋 — 我個人認(rèn)為它們要比Scott的書難懂得多。若要研習(xí)這薄薄的兩本書所包含的知識,至少需要花費(fèi)數(shù)月的時(shí)間!(在Scott的薦序中,他坦陳不止一次陷入GotW問題的陷阱,你應(yīng)該知道這意味著什么)對于語言細(xì)節(jié)的深究有什么好處呢?盡管在大多數(shù)情況下,我們不必關(guān)心C++代碼幕后的動作,然而當(dāng)我們不得不關(guān)心時(shí),這兩本書可以為我們提供很好的線索,因?yàn)樗鼈兘沂玖薈++語言中微妙而又至關(guān)重要的東西。
Stephen C. Dewhurst, C++ Gotchas: Avoiding Common Problems in Coding and Design
《C++程序設(shè)計(jì)陷阱》,中國青年出版社
Stephen的理論素養(yǎng)和實(shí)踐經(jīng)驗(yàn)注定這是一本值得一讀的好書。Stephen曾經(jīng)是貝爾實(shí)驗(yàn)室中第一批C++使用者。他已經(jīng)使用C++成功解決了包括編譯器、證券交易、電子商務(wù)以及嵌入式系統(tǒng)等領(lǐng)域中的問題。本書匯集了作者來自開發(fā)一線的99條編程真知灼見,洞悉它們,你可以避免幾乎所有常見的C++設(shè)計(jì)和編程問題。
我甚至認(rèn)為,對于C++編程菜鳥而言,閱讀這本書會比閱讀Scott和Herb的書更能輕松而立竿見影地獲得更大的提高。我個人很喜歡這本書的寫作風(fēng)格 — Stephen的許多觀點(diǎn)看似極端卻無可辯駁。當(dāng)然了,這種自信(以及冷幽默)來自于作者深厚的技術(shù)素養(yǎng),而非自大的偏執(zhí)。
除了上面推薦的書籍外,Dov Bulka和 David Mayhew合著的《Efficient C++: Performance Programming Techniques》(《提高C++性能的編程技術(shù)》,清華大學(xué)出版社)也值得一看。這本超薄小書聚焦于高性能C++應(yīng)用程序開發(fā)。兩位作者都是IBM軟件專家,都工作于對性能要求極高的系統(tǒng)構(gòu)建領(lǐng)域,本書是他們的經(jīng)驗(yàn)之談。也有人不喜歡這本書,因?yàn)樗瞬簧俚钠v述和C++無關(guān)的東西,我卻恰恰因?yàn)檫@一點(diǎn)而對這本書產(chǎn)生好感,正是這些東西讓我開闊了眼界。
模板和泛型編程
模板和基于模板的泛型編程無疑是當(dāng)今發(fā)展最活躍的C++程序設(shè)計(jì)技術(shù)。模板的第一個革命性的應(yīng)用是STL,它將模板技術(shù)在泛型容器和算法領(lǐng)域的運(yùn)用展現(xiàn)得淋漓盡致,而Boost、Loki等現(xiàn)代程序庫則將模板技術(shù)的潛能不斷發(fā)揮到極致。在模板和泛型編程領(lǐng)域,我推薦以下兩本重量級著作:
David Vandevoorde, Nicolai M. Josuttis, C++ Templates: The Complete Guide
《C++ Templates全覽(繁體版)》,臺灣碁峰資訊股份有限公司
《C++ Templates全覽(簡體版)》,人民郵電出版社
有一種老套的贊美一本書的手法,大致是“沒有看過這本書,你就怎么怎么地”,這里面往往夸張的成分居多。不過,倘若說“沒有看過《C++ Templates: The Complete Guide》,你就不可能精通C++模板編程”,那么這個論斷對于世界上絕大多數(shù)C++程序員來說是成立的。
這本書填補(bǔ)了C++模板書籍領(lǐng)域由來已久的空白。此前,上有《Modern C++ Design》這樣的專注于模板高級編程技術(shù)和泛型模式的著作,下有《The C++ Standard Library》這樣的針對特定模板框架和組件的使用指南。然而,假如對模板機(jī)制缺乏深入的理解,你就很難“上下”自如。鑒于此,我向每一位渴望透徹理解C++模板技術(shù)的朋友推薦這本書。
這本書在內(nèi)地、臺灣各有一個譯本,但出自不同的譯者之手。當(dāng)你看到這篇文章時(shí),兩個譯本應(yīng)該都已經(jīng)上市,對于讀者來說當(dāng)然也就多了一種選擇。侯捷先生個人網(wǎng)站上開放了繁體譯本大部分章節(jié),不妨先睹為快。
Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied
《C++設(shè)計(jì)新思維:泛型編程與設(shè)計(jì)模式之應(yīng)用》,華中科技大學(xué)出版社
《C++設(shè)計(jì)新思維(影印版)》,中國電力出版社
你自認(rèn)為是C++模板編程高手嗎?請看過這本書再回答J 這是一本出自天才之手令人敬畏的杰作。泛型模式,無限延伸你的視野,足以挑戰(zhàn)任何一名C++程序員的思維極限。
這本書共分為兩大部分,第一部分討論了 Loki程序庫采用的基礎(chǔ)技術(shù)以及一些高級語言特性,包括基于策略的類設(shè)計(jì)、模板局部特化、編譯期斷言、Typelist以及小型對象分配技術(shù)等。第二部分則著重介紹了Loki中的重要組件和泛型模式技術(shù),包括泛化仿函數(shù)(Generalization Functor)、單件(Singleton)、智能指針、對象工廠(Object Factory)、抽象工廠(Abstract Factory)、訪問者(Visitor)以及多方法(Multimethods)等。每一種技術(shù)都讓人大開眼界,嘆為觀止。
在C++的學(xué)習(xí)方面,過猶不及往往成了不求甚解的借口。然而,面向?qū)ο蟛⒎荂++的全部,模板和泛型編程亦占半壁江山。對于“嚴(yán)肅”的C++程序員而言,及時(shí)跟進(jìn)這項(xiàng)早經(jīng)例證的成功技術(shù),不失為明智之舉。
結(jié)語
這些著作是如此大名鼎鼎,也許根本不缺我一個推薦。然而,縱然C++程序員隊(duì)伍的發(fā)展壯大速度不像其他更時(shí)髦的語言那樣迅速,新人進(jìn)總是多于舊人出。除了熱忱地歡迎新人,我個人認(rèn)為到了對C++書籍進(jìn)行“盤點(diǎn)”的時(shí)候了,并且希望這樣的“盤點(diǎn)”有益于感興趣的讀者。請保持耐心和寬厚。在下篇中,我將繼續(xù)介紹標(biāo)準(zhǔn)庫、網(wǎng)絡(luò)編程以及其他方面的C++好書。有好書相伴,這個冬天不會冷
?
?
?
posted on 2006-05-31 13:35
黃大仙 閱讀(1350)
評論(0) 編輯 收藏 引用 所屬分類:
c++