天天看點

kingofark的第1個五評計劃 - 五評C++(1)

kingofark的第1個五評計劃 - 五評C++(1) (轉)

[聲明]:本文由kingofark創作。本文中的所有内容僅代表 kingofark個人的觀點,與任何其他個人或團體無關。任何人或團體都可以複制、傳播本文,但需附上完整的本聲明。kingofark對于不同意上述各點或不履行上述各要求的人或團體的言行不負任何責任。特此聲明。

kingofark的第1個“五評計劃”——五評C++(1)

[kingofark的話]:

在這個領域内,恐怕是沒有人不知道C++的了。C++的流行使得出版商長期處于亢奮的狂喜之中——這也就是為什麼我覺得實在有必要推薦幾本C++的書,為大家的擇書助上一臂之力。

[一]:《C++程式設計思想》,Bruce Eckel 著,譯,機械工業出版社

[推薦度]:-1

[推薦理由]:

原則上來說,我還不算是容易浮躁的人,但是當我慕名拿到了這本機械工業的《C++程式設計思想》的時候,我看到了:

“通過強迫在調用之前必須聲明,……”P32

“按位和與按成員const”P138

“7.5 可變的(volatile)”P140 [關鍵字也要翻譯嗎?難道”double a;”應該翻譯成“雙 字母表的第一個字母分号”?]

“因為大多數編譯器使用‘helper’函數而不是設定所有功能性内置。”P180 [helper?内痔?外痔?]

“因為有一個使用單一int參數的構造函數,int自動轉換為number,但這要在正确的條件下。”P229 [這是中文的句式嗎?我真孤陋寡聞。]

“new表達式的反面是delete表達式”P236 [哦,原來表達式還有“反面”。我真孤陋寡聞。]

“是以我們幾乎不會看到在這些類中存在虛函數,它們的重用是以模闆方式而非繼承方式。”P331

“oldmem必須指向零(以配置設定新存儲區)”P334

“是以在用free()釋放存儲區時,getmem()必須将指針向後退由cntr占用的存儲空間數目。”P334

“其中有一些重要的其他類”P340

“2)我們需要向上映射到兩個基類上嗎?(當然,在我們有兩個以上的基類被應用。)”P354

“要終止相距較遠的異常處理器,但是由于異常可能由很多地點産生,是以對于一個大型系統,從異常處跳轉到異常處理器再跳轉傳回,這在概念上是十分困難的。”P363

“利用這種方法,每個配置設定就變成了原子的,像一個對象,并且如果失敗,那麼已配置設定資源的對象也被正确的清除。”P372-373

“但是,在這種情況下,被迫增加的代碼必須是最小限度的。”P377 [代碼是最小限度的?我孤陋寡聞。]

“異常處理系統會關注所有的存儲。”P379

“無論什麼時候用類型映射,都是在打破類型系統”P398

…… …… …… ……

……我終于經不住誘惑浮躁了一回,将書狠狠的置向地面……從那以後,每當我用輸入法輸入“C++程式設計思想”的時候,輸入法程式總是頑固的給出“C++變成死相”幾個文字,給我平添幾分揪心的詭異(但似乎這比“死一家家變成死相”還稍微吉利一些)……聽聞這本書賣得好的消息,我卻很莫名其妙的憶起魯迅先生在《狂人日記》裡的那句“救救孩子”。

[二]:《C++面向對象高效程式設計》,Kayshav Dattatri著,潇湘工作室 譯,人民郵電出版社

[推薦度]:4.9

[推薦理由]:

英文原版書名:《C++ Effective object-Oriented Software Construction》。

這是一本在國内被忽視了的優秀的C++/oop書籍。作者kayshav Dattatri用通俗易懂的語言,以由淺入深的組織方式,将C++語言的OOP方法和運用C++編寫高效代碼的方法娓娓道來。

本書的一大特色就是擅用橫向比較的方法來說明問題。對于一個操作、算法,甚至是語言機制,作者或以不同的C++實作方法來比較其功用,或以不同的語言實作來比較其在效率上的優劣,處處無不展現“高效”二字。比如,光是在講到“參數傳遞模式”一節,作者就給出了

void X::f(T arg),

void X::f(const T object),

void X::f(T& arg),

void X::f(const T& arg),

void X::f(T* argp)

五種方式,對其逐個分析,交叉比較孰優孰劣,并說明各個方式的用途;再比如,在讨論異常模型的時候,作者将EIFFEL中的異常模型與C++中的異常模型進行比較,并且專門用了一個小節的篇幅(第10.5節“EIFFEL和C++異常模型的優缺點”)來讨論這個問題;等等。作者在文中處處考慮性能、效率,卻又不失清晰的組織結構,其雄厚的實力和在領域内積累了多年的經驗流露于字裡行間。

本書的另一大特色,就是作者精心為讀者提煉的要點。在全書的叙述中,一旦講完了一個重要的知識,作者就會用一兩句話總結成一到兩個要點,核心的知識和多年積累的經驗一目了然、清清楚楚。不但如此,在每一章的末尾,作者又再次給出本章内容的所有要點,以便于讀者查閱。

全書在OOP的精神指引下,以“高效”二字當頭,令人信服的闡述了使用C++進行高效程式設計的方法。

在這裡,筆者也不再多說了。就讓我們一起看看Erich Gamma博士(大名鼎鼎的《設計模式》的作者之一)在此書的序言中是怎麼說的吧:

“Kayshav Dattatri在這方面(指在程式性能、效率方面)具有極其豐富的經驗。”

“本書所有的内容都是經驗之談。……Kayshav不僅僅滿足于大體上解釋面向對象的概念以及理論介紹C++語言功能部件;他還講述了繼承、混合類、模闆類和異常這些方面的實踐經驗,探讨了模闆執行個體化、共享庫、線程安全性和許多其他問題。”

“本書從零開始介紹C++和面向對象程式設計。然而,我确信,有經驗的C++程式設計人員将和新手一樣,能夠從本書中得到新的知識。”

最後談談本書的翻譯。本書由潇湘工作室翻譯。筆者認為,在譯作水準參差不齊的書籍市場中,本書的翻譯可算是中等偏上。雖然我們可以從書中發現一些譯意不當的地方,但我們也完全可以感受到譯者們為了譯文的順暢所作的許多努力。另一方面,本書紮實、豐厚的内容也确實反過來使譯者少有敗壞之機。倒是書中存在的一些明顯的印刷、排版方面的錯誤使得本書最終沒能得到5分。這不能不說是一個小小的遺憾。

[三]:《Essential C++中文版》,Stanley B.Lippman 著,侯捷 譯,華中科技大學出版社

[推薦度]:5

[推薦理由]:

光憑作者、譯者的大名,本書就毫無疑問是一本世界級的C++上乘之作。本書作者Stanley B. Lippman,現在微軟工作。他曾是夢工廠電影動畫公司的核心技術小組成員。加入夢工廠之前,Stan 是華德迪士尼電影動畫公司的主要工程師。更早之前他在貝爾實驗室上司過 cfront 3.0, 2.1 的編譯器開發小組。他是 Bjarne Stroustrup 所上司的貝爾實驗室基礎項目中的一員。Stan 是C++ Primer(三個版次)及Inside the C++ Object Model 的作者,這些極為成功的書籍由 Addison-Wesley 出版。他也是C++ Gems 的編輯(此書由 Cambridge University Press 出版)。他的工作應用在多部電影上頭,包括 Hunchback of Notre Dame 和Fantasia 2000;譯者侯捷,是資訊教育工作者,寫譯書籍,主筆專欄,教育訓練業界人員,并于元智大學開課。進入教育領域前,他曾分别擔任工研院機械所和電通所副研究員,分别研發 CAD/CAM 軟體和 windows多媒體系統。侯捷是《深入淺出MFC 》和《多型與虛拟》兩本書的作者,也是C++ Primer 3/e、Essential C++和Inside the C++ Object Model 繁體中文版譯者。他的計算機相關書籍和散文,甚獲好評。

在這裡,我就轉引侯捷先生精彩的譯序來說明問題:

“Stanley B. Lippman 所着的 C++ Primer 雄踞書壇曆久不衰,堪稱 C++ 最佳教本。但是走過 10 個年頭之後,繼 1237 頁的 C++ Primer 第三版,Lippman 又返樸歸真地寫了這本 276 頁的Essential C++。有了滿漢全席,為何還眷顧清粥小菜?完成了偉大的巨着,何必回頭再寫這麽一本輕薄短小的初學者用書呢?

所有知道 Lippman 和 C++ Primer 的人,臉上都浮現相同的問号。

輕薄短小并不是判斷适合初學與否的依據。Lippman 寫過Inside the C++ Object Model,280 頁小開本,崩掉多少C++ 老手的牙齒。本書之是以号稱适合初學者,不在於輕薄短小,在於素材的選擇與組織的安排。

關於 Lippman 重作馮婦的故事,他自己在前言(p.ix)中有詳細的介紹。他的轉折,他的選擇,他的職責,乃至於這本書的綱要群組織,前言中都有詳細的交待。這方面我不必再置一詞。

身為C++ Primer (3/e) 的譯者,以及多本進階書籍的作者,我必須努力說服自己,才能心甘情願地将精力與時間用來重複過去的足迹。然而,如果連 Lippman 都願意為初學者再鋪一條紅地毯,我也願意為初學者停留一下我的腳步。

我是一名資訊教育工作者,寫譯書籍,教育訓練業界人員,主持網站回應讀者與學員,并於大學開課。我真正第一線面對大量學習者。藉此機會我要表達的是,所謂「初學者」實在是個過於籠統的名詞與分類(呃,談得上分類嗎)。一般所謂「初學者」,多半想像是大一或專一新生程度。其實 C++ 語言存在各種「初學者」,有 13 歲的,有 31 歲的(當然也有 41 歲的)。隻要是第一次接觸這個語言,就是這個語言的初學者,他可能才初次接觸電腦,可能浸淫Pascal/C 語言 10 年之久,或可能已有 Smalltalk/Java 三年經驗。有人連電腦基本概念都沒有,有人已經是經驗豐富的軟體工程師。這些人面對 C++,學習速度、教材需求、各人領悟,相同嗎?

大不同矣!

每個人都以自己的方式來诠釋「初學者」這個字眼,并不經意地反映出自己的足迹。初學者有很多很多種,「初學者」一詞卻無法反映他們的真實狀态。

固然,輕薄短小的書籍乍見之下讓所有讀者心情輕松,但如果舍棄太多應該深入的地方不談,也難免令人行止失據,進退兩難。這本小書可以是你的起點,但絕不能夠是你的終站。

做為一本優秀教本,輕薄短小不是重點,素材的選擇與組織的安排,表達的精準與閱讀的順暢,才是重點。

做為一個好的學習者,背景不是重點,重要的是,你是否具備正确的學習态度。起步固然可從輕松獨幕喜劇開始,但如果碰上大部頭巨着就退避三舍逃之 ,面對任何技術隻求速食速成,學語言卻從來不寫程式,那就絕對沒有成為高手乃至專家的一天。

有些人的學習,自練一身銅筋鐵骨,可以在熱帶叢林中披荊斬棘,在莽莽草原中追奔逐北。有些人的學習,既未習慣大部頭書,也未習慣嚴謹格調,更未習慣自修勤學,是溫室裡的一朵花,沒有自立自強的本錢。

章節的安排,篇幅的份量,索引的保留,習題和解答,網上的服務,都使這本小書成為自修妙品,或C++ 專業課程的适當教材。我誠摯希望《Essential C++ 中文版》的完成,幫助更多人從中獲得 C++ 的學習樂趣 - 噢,是的,物件導向程式語言可以帶給你很多樂趣,我不騙你。”

[四]:《The C++ Programming Language SE》,Bjarne Stroupstrup 著,高等教育出版社

[推薦度]:5

[推薦理由]:

其實理由隻有一個就夠了:本書的作者Bjarne Stroupstrup是C++的設計者和實作者。

作者用學究式的文筆,以一個研究者的眼光,系統、嚴謹的描述了C++語言的方方面面。本書與Stanley B.Lippman的《C++ Primer》并稱為C++語言的兩大權威參考書。

因為是影印版,是以也全沒有翻譯帶來的任何形式上的損耗,原汁原味。

我想這就夠了,足夠了。

[五]:《Effective C++中文版》SCOtt Meyers 著,侯捷 譯,華中科技大學出版社

[推薦度]:5

[推薦理由]:

轉載:孟岩《引介:一本絕妙好書》

“您手上這本書,是世界頂級C++大師Scott Meyers成名之作的第二版。其第一版誕生于1991年。在國際上,本書所引起的反響之大,波及整個計算機技術出版領域,餘音至今未絕。幾乎在所有 C++書籍的推薦名單上,本書都會位於前三名。作者高超的技術把握力,獨特的視角 诙諧輕松的寫作風格 獨具匠心的内容組織,都受到極大的推崇和仿效。甚至連本書簡潔明快的命名風格,也有着一種特殊的号召力,我可以輕易列舉出一大堆類似名字,比如 Meyers本人的More Effective C++和Effective STL,Don Box的Effective COM,Stan Lippman主編的Efficient C++系列,Herb Sutter的Exceptional C++等等。要知道,這可不是出版社的有意安排,而且上面這些作者,同樣是各自領域裡的絕頂大師,決非人雲亦雲 欺世盜名之輩。這種奇特的現象,隻能解釋為人們對這本書衷心的贊美和推崇。

然而這樣一本擲地有聲的C++世界名着,不僅遲遲未能出版簡體中文版,而且在國内其聲譽似乎也并不顯赫。可以說在一年之前,甚至很少有C++的學習者聽說過這本書,這實在是一種遺憾。今天,在很多人的辛勤努力之下,這本書終於能夠展現在我們的面前,對於真正的C++程式員來說,這确實是一件值得彈冠相慶的事。

我是一名普通的C++愛好者,因為機緣巧合,有幸叁與了這本書的繁簡轉譯工作,這使我能夠比較早地看到本書的原版和繁體中文版。在這裡我必須表達對本書中文譯者 台灣着名技術作家侯捷先生的敬意和感謝,因為在我看來,這本書的中文版在品質上較其英文版兄長分毫不差,任何人都知道,達到這一點是多麽的困難。侯先生以其深厚的技術功底 卓越的語言能力和嚴謹細緻的治學态度,為我們跨越了語言隔閡所帶來的了解障礙,完整而生動地将原書的内容與精神表達無遺,更令人欽佩的是,中文版的行文風格與原文也達到了高度的統一,可謂神形兼備,實在令人贊歎 是以我非常樂意向大家推薦這本書,相信它會在帶給您帶給你技術享受的同時,也帶給您閱讀的享受。”

我想我也沒辦法再多說什麼了,我無法找到比“完美”更好的詞來形容這本書。這裡大家又一次看到了一個事實:優秀原作+優秀譯者=優秀中文書籍。這勿用我多說,閉嘴。