作者 | 《新程序員》編輯部出品 | CSDN(ID:CSDNnews)如果說系統(tǒng)軟件是軟件領(lǐng)域的皇冠,那么 C++ 就是皇冠上的珍珠。在四十余載的技術(shù)變遷中,C++不斷拓展其應(yīng)用邊界。近年的編程語言排行榜上,C++一騎絕塵超越 Java,并在今年六月領(lǐng)先 C 語言,居編程語言排行榜第二位。同時(shí),隨著大模型重塑計(jì)算范式和開發(fā)范式,業(yè)界對軟件安全性的重視前所未有,軟件開發(fā)迎來全新的篇章。
在這樣的背景下,12 月 5-6 日的「2024 全球 C++及系統(tǒng)軟件技術(shù)大會」邀請C++之父、美國國家工程院、ACM、IEEE 院士 Bjarne Stroustrup 跨洋連線,發(fā)表主題演講《重新認(rèn)識 C++:跨世紀(jì)的現(xiàn)代演進(jìn)》,并在爐邊談話環(huán)節(jié)同與會者展開了一場精彩的對話。
在這場由 CSDN 高級副總裁李建忠與 Codeplay 技術(shù)副總裁 Michael Wong 主持的一小時(shí)爐邊對話中,Stroustrup 在紐約的家中,展現(xiàn)出了一位技術(shù)領(lǐng)袖的深邃思考,回答了與會者提出的一系列關(guān)鍵問題。這些問題涵蓋了技術(shù)選擇、工程實(shí)踐、人才培養(yǎng)等多個(gè)維度,字里行間流露出他對編程語言、軟件系統(tǒng)的深刻理解,以及對技術(shù)演進(jìn)規(guī)律的獨(dú)到見解。
核心議題
從貝爾實(shí)驗(yàn)室到 AI 時(shí)代的技術(shù)沿革
當(dāng)代軟件開發(fā)中的安全實(shí)踐
編程語言的設(shè)計(jì)哲學(xué)與取舍
人工智能時(shí)代的計(jì)算架構(gòu)變革
回應(yīng)白宮與 Rust 社區(qū)對 C++ 安全性的質(zhì)疑
新語言的興起對社區(qū)生態(tài)的影響
C++ 標(biāo)準(zhǔn)演進(jìn)中的代際更迭
新一代程序員的成長之道
以下為對話實(shí)錄:
第一問:如何看待 C++ 被質(zhì)疑“不夠安全”?Michael Wong:在您的演講中,您詳細(xì)探討了 C++ 的安全規(guī)格配置和指南。與現(xiàn)代強(qiáng)調(diào)安全特性的編程語言(如 Rust)相比,C++ 常被批評“不夠安全”。您如何看待這種觀點(diǎn)?C++ 在維持自身特色的同時(shí),正在采取哪些措施來應(yīng)對這些挑戰(zhàn)?
Bjarne Stroustrup:如果我們采用現(xiàn)代 C++ 的編程方式,嚴(yán)格遵循《C++ 核心指南》(The C++ Core Guidelines),很多安全問題就不會出現(xiàn)。舉個(gè)例子,我已經(jīng)很多年沒有遇到未被捕獲的數(shù)組越界問題了。在教學(xué)實(shí)踐中,盡管我現(xiàn)在較少親自授課,但當(dāng)其他教師使用我的教材時(shí),我都建議使用范圍檢查庫。我們會確保所有操作都有范圍檢查保護(hù),因?yàn)闆]有人愿意看到學(xué)生們遭遇那些完全可以避免的緩沖區(qū)溢出錯(cuò)誤。所以基本原則很簡單:不要固守舊的編程方式,要擁抱現(xiàn)代 C++,它是安全的。
我們的終極目標(biāo)是實(shí)現(xiàn)類型安全和資源安全,現(xiàn)在這個(gè)目標(biāo)已經(jīng)觸手可及。當(dāng)前的主要挑戰(zhàn)在于缺乏完善的施行機(jī)制。雖然我們已經(jīng)有了一些執(zhí)行機(jī)制,但我們希望能做得更好,并將其標(biāo)準(zhǔn)化。這正是我目前的工作重點(diǎn)將配置文件的概念引入語言,并建立初始的配置文件集。一旦這項(xiàng)工作完成,C++ 的安全性將超越大多數(shù)所謂的現(xiàn)代語言。說實(shí)話,那些現(xiàn)代語言也并不像它們宣稱的那樣安全,它們的安全保證往往是不完整的。比如說,它們?nèi)狈Y源安全性。在這些語言中,僅僅通過泄漏文件句柄或線程句柄就可能導(dǎo)致系統(tǒng)崩潰。這顯然不是我們想要的結(jié)果。而且,這些標(biāo)榜安全的語言在處理一些底層任務(wù)時(shí),比如硬件操作、設(shè)備驅(qū)動程序開發(fā)、系統(tǒng)調(diào)用等,往往還是要依賴 C 語言。而 C++ 本來就應(yīng)該能夠處理這些工作,這是它的核心職責(zé)之一。因此,我們不能也不應(yīng)該把這些工作交給其他語言。誠然,這使得提升 C++ 的安全性變得更具挑戰(zhàn)性,但這個(gè)目標(biāo)是可以實(shí)現(xiàn)的。
最關(guān)鍵的問題是時(shí)間。要知道,推動一個(gè)擁有六七百萬開發(fā)者、數(shù)十億行代碼的龐大社區(qū)轉(zhuǎn)型,比創(chuàng)建一個(gè)適用范圍較窄的新語言要困難得多。那些新語言容易在特定領(lǐng)域展示某些安全特性,但 C++ 面臨的挑戰(zhàn)更加綜合。我始終認(rèn)為,安全性是一個(gè)多面的概念。我就列舉過大約十種不同的安全方法,它們在不同場景下、對不同用戶都有其特殊的重要性。我們需要能夠?qū)崿F(xiàn)多種安全概念。如果認(rèn)為內(nèi)存安全就是全部,這種想法過于片面。我們追求的是全面的類型安全和資源安全。
第二問:C++ 真的過于復(fù)雜了嗎?李建忠:C++ 的復(fù)雜性一直是業(yè)界爭論的焦點(diǎn)。在您的演講中,您展示了現(xiàn)代 C++ 如何實(shí)現(xiàn)更高的安全性、更好的簡潔性和更快的性能。但很多人,特別是新手,仍然覺得 C++ 過于復(fù)雜。您如何看待這種觀點(diǎn)?您認(rèn)為應(yīng)該如何提升 C++ 的易用性?
Bjarne Stroustrup:這個(gè)問題值得仔細(xì)思考。首先,我們要認(rèn)識到,很多對 C++ 的批評并不那么客觀公正。比如,有些批評針對的是一些 C 語言風(fēng)格的用法,而這些用法在過去 20 年里就已經(jīng)被優(yōu)秀的 C++ 程序員摒棄了。當(dāng)然,我也承認(rèn) C++ 確實(shí)很復(fù)雜,如果有人試圖掌握它的所有細(xì)節(jié),學(xué)習(xí)過程必然會很困難。我經(jīng)常遇到程序員說“我想了解所有的東西”,但我總是告訴他們,這沒有必要,我自己也不需要知道所有細(xì)節(jié)。這正是為什么我們有 CppReference(cppreference.com) 這樣的參考資料,當(dāng)需要查詢某個(gè)標(biāo)準(zhǔn)函數(shù)的具體參數(shù)時(shí),隨時(shí)可以去查閱
我認(rèn)為更重要的是理解語言的基礎(chǔ)原理,掌握那些能夠幫助我們更好地解決問題、開發(fā)軟件的核心功能。我們應(yīng)該專注于在這些基礎(chǔ)特性和核心庫的框架內(nèi)工作。這也是我們制定《C++ 核心指南》并在此基礎(chǔ)上發(fā)展配置文件的原因,我們希望幫助開發(fā)者專注于 C++ 最安全、最實(shí)用、最易維護(hù)的部分。之前我也提到過,開發(fā)者們一方面要求語言簡單,另一方面又需要更多特性,同時(shí)還想保持兼容性。在這三個(gè)訴求之間找到平衡確實(shí)很有挑戰(zhàn)。
我認(rèn)為解決方案在于:保持語言本身的穩(wěn)定性和兼容性,同時(shí)幫助人們更好地使用現(xiàn)代 C++ 特性,也就是我今天演講中提到的這些內(nèi)容。不過目前 C++ 的開發(fā)工具鏈還有提升空間。這些年來,我一直在呼吁開發(fā)更好的構(gòu)建系統(tǒng)和包管理工具。雖然這個(gè)目標(biāo)還沒有完全實(shí)現(xiàn),但進(jìn)展是明顯的。比如 CMake 就在不斷改進(jìn),其他一些構(gòu)建系統(tǒng)也在變得越來越好。只是這些工具還沒有成為標(biāo)準(zhǔn),我相信在這方面我們還能做得更好。
第三問:C++ 的哪些發(fā)展超出了您的預(yù)期?Michael Wong:回顧 C++ 從“帶類的 C”(C with classes)到今天的發(fā)展歷程,什么最讓您感到意外?現(xiàn)在的一些應(yīng)用場景是否超出了您最初的設(shè)想?
Bjarne Stroustrup:最讓我感到驚訝的是 C++ 真的發(fā)展到了今天這樣的規(guī)模。說實(shí)話,我最初并沒有打算開發(fā)一門通用編程語言。我的初衷很簡單,就是想編寫一些代碼,想要提前十年實(shí)現(xiàn)第一個(gè) Unix 集群。但事情的發(fā)展出乎意料,我的同事們開始使用這門最初叫“帶類的 C”的語言,后來它被命名為 C++。這對我來說是個(gè)巨大的驚喜。要知道,我們沒有做任何宣傳和營銷,C++ 就這樣自然地成長起來了。
如果看增長曲線,會發(fā)現(xiàn)它是指數(shù)級的在最初的 10 到 11 年間,每七個(gè)半月 C++ 的用戶數(shù)量就翻一番。這太令人驚訝了,不過當(dāng)時(shí)我忙于確保一切正常運(yùn)轉(zhuǎn),沒有太多時(shí)間去思考這些現(xiàn)象。
后來另一個(gè)轉(zhuǎn)折點(diǎn)出現(xiàn)在 2000 到 2005 年間,C++ 社區(qū)出現(xiàn)了萎縮。這其實(shí)不難理解,因?yàn)楫?dāng)時(shí)美國政府、微軟、Sun 都在大力推廣其他編程語言。但更有趣的是接下來發(fā)生的事:這個(gè)下行趨勢最終被扭轉(zhuǎn)了。如果看今天的數(shù)據(jù),我們又看到了一個(gè)指數(shù)增長曲線。雖然增長速度不再是每七個(gè)半月翻一番(具體數(shù)字我也沒有相關(guān)數(shù)據(jù)來估計(jì)),但分析表明,這種反彈有其深層原因:開發(fā)者們不太愿意被限制在專有語言中。他們希望能夠在所有平臺上工作,希望同樣的代碼能運(yùn)行在 Windows、Unix、Linux、Android 等各種環(huán)境中。雖然各個(gè)平臺的擁有者都在推廣他們自己的語言,但 C++ 這樣能在各處都表現(xiàn)良好的語言反而成為了理想的解決方案。
與此同時(shí),硬件發(fā)展也遇到了瓶頸。處理器速度不再持續(xù)提升,單線程性能停滯不前,有時(shí)甚至出現(xiàn)下降。在這種情況下,C++ 的優(yōu)勢再次凸顯:優(yōu)秀的 C++ 程序員能夠?qū)崿F(xiàn)比硬件升級更顯著的性能提升,這也是推動 C++ 重新崛起的重要因素。
回過頭來看語言特性,構(gòu)造函數(shù)/析構(gòu)函數(shù)這對配套技術(shù),以及由此衍生的 RAII(資源獲取即初始化),它們的重要性遠(yuǎn)超出了我最初的預(yù)期。這些特性是我在開發(fā)“帶類的 C”的最初一兩周就加入的,當(dāng)時(shí)只是覺得顯然需要它們,因?yàn)槲矣胁僮飨到y(tǒng)開發(fā)的背景。后來我才知道其他語言既沒有多個(gè)構(gòu)造函數(shù),也沒有析構(gòu)函數(shù)這樣的概念。但事實(shí)證明,這成為了 C++ 最有用、最成功的技術(shù)基石,也是解決許多性能問題的關(guān)鍵。
舉個(gè)例子,當(dāng)你使用基于作用域的資源管理時(shí),就自然而然地最小化了資源的持有時(shí)間。這一點(diǎn)極其重要,因?yàn)槿绻Y源(無論是線程、內(nèi)存還是其他)的持有時(shí)間增加一倍,你就需要雙倍的硬件資源來支撐。
第四問:大語言模型將如何影響 C++?李建忠:大語言模型正在給軟件行業(yè)帶來一場技術(shù)革命。您認(rèn)為它會重塑編程語言嗎?對 C++ 會產(chǎn)生怎樣的影響?
Bjarne Stroustrup:我首先要聲明,我并非 AI 大語言模型領(lǐng)域的專家。說到我與 AI 唯一的淵源,可能就是 TensorFlow 這類 AI 工具是用 C++ 開發(fā)的這一點(diǎn)了。從某種意義上說,C++ 構(gòu)成了當(dāng)前 AI 技術(shù)的基礎(chǔ)設(shè)施,這本身倒是一個(gè)意想不到的發(fā)展。我本該更早提到這一點(diǎn)的,但我對 AI 領(lǐng)域的了解確實(shí)有限。
不過我相信,大語言模型確實(shí)能幫助開發(fā)者處理許多重復(fù)性的日常工作。同時(shí),我也認(rèn)為(雖然這只是一種直覺,沒有具體證據(jù)支持),仍然會有大量工作需要人的創(chuàng)造力,特別是在處理那些 AI 模型訓(xùn)練數(shù)據(jù)中未曾出現(xiàn)過的新問題時(shí)。
所以,如果要給開發(fā)者一個(gè)建議:專注于提升自己的編程能力,不要把精力過多投入到那些瑣碎的、人人都在做的事情上。
第五問:過往版本中最自豪和最遺憾的設(shè)計(jì)決策是什么?貝爾實(shí)驗(yàn)室。在劍橋大學(xué)時(shí),我遇到了幾位很好的老師,其中