奧推網

選單
科技

C++:在“替代”中迎來“轉機”的 2022 年!

【CSDN 編者按】告別各種不確定的 2022,我們迎來了嶄新的 2023 年,歲末年初,大家都有寫總結的習慣,回顧與展望。作為知名的 C++ 開發人員,Bartlomiej Filipek 在自己的部落格上對 C++ 2022 進行了非常全面的總結。CSDN 組織譯者進行了編譯。

原文連結:https://www。cppstories。com/2022/cpp-status-2022/

作者 |Bartlomiej Filipek 譯者 | 昕慈 責編 |夢依丹

出品 | CSDN(ID:CSDNnews)

每三年更新一次新功能、新標準的 C++ 在過去幾年的表現著實有點“穩定”和“無聊”,甚至微軟

下面一起來看看 2022 年發生的一些事情。

背景

2022 年,透過諸如 ISO 委員會會議等現場會議可以觀察到,編譯器供應商似乎正忙著完成對 C++ 20 以及一些 C++ 23 元素的支援,ISO 委員會致力於完成 C++ 23 最後的部分以及 C++ 26 的一些特性。

在 2022 年年中左右,一些不確定性因素出現——某些具有影響力的組織宣佈了新的程式語言:Val(由 David Abrahams 領導)、Carbon(由谷歌支援)、CppFront(由 Herb Sutter 領導)。

同時,作為開發者的我們在社群中看到了各種改進和反饋迴圈。例如,Vittorio Romeo 解決了 std::move, std::forward 以及其他一些小程式長期存在的除錯效能問題。驚喜的是,供應商很快就實現了這些建議。

總的來說,我認為 2022 年的主要趨勢如下:

C++23 特性凍結

C++20 被採用

新語言

反饋迴圈以及更好的工具

此外,這一年還發布了 ChatGPT ,雖然 ChatGPT 與 C++ 沒有直接的聯絡,但它可以極大地影響我們編寫程式、學習甚至教學的方式。簡而言之,ChatGPT 證明了它可以成為各種任務的便捷助手。

從時間軸看 C++

為了更好地瞭解背景,讓我們來看看 2022 年發生的主要事件。

C++ 17 的編譯器支援

幾乎所有主流編譯器都支援 C++ 17,只有少數例外,比如缺少 from_chars, to_chars 的浮點指標支援,或者並行演算法的問題。

如果你想學習 C++ 17 的所有特性,可以參考:https://www。phoronix。com/news/GCC-11-Cpp-17-Default

C++ 20 的編譯器支援

截至 2022 年年底,只有 MSVC(VS 2022 17。0)完全支援該標準。即將釋出的 GCC 13。0 擁有最多的特性,而 Clang(16。0)則稍微落後。缺少或存在問題的主要特性是模組、std::format, std::chrono 附加和協程,不過這些問題正在被慢慢解決。

以下是標準中新增的一些比較好的功能:

模組

協同程式

概念以及標準庫中的概念

範圍

運算子<=> 及其在標準庫中的使用,簡化了運算子重寫規則

文字格式-std::format

日曆和時區

jthread, 訊號量、更多原子、障礙和更多併發性的東西

consteval 和constinit

constexpr 演算法,向量,字串,記憶體分配

std::span

……

下面是編譯器對語言特性的註釋:

關於庫的特性:

C++ 23 的編譯器支援

2022 年的新標準是值得關注的,委員會在 2022 年 6 月的 ISO 會議之後宣佈它進入了“功能凍結”階段。

下表是一些語言特性及其在編譯器中的當前支援:

而最令人興奮的事情之一是標準中添加了 P2718R0,這是對 P2012“Fix the range‐based for loop”的改進。

簡而言之,你可以這樣寫:

std::vector

createStrings();for (char c : createStrings()。at(0)) // 自 C++ 20 開始,上面的 for 迴圈語句就存在 Bug,因為我們訪問的臨時物件的生命週期已經結束。而在 C++ 23 中,迴圈表示式中所有臨時物件的生命週期都將被延長,而不僅僅是第一個。

下表是關於庫的一些改進:

ISO C++ 會議

2022 年召開了三次 ISO 會議,包括兩次虛擬會議和一次全體投票會議,分別在 2 月和 6 月舉行。

會議提出,計劃完成 C++ 23 的草案,並修正了一些報告的問題,將於 2023 年春天傳送到出版機構。我們可以期待 C++ 23 在 2023 年秋季左右正式釋出。

三個主要編譯器

想要達成 C++ 標準,編譯器供應商和庫團隊將有很多工作要完成。下面一起來了解三個主要的編譯器:MSVC、GCC 和 Clang。

Visual Studio

MSVC 團隊已經重寫了編譯器基礎結構,可以相對快速地推出新功能,該團隊甚至兩次宣佈支援 C++ 20。

此公告主要針對, 以及 的一些額外更改和 DR 標準進行修復。如果能夠完成,implementation 將再次穩定執行。

GCC

當前穩定版本 GCC 12。2 是 2022 年 8 月發行的 GCC 12 系列,即將釋出的 GCC 13 預覽版可參考:https://gcc。gnu。org/gcc-13/changes。html

效能除錯

讓我們擴充套件一下效能和反饋迴圈相關內容,可以參考 Vitorio Romeo 的這篇文章:https://devblogs。microsoft。com/cppblog/improving-the-state-of-debug-performance-in-c/

簡而言之,多虧了 msvc::intrinsic 屬性,團隊成功地註釋了一些移動類函式,在某些情況下,17。4 中生成的程式碼產生了 226 條指令,而 17。5 只給出了 106 條。

相關的釋出說明了,如今 std::movestd::forward std::move_if_noexcept, 以及 std::forward_like 將不會在生成的程式碼中產生函式呼叫,即使在除錯模式下也是如此,這是為了避免在除錯版本中造成不必要的開銷。因此/permissive-或者其他可以暗示它的標誌(例如/std:C++20或std:C++latest)是很有必要的。

此外,Vittorio 還報告了兩個錯誤:分別在 libstdC++ 和 libC++ 中使用std::move 導致除錯效能惡化。這兩個問題似乎在 GCC 和 Clang 中得到了修復,如今它們已經可以摺疊簡單的指令。

總而言之,在 C++ 的除錯方面仍然有很多工作要做,不過正如我們所看到的,目前社群執行良好,在傾聽了使用者的需求之後,供應商也進行了相應的改進。

C++ 的繼承語言及其安全性

ISO C++ 的發展過程很慢,效率過低,甚至在委員會中也有很多“神聖”的爭論,特別是關於“不破壞 ABI”之類的問題。

在某些情況下,我們能看出標準中存在的一些問題,也知道如何修復它們,但因為無法破壞 ABI,所以除了新增一些俗套的變通方法以外什麼也做不了。一些諸如來自谷歌的團隊對此感到氣餒,轉而建立了一些新的 C++ 方案。

推薦你閱讀 Lucian Radu Teodorescu 所著的《The Year of C++ Successor Languages》。從這篇文章中可以瞭解到,儘管大眾對於 C++ 的批判很多,但它依然在過去的 30 年間始終穩居程式語言的前 4 名。批判者認為,該語言太大、太複雜,有些功能應該被刪除,也存在很多達不到的功能。

恰好是這些批判促使了一些新的程式語言誕生——它們想要替代 C++ 成為系統主導程式語言。2022 年,C++ 主體會議釋出了三種語言,分別是 Val、Carbon 和 CppFront,文章中分別介紹了這些語言,以及對其作為 C++ 後繼者的潛力進行了批判性的闡述。

Val:由 Dave Abrahams 和 Dimitri Racordon 發起,深受 Swift 的影響,看似條理清晰,易於使用(參見https://www。val-lang。dev/)

Carbon:由谷歌支援(Chandler 的說法是 Adobe 也支援),“感覺它就像是一個 C++ 清理專案。”

CppFront/Cpp2:由 Herb Sutter 領導,它想要更好的語法和預設值,但仍然編譯為C++。

綜上所述,有競爭總是好的,C++ 可能受益於其他語言,並且和 Carbon 或 Rust 交換特性。更重要的是,在 2022 年 C++的“安全性”發展似乎更為明顯,可參考以下報告。

關於 ChatGPT

YouTube 中有一條名為“AI 和 ChatGPT 可以取代 C++ 程式設計師嗎”的 C++Weekly 影片,影片中 Jason Turner 用機器人做實驗,有時候它可以建立有效的響應,但仍須注意一些細節,得出結論是這個聊天機器人可以成為一個非常有用的編碼助手!

一封來自 Educative 創始人 Fahim ul Haq 的郵件這樣寫到:

像 ChatGPT 這樣的人工智慧將改變軟體開發的格局,但並非以許多人所關心的方式。作為一名軟體工程師和開發人員學習的倡導者,我相信 ChatGPT 可以幫助我們製作更好的軟體,但它不能取代開發人員的工作。

關於聊天機器人,Fahim 還提出了這樣的想法:

“ChatGPT 將使編碼更加高效和無誤。由於它可以適應更復雜的需求,我們可以期待它幫助消除繁重的工作,加快生產力和測試。”

隨著諸如 ChatGPT 這樣智慧助手的發展,許多佔用開發人員的乏味任務在未來十年可能會消失,包括自動化單元測試、基於引數生成測試用例、分析程式碼以建議安全最佳實踐,以及自動化 QA。

這就更不用說學習和教學能力了,我們可以想象一位友好的“C++ 導師機器人”,你可以向它學習程式語言,或者像在工作中請教專家同事一樣向它詢問任何語言特性。也許我們將在 2023 年看到更多鼓舞人心的工具,有些可能是專門為 C++ 而設計的。

年度書籍

以下是 2022 年或 2021 年年底出版的一些精選書籍:

C++ 受歡迎程度

2022 年,C++ 在各種程式語言的“流行度”排行榜上似乎有了穩定的增長。在 TIOBE 最新公佈的年度程式語言中,C++ 以年增幅 4。62% 的人氣摘得桂冠,成為 2022 年度程式語言。

下面是 Stack Overflow 調查和 TIOBE 索引資料:

在 2022 年 11 月初,還有這樣一篇有趣的文章,名為《有才華的 C++ 開發人員正在枯竭》,以下是摘自文章的片段:

安東尼·皮科克(Anthony Peacock)曾在 Citi 和 Citadel 擔任量化分析師,他說:“不可能找到擁有真正高水平 C++ 技能的人,但這正是每個交易公司都想要的。”

即使 Carbon、Rust 或 CppFront 正處於拐點處,但仍然有大量的 C++ 程式碼需要維護。更重要的是,像金融這樣的許多領域仍然使用 C++ 作為他們的底層基礎語言。

關於 C++ 的一些調研

作者在 2022 年 12 月 12 日展開了關於 C++ 使用情況的年度調研,收到了 649 份反饋。下面是關於調研結果的總結(以下數字總和不等於 100%)。

C++ 標準使用:在日常生活中,你使用哪種 C++ 標準?

結果顯示,C++ 17 使用最多,C++ 20 增幅最多,從 2011 年的 28。8% 增長至 2022年的 42。2%,而 C++ 11/14 穩定在 28% 左右。

關於 C++ 17:對 C++ 17 使用程度如何?

關於 C++ 20:你對 C++ 20 有什麼經驗?

編譯器使用方面:GCC 仍然是大多數人的選擇。

IDE 方面:

你還使用了哪些額外的工具?

2022 年發生的與 C++ 有關的美好事情有哪些?這是一個開放性問題,基於留言的受歡迎程度,我們摘取了部分內容:

C++ 語言的更新和標準:語言的更新,比如 C++ 20 和 C++ 23 的釋出,以及採用了新的特性和建議。

新的語言:Carbon/Cpp2/Val,並在社群中引發了關於下一步的討論。

會議和活動:像往常一樣,CppCon 和 Meeting C++ 這樣的會議得到了很多投票。

書籍和資源:“C++ 之旅”、“安全地擁抱現代 C++”和“Klaus Iglberger 關於軟體設計的書”在答案中非常受歡迎。

YouTube 頻道:尤其是 Jason ‘s Turner、Cppcon Channel YouTube、Meeting C++ YouTube

個人專案和學習:用於個人專案或學習更多關於 C++ 的知識,以提高技能和對語言的理解。

編譯器支援:新 C++ 標準的編譯器支援是 C++ 社群的基本發展方向。

C++ 的受歡迎程度:回答中提到了 TIOBE 和其他排名。

此外,還有一些好訊息分享:

“我們公司遷移到了 C++ 20”

“我從 C++14 到 C++20 完成了個人進階”

“我剛剛又找到了一份 C++ 的工作,我很喜歡它”

總結

目前 C++ 正處於一個十字路口:一方面,它發展現狀良好,有很多新特性、編譯器支援以及很酷的工具(甚至更好的除錯效能);另一方面,許多專家正努力使這門語言從本質上更加安全,並解決一些長期存在的問題(打破了 ABI 的討論)。這就是為什麼有些專家試圖從一些新鮮的東西開始,透過建立一個新的賽道來改進 C++。這些新語言直接被編譯為 C++(如 CppFront),或者與 C++ 具有健壯的互操作性(如 Carbon)。

也許在未來,我們將使用更加安全的 C++ 2 語言進行編寫,並且在相同的專案中仍然保留一些優秀的 C++ 遺留檔案。希望良好的競爭可以把 C++ 推向新的歷史舞臺,併為我們提供更好的功能和更安全的程式碼。

最後,你對 2022 年的 C++ 有什麼看法?對你來說最重要的事件/訊息是什麼?歡迎留言討論。

《2022-2023 中國開發者大調查》重磅啟動,歡迎掃描下方二維碼,參與問卷調研,更有 iPad 等精美大禮等你拿!