第二版譯序
『不熟悉C++ 標準庫,任何人都稱不上是高生產力的C++ 程式員。』
這是我對每一位學生說的話。
自C++98 (1998) 至C++11 (2011),這個語言有了相當的變化。而變化尤其劇烈—或者你也可以說攻城略地尤其大者 — 是其日益包山包海的標準庫(Standard Library)。如今,不但昔日閃亮招牌如STL容器、演算法、迭代器…依然熠熠發光,更添加了Tuples, Smart Pointers, Type Traits, Clocks and Timers, Regular Expression, Concurrency…等眾多組件。腳步一個沒跟上,很可能同儕寫出來的程式碼,在你眼中都要逐漸模糊逐漸陌生了。
面對陌生,我們最大的障礙在於心中的怯弱。To be or not to be, that’s the question! 不要像哈姆雷特一樣猶豫不決。面對前程,必須果敢。
愈來愈多的術語,特別是組合式長術語,為翻譯帶來極大困擾。關於術語翻譯,我的態度如下:
*技術書籍(尤其高階技術書籍)之中譯,價值不在於體現全中文化閱讀。直接呈現英文術語很多時候更能營造突出的視覺效果,進而有利閱讀,形成深刻印象。
*儘可能兼顧中英詞性平衡。例如「面對向量和deque兩種容器…」就不如「面對vector和deque兩種容器…」讀來順暢。
* 本書讀者不可能受制於英文單字。我們要學習的是術語代表的技術,而非術語的中文名稱。
*與C++關鍵字重合的術語多半不譯,例如static, template, class…以及延伸出去的member template, function template, class template…等等。
*任何術語第一次出現(或相隔一長段距離後再出現)時多半中英並陳。但由於你可能採取跳躍式閱讀,所謂「第一次出現」或「相隔一長段距離後再次出現」也許對你意義不大。
*STL各資料結構名稱皆不譯,例如array, vector, list, deque, hast table, map, set, stack, queue, tree…。
*STL六大組件的英文術語原欲全部保留,但由於頻繁出現,對版面的中英比例形成視覺威脅,因此採用以下譯名:container容器,algorithm演算法,iterator迭代器,adapter配接器,functor object函式物件,allocator分配器。這些術語有時中文呈現,有時英文呈現,有時中英並陳,取決於當時語境。
*全書按英文版頁次編排,並因此得以保留原書極其詳盡的索引。索引詞條皆不譯 (因為書中相應保留了相當份量的英文術語)。
這是個知識爆炸、資訊量也爆炸的時代。網路上如山似海的資訊:文章、文件、文檔、文獻和繁若天星的論壇、群組…,很多都是免費的(因而似乎特別有吸引力),但我們的精力和時間才是更寶貴的東西。檢閱並且評論過許許多多C++ 標準庫相關讀物後,面對這本結構和細節都臻上乘的優秀教本,我強烈推薦給你。
侯捷
2014/10/20, White Rock
第二版序言
我從未想過本書第一版會賣得如此長久。現在,經過12年的等待,出新版本的時候到了,一個涵蓋最新C++11標準的新版本。
注意,其中的意義比僅僅添加新子庫更多更大。C++已經改變了,其標準庫的幾乎所有典型應用如今看起來都有那麼一點不同。這不是因為語言出現巨大變化,而是許多小改變造成的結果,例如運用rvalue references和move semantics, range-based for loops, auto, 以及新的template特性。因此,本書不但展現原標準庫的補充性質及新成員,書中所有例子也都從新寫過,或至少局部改寫。儘管如此,為了支援那些仍然使用「舊」C++環境的程式員,本書會在遭遇C++ 版本差異時加以描述。
我學習C++11有一段艱難的歷程。大約二年前我開始看C++11但並未追隨標準化的腳步,因此確實遭遇了理解上的麻煩。但是標準委員會的人幫助我描述及表現C++11新特性,一如它們如今呈現的樣貌。
最後,請注意,本書有個困擾:雖然份量上由800頁成長到超過1,100頁,我還是無法完整呈現C++標準庫。標準庫中單單針對C++11就有大約750頁的描述,都是十分精鍊的文字,沒有太多說明。基於這個原因,我必須取捨哪些性質需要描述,並決定以怎樣的細度描述之。再一次,C++社群中的許多人幫助我做出決定。我的企圖集中在一般應用程式員需要的東西。若干本書捨棄的部分被我做成一份補充篇章放在本書官網 www.cppstdlib.com。即便如此,你還是會在C++標準規格書中找到我未曾討論的細節。
教學的藝術,並非體現在「呈現每一面」,而是一種「從砂礪中滔洗黃金」的藝術,從中取得最大價值。但願我是成功的。