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

 

[聲明]:本文由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<Programming>系列文章又讓我們緊跟標準C++發展腳步,瞭解泛型技術;“模式羅漢拳”打出去可就收不回來——誰被打着,誰就對設計模式瞭解更多;“鳥鳴澗”提出趣題,挑戰老鳥、菜鳥……

這是一個有風味的套餐。是的,套餐還太單薄;不錯,風味還不夠齊全;好吧,封面確實不那麼好看。但是筆者品到一種有活力的風味。

 

[六]:雜談《C++ Primer》簡體中文版

喜聞Stanley Lippman/Josee Lajoie的C++經典鉅著《C++ Primer》之簡體中文版終於出版。雖然筆者已經買過侯捷先生譯的繁體譯本,但對此還是免不了在大腦中形成亢奮——國外C++/OOP/GP經典作品之簡體版在中國大陸遲來的出版總是值得關注的。筆者還沒有具體看過該書,只看過出版前夕開放出來的幾個章節,總體感覺很好,不過還是覺得過多的術語被譯成了中文(細心的譯者還常常費心在中譯詞語後加括其原文,何不乾脆有選擇性的多保留一些,譯者也省麻煩)——在國內大力推廣、提倡使用原版教材教學的今天,我們是不是可以儘量多接受一些“原版正宗術語”呢?

有兩點讓筆者對此簡體版比較有信心:一,該書由潘愛民先生翻譯(潘愛民先生不用筆者介紹了吧!?《COM原理與應用》的作者;《Visual C++技術內幕 第四版》的譯者之一);二,該書配有索引。……忍不住想買來一睹風采了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章