李建忠:現(xiàn)代C++的文藝復(fù)興
編者按:本文是全球 C++ 及系統(tǒng)軟件技術(shù)大會聯(lián)合主席李建忠老師為C++之父最新出版的《現(xiàn)代C++白皮書》中文版撰寫的序言。本書公益發(fā)行,可關(guān)注文末免費領(lǐng)取。

C++ 作為一門博大精深的語言,其發(fā)展演化歷程也堪稱波瀾壯闊。由于教育的原因,很多人對 C++ 還停留在 C++98 之前的版本。殊不知 C++ 在經(jīng)歷從 2006 年之后至今的 15 年“激流勇進式的發(fā)展”,在很多人眼里已經(jīng)近乎變?yōu)橐粋€全新的語言。這 15 年間,國際 C++ 標(biāo)準(zhǔn)委員會發(fā)布的 4 個版本:C++11/14/17/20 也被統(tǒng)稱為“現(xiàn)代 C++”。因為這一時期對 C++ 發(fā)展的里程碑作用,我將其稱為“現(xiàn)代 C++ 的文藝復(fù)興”。
本書來自于 C++ 之父 Bjarne Stroustrup 為 ACM 國際計算機協(xié)會的編程語言歷史分會(HOPL)2021 年會撰寫的論文。我是在 2020 年全球 C++ 及系統(tǒng)軟件技術(shù)大會 (Cpp-Summit)前和 Bjarne 溝通大會主題演講時,聽他幾次提及本文,捧讀后遂一發(fā)不可收拾。我當(dāng)時即判斷這個長篇論文顯然將是現(xiàn)代 C++ 發(fā)展歷史上無可替代的、最重要的文獻。鑒于其重要性,我迫不及待地想將其引入中國 C++ 社區(qū), 我將這一愿望表達給了 Bjarne。Bjarne 非??犊?、也非常欣喜地授權(quán)我來組織本書的中文翻譯工作,并由全球 C++ 及系統(tǒng)軟件技術(shù)大會以公益的方式在中國 C++ 社區(qū)中發(fā)行。
本書對現(xiàn)代 C++ 從 2006 年到 2020 年間的發(fā)展做了百科全書式的回顧。它并不是典型意義上的教科書,雖然它鞭辟入里地解釋了現(xiàn)代 C++ 語言幾乎所有的重要特性和功能。更難能可貴的是 Bjarne 花了很多筆墨來交代很多重要特性和功能的來龍去脈,它們的緣起、演化過程中的各種提案、最后的決策考量等——這些看后都讓人大呼過癮,有“知其然、知其所以然”之痛快。
在所有編程語言里,C++ 最為獨特、同時也爭議極大。一方面,作為一門強大而古老的編程語言,C++ 是當(dāng)今人類信息基礎(chǔ)設(shè)施的主要構(gòu)建者,從航空航天到生物信息,從電信設(shè)施到微電子,從互聯(lián)網(wǎng)基礎(chǔ)設(shè)施到人工智能,從汽車地鐵到萬物互聯(lián),很難想象離開 C++?編寫的軟件這些領(lǐng)域會怎樣?在全球 IT 科技巨頭中, Google、微軟、騰訊等,C++ 也都是當(dāng)之無愧的首要編程語言。但另一方面,每過一段時間都會有新語言出來號稱挑戰(zhàn) C++,引發(fā)部分人擔(dān)心 C++ 的地位會不會被新語言所威脅?特別在對現(xiàn)代 C++ 發(fā)展不了解的人眼里,甚至由此產(chǎn)生對 C++ 莫名的危機感。這個問題也經(jīng)常在 C++ 技術(shù)大會上被問起。
Bjarne 對這個問題在書中有著很清晰的回答:C++ 在其近 40 年的發(fā)展中取得成功的根本原因是,它填補了編程領(lǐng)域一個重要的“生態(tài)位”:需要有效使用硬件和管理高復(fù)雜性的應(yīng)用程序。C++ 的核心精神“直接映射硬件”和“零開銷抽象”正是對這一“生態(tài)位”恰如其分的支撐。換言之,如果不那么在乎性能開銷,那么 C++ 并不是最好的語言選擇(Java、Go、Python 等正是填補了這些領(lǐng)域);或者軟件規(guī)模不大、無需很多抽象手段來管理軟件的復(fù)雜度,那么 C 語言就足夠。但如果性能是軟件的關(guān)鍵指標(biāo),同時又有越來越大的復(fù)雜度,那么 C++ 幾乎是獨一無二的選擇。我們看到 C++ 這些年來的發(fā)展,都是緊扣 40 年前 Bjarne 為 C++ 設(shè)定的“生態(tài)位”與“核心精神”而開展的。只有深刻理解這一點,才能從根本上抓住 C++ 的發(fā)展脈絡(luò)。
全書展示了 Bjarne 帶領(lǐng) C++ 標(biāo)準(zhǔn)委員會對現(xiàn)代 C++ 發(fā)展冷靜、睿智、而又執(zhí)著的判斷和決策。比如在面向?qū)ο蟠笮衅涞赖哪甏?,Bjarne 就冷靜地指出“一切皆對象”是一種錯誤的偏執(zhí)。面向?qū)ο蟛皇?C++ 的所有,而僅僅是其支持的多種編程范式(面向過程、面向?qū)ο?、泛型編程、函?shù)式編程)中的一種。在很多場合,其他的編程范式要比面向?qū)ο蟾线m。再比如 Bjarne 早在 1994 年就提出需要為泛型編程提供規(guī)范化接口這一重要設(shè)施:即后來被稱為概念(concept)的語言機制。但因為各種原因,概念自 2003 年提出后,遇到各種曲折的協(xié)商、爭論、實現(xiàn)障礙等諸多羈絆,最終在 Bjarne 嘔心瀝血的推動下,才正式納入 C++20 的正式標(biāo)準(zhǔn)。
本書另外一個難能可貴的地方是 Bjarne 對于 C++ 語言發(fā)展過程中一些缺失之處也有非常深刻的反思。比如對于標(biāo)準(zhǔn)委員會過于關(guān)注語言和庫的設(shè)計,而忽略“動態(tài)鏈接、構(gòu)建系統(tǒng)和靜態(tài)分析等工具設(shè)施”,Bjarne 也直言是一大錯誤。再比如,對于很多專家的各種奇思妙想,Bjarne 甚至在 2018 年寫了一篇文章《記住瓦薩號!》來提醒標(biāo)準(zhǔn)委員會,追求大而全的新奇功能,而忽略穩(wěn)定性對 C++ 是非常危險的,后來為此領(lǐng)導(dǎo)標(biāo)準(zhǔn)委員會“方向組”提出《C++ 程序員的“權(quán)利法案”》。Bjarne 還談到 2006 年是 C++ 發(fā)展的最低谷,那時候本來打算推出的 C++0x 標(biāo)準(zhǔn)由于委員會的決策機制和實現(xiàn)問題而變得遙遙無期。另一方面單核處理器的性能停止提高(Herb Sutter 有著名的文章:“The Free Lunch Is Over”),這種環(huán)境對C++ 語言的期待其實很高,但 C++ 那時候的發(fā)展緩慢,將很多本來是 C++ 的機會拱手讓位給了很多其他商業(yè)語言。
很多人對于主導(dǎo) C++ 語言的幕后力量其實不甚了解,Bjarne 在本書中也花費筆墨解釋了國際 C++ 標(biāo)準(zhǔn)委員會的機制。這方面,我和 Bjarne 本人也有過幾次交流。如果盤點很多編程語言背后的主導(dǎo)力量,大致分以下幾類:第一類是公司主導(dǎo)的語言,例如 Go、Swift、C# 等。Bjarne 曾經(jīng)談過在 C++ 發(fā)展的歷史上,有好幾家巨頭希望說服他加入并將 C++ 納入公司范疇,但 Bjarne 都清醒地婉拒了。我問為什么?Bjarne 談到這類語言由于有商業(yè)力量把持,有大筆資金投入,所以在一段時間發(fā)展看起來非常快,配套支持也非常好。但由于被公司把持,只能為公司的平臺戰(zhàn)略服務(wù),一旦公司平臺戰(zhàn)略轉(zhuǎn)向,那么這類語言也會快速衰落?;赝幊陶Z言的發(fā)展歷史,不得不佩服 Bjarne 在這個問題上的睿智和長遠眼光。第二類是個人英雄主義+社區(qū)主導(dǎo)的語言,比如 Python、PHP 等,這類語言在社區(qū)上有非常旺盛的生命力,但 Bjarne 對這種野蠻生長的方式也有著天然的警覺,從長遠來看,他擔(dān)心這種“一盤散沙”的方式會讓一個語言錯失方向和一些重大功能。Bjarne 早在 1989 年就為 C++ 語言選擇了第三種方式,即“基于共識建立的國際標(biāo)準(zhǔn)委員會”,這種機制使得要將一個特性納入標(biāo)準(zhǔn),首先要說服絕大多數(shù)的人同意。“共識流程”固然使得 C++ 標(biāo)委會的決策速度緩慢,但它帶來的是 C++ 語言惠及所有人的、長期的繁榮和穩(wěn)定。我個人認為,這種決策機制,也是使得 C++ 在所有編程語言中顯得非常獨特的一個幕后原因。
最后我要特別談?wù)劚緯淖髡?,廣受尊敬的 C++ 之父 Bjarne Stroustrup。我和Bjarne 相識于 2005 年,那是我們第一次邀請他來上海舉辦首屆 C++ 技術(shù)大會并發(fā)表主旨演講。在相識相交的 16 年間,Bjarne 對待技術(shù)問題時的睿智和犀利、與人相處時的平易近人,都給我留下極其深刻的印象。如果對比其他編程語言的發(fā)明者,你會發(fā)現(xiàn) Bjarne 也是一個獨特的存在。

1979 年,在貝爾實驗室發(fā)明 C++ 時, Bjarne 當(dāng)時年僅 29 歲,正可謂風(fēng)華正茂。后來當(dāng)各路編程語言天才被各大公司重金招至麾下,Bjarne 選擇放棄各種公司誘惑,力排眾議將 C++ 納入 ISO 國際標(biāo)準(zhǔn),成立標(biāo)準(zhǔn)委員會,為 C++ 的百年發(fā)展大計殫精竭慮。在 C++ 語言發(fā)展的每一個關(guān)鍵節(jié)點,從 C++98、C++11、C++14、C++17,一直到今天的 C++20,Bjarne 既親力親為、勇于開拓,也廣開言路、從諫如流,在一些重大問題上發(fā)揮他無與倫比的影響力和智慧。Bjarne 本人對 C++ 在中國的發(fā)展也非常熱心,接受我的邀請長期擔(dān)任全球 C++ 及系統(tǒng)軟件技術(shù)大會的聯(lián)合主席,不辭辛勞地為中國 C++ 社區(qū)播撒他的智慧,關(guān)心現(xiàn)代 C++ 在中國的教育,其情殷殷,其心切切。他對本書中文版的發(fā)布也非常關(guān)心。
本書中文版的發(fā)布也要感謝由吳詠煒、楊文波、張云潮等組成的翻譯團隊(譯序中一一列出了他們的名字),他們都是來自中國 C++ 社區(qū)的熱心貢獻者。當(dāng)然,最要感謝的還是作者本人Bjarne Stroustrup,他不僅是C++的發(fā)明者,也是現(xiàn)代C++ 文藝復(fù)興的締造者。希望本書的智慧能夠引領(lǐng)我們一起前進!?
李建忠?
全球 C++ 及系統(tǒng)軟件技術(shù)大會聯(lián)合主席?
2021 年 10 月 于上海浦東

掃描下方二維碼,免費領(lǐng)取《現(xiàn)代C++白皮書》!
