C++:在「替代」中迎來「轉機」的 2022 年!

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

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

未經授權,禁止轉載!

作者 |Bartlomiej Filipek

譯者 | 昕慈 責編 |夢依丹

每三年更新一次新功能、新標準的 C++ 在過去幾年的表現著實有點「穩定」和「無聊」,甚至微軟Azure CTO 直接呼籲大家停用 C++。但 2022 年可以說是 C++ 的一個歷史轉折。

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

背景

背景

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

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

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

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

  • C++23 特性凍結

  • C++20 被採用

  • 新語言

  • 反饋循環以及更好的工具

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

從時間軸看 C++

從時間軸看 C++

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

C++ 17 的編譯器支持

C++ 17 的編譯器支持

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

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

C++ 20 的編譯器支持

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 的編譯器支持

C++ 23 的編譯器支持

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

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

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

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

std::vector createStrings();for (char c : createStrings().at(0)) // <{// some code...}

自 C++ 20 開始,上面的 for 循環語句就存在 Bug,因為我們訪問的臨時對象的生命週期已經結束。而在 C++ 23 中,循環表達式中所有臨時對象的生命週期都將被延長,而不僅僅是第一個。

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

下表是關於庫的一些改進
下表是關於庫的一些改進
ISO C++ 會議

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++ 的繼承語言及其安全性

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

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

在某些情況下,我們能看出標準中存在的一些問題,也知道如何修復它們,但因為無法破壞 ABI,所以除了添加一些俗套的變通方法以外什麼也做不了。一些諸如來自Google的團隊對此感到氣餒,轉而創建了一些新的 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:由Google支持(Chandler 的說法是 Adobe 也支持),「感覺它就像是一個 C++ 清理項目。」

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

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

關於 ChatGPT

關於 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++ 受歡迎程度

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++ 的一些調研

關於 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 方面

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++ 有什麼看法?對你來說最重要的事件/訊息是什麼?歡迎留言討論。

相關文章

最強 AI ChatGPT 真要取代程式設計師?

最強 AI ChatGPT 真要取代程式設計師?

【CSDN 編者按】ChatGPT 一出,「程式設計師要失業了」、「程式設計師要下崗了」之聲不絕於耳,引得程式設計師們不由得一陣驚慌,最強 ...