一文看盡C++ 過去的這一年

  • 2020 年 2 月 23 日
  • 筆記

點擊上方「小白學視覺」,選擇「星標」公眾號

重磅乾貨,第一時間送達

本文轉載自:CSDN

本文旨在讓我們回顧 C++ 2019年里的變化和發展!我們將重點關注本年度里 C++ 上發生的重大事件,標準的發展,工具的變化等等……

作者 | Bartek

譯者 | 蘇本如,責編 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下為譯文:

免責聲明:本文提出的觀點僅代表個人立場,並不代表整個ISO C++標準委員會的意見。

簡介

以下是本年度最讓我關注的三大方面:

  • C++ 20即將發布。
  • 開發工具。
  • C++在開發者中的穩定位置。

請繼續閱讀以獲得對以上三大方面的全面了解。

重大事件時間表

下表按日期順序列出了本年度C++發生的重大事件:

對C++11/14的編譯器支援

為了保持完整性,筆者在這裡先提醒一下:Clang(從版本3.4開始),GCC(從版本5開始)和Intel C++ Compiler(從版本15開始)已經完全支援C++ 11/14。

Visual Studio團隊宣布Visual Studio 2017 15.7版完全支援C++ 17,這也意味著它對C++ 11/14的支援。現在,你可以構建複雜的程式碼庫,如boost::hana或range v3。

既然C++ 11/14在所有主流編譯器中都得到了支援,那麼就不存在任何理由不使用現代C++了。

對C++ 17的編譯器支援

C++17作為ISO/IEC 14882標準:2017 程式語言–C++發佈於2019年12月。

你可以在這裡下載一個免費的官方文檔的最終版:N4700, 2017-10-16, PDF。

支援C++的編譯器的一份完整列表可以參考這裡:C++17 編譯器支援。

你也可以閱讀我的部落格文章:C++17特性(https://www.bfilipek.com/2017/01/cpp17features.html)。

關於C++17的語言特性:

從Clang版本5.0、 GCC版本8.0、 Visual Studio版本15.7和Intel C++ Compiler版本19.0.1開始,所有編譯器都支援C++17的語言特性。

標準庫上還有更多的工作需要完成,特別是針對並行演算法和文件系統等重要問題的工作。

對於std :: filesystem的支援,你需要GCC版本8.1(或者支援更好的版本9.1)、Clang版本3.9(或者支援更好的版本7.0)和Visual Studio 2017版本15.7。

並行演算法的更新最早在Visual Studio 2017 15.7中提供,但是隨著之後的更新,MSVC團隊又添加了更多演算法。

接下來可以使用的是Intel PSTL實現,它也被添加到GCC版本9.1中。你需要Intel執行緒構建塊(TBB – Threading Building Block) 作為後端實現(欲知詳情,請參考下面這篇文章):

在Linux和macOS上使用GCC 9.1和Intel TBB實現C++ 17 STL並行演算法(作者:Paul Silisteanu) :https://solarianprogrammer.com/2019/05/09/cpp-17-stl-parallel-algorithms-gcc-intel-tbb-linux-macos/

而Clang庫對並行演算法的支援還需要繼續等待。

另一個問題是低層轉換函數的實現。

Visual Studio從版本15.7開始支援在from_chars() / to_chars()函數中支援整形參數,在版本15.8中又添加了對from_chars()的浮點支援。但是完全一致的支援直到版本16.4(對to_chars()的浮點支援)才開始可用。

到目前為止Clang和GCC版本只支援整數。原因可能是MSVC STL(標準模板庫)的實現是開源的,我們可以預期一些程式碼將被移植到其他標準庫實現中。

C++20

關於C++20的討論今年佔據了主導地位。在德國科隆舉行的夏季ISO C++標準會議後,C++20的特性已經凍結。在稍晚時間舉行的貝爾法斯特C++標準會議上,第一批國家機構的一些意見得到了解決。

總之,這意味著我們明年發布新的C++標準的道路會一馬平川!

下面列出C++20的主要特性:

  • 模組(Modules)
  • 協程(Coroutines)
  • 標準庫開箱即用的概念(Concepts)
  • 範圍(Ranges)
  • constexpr支援:new/ delete,dynamic_cast,try/catch,虛擬
  • constexpr 向量和字元串
  • 計時(Chrono):日曆、時區支援
  • std::format – 詳見此處C++20中的std::format
  • std::span
  • std::jthread

更重要的是,很多C++ 20的特性在流行的編譯器中已經實現了。像模組(Modules)支援這種最重要的工作仍然沒有完成(我們只是完成了一些實驗性的Module-TS實現)。

像以往一樣,完整的編譯器支援列表可以在cppreference網站:C++20編譯器支援頁面(https://en.cppreference.com/w/cpp/compiler_support#cpp2a)上找到。但是我想在這裡列舉幾個:

ISO C++標準會議

今年共計舉行了三次C++標準委員會會議,分別在夏威夷的科納、德國的科隆和北愛爾蘭的貝爾法斯特舉行。似乎今年的委員會更願意留在歐洲。

這裡可以找到所有的會議計劃,包括:即將舉行的會議和已經結束的會議(https://isocpp.org/std/meetings-and-participation/upcoming-meetings)。

下一次會議將於2020年2月在布拉格舉行。

二月: 夏威夷科納會議

在這次會議上,下列C++新特性投票後被批准納入了C++20標準:

  • 模組 – P1103!
  • 協程 – N4736!
  • 將結構化綁定擴展為更像變數申明 – P1091R3
  • std::polymorphic_allocator<> – P0339
  • std::midpoint和std::lerp – P0811
  • std::execution::unseq執行策略 – P1001
  • std::ssize 返回有符號數的自由函數 – P1227
  • 查找時預先計算hash值 – P0920

並行化TS 第二版也被作為以下標準發布:

ISO/IEC TS 19570:2018程式語言 – 用於並行化的C++擴展技術規範(https://www.iso.org/standard/70588.html)。

這次會議的主要會議報告摘要可以從如下兩個鏈接找到:

r/cpp: 2019-02 科納ISO C++標準委員會會議報告(https://www.reddit.com/r/cpp/comments/au0c4x/201902_kona_iso_c_committee_trip_report_c20/)和科納會議後的郵件列表(https://isocpp.org/blog/2019/03/2019-03-post-kona-mailing-available)。

其他版本的會議報告鏈接如下:

  • Herb Sutter – 會議報告:冬季ISO C++ 標準會議(科納)
  • Botond Ballo – 會議報告: 2019年2月科納C++標準會議
  • cor3ntin – 科納會議報告
  • Timur Dumler – 會議報告:2019年2月夏威夷科納ISO C++標準委員會會議

七月: 德國科隆會議

這次會議是C++20標準的特性凍結會議。這是最後一次投票的機會。

另外,有一個主要的特性在這次會議上從草案中淘汰了。雖然Contracts(合約)很有吸引力,但實際上,委員會未能就最後的實施要點達成一致。因此,最後的決定是最好成立一個獨立的研究小組,嘗試在C++ 23中納入這一特性。

這次會議批准的一些重要特性和變化如下:

  • 合約(Contracts)從C++20中移除,Contracts研究小組成立。
  • 文本格式化支援:std::format("For C++{}", 20) – P0645
  • C++20同步庫 – P1135
  • constexpr 記憶體分配 – P0784
  • constexpr std::vector – P1004
  • constexpr std::string – P0980
  • 執行緒可中斷 join 支援(Stop Token) – P0660
  • source_location – P1208
  • using enum – P1099
  • constinit關鍵字 – P1143
  • 數學常量 (std::numbers::pi和 friends) – P0631
  • 將概念(Concepts)的命名方式從PascalCase(駝峰式命名法)改為snake_case(蛇形命名法) – P1754
  • 廢棄volatile關鍵字 – P1152
  • 布局兼容性和指針互易性特徵 – P0466
  • 構造函數的nodiscard 屬性 – P1771
  • 改進的iterator concept hierarchy – P1207
  • Move-only視圖 – P1456
  • 附加視圖和range適配器 – P1035
  • 運算符<=>加入標準庫 – P1614
  • 類模板參數推導的擴展 – P1021

這次會議的主要議程報告摘要可以在下面兩個地方找到:

  • r/cpp thread – cologne meeting(https://www.reddit.com/r/cpp/comments/cfk9de/201907_cologne_iso_c_committee_trip_report_the/)
  • post Cologne mailing(https://isocpp.org/blog/2019/08/2019-08-post-cologne-mailing-available)

會議報告:

  • Herb Sutter – 會議報告:夏季ISO C++ 標準會議(科隆)
  • Timur Dumler – 會議報告: 2019年7月德國科隆C++委員會會議,
  • Botond Ballo – 會議報告: 2019年7月德國科隆C++ 標準會議
  • Silexica – 會議報告: 2019年度德國科隆ISO C++會議
  • Guy Davidson – 德國之行:科隆會議報告

十一月,北愛爾蘭貝爾法斯特會議:

這一次,委員會不再投票任何新的特性,他們的大部分時間花在解決國家機構針對C++ 20草案提出的意見。

主要的會議報告發布在r/cpp網站上,會後的郵件列表地址為: https://isocpp.org/blog/2019/12/2019-11-post-belfast-mailing-available

其他的會議報告有:

  • Herb Sutter – 會議報告:秋季ISO C++ 標準會議(貝爾法斯特)
  • Botond Ballo – 會議報告:2019年11月貝爾法斯特C++標準會議
  • Ben Craig 會議報告:貝爾法斯特的獨立錯誤
  • Guy Davidson – 在我家後院召開的WG21會議: 貝爾法斯特會議報告

編譯器最新版本及說明

下面列出編譯器的最新版本和最引入注目的更新。

Visual Studio

最新版本是Visual Studio 2019版本16.4,最後一次更新發生在12月3日。

– 版本說明:https://docs.microsoft.com/en-us/visualstudio/releases/2019/release-notes

今年推出了新版Visual Studio 2019!它為已經非常出色的集成開發環境(IDE)帶來了許多新的特性和增強功能。

這裡是最初發布時的部落格文章:

Visual Studio 2019: Code faster. Work smarter. Create the future. | Visual Studio Blog(https://devblogs.microsoft.com/visualstudio/visual-studio-2019-code-faster-work-smarter-create-the-future/)。

一些重要的特性:

  • 基於Visual Studio IntelliCode的人工智慧輔助程式碼補全。
  • 在C++ MSBuild和CMake項目中對 Clang 和 MSVC 的 Clang-Tidy 的支援。
  • AddressSanitizer支援 Windows 上使用 MSVC 編譯的項目
  • 和CMake更好的集成。
  • 概念(Concepts)在版本16.3 中可用
  • 對to_chars()的全面支援, 完善了C++17中的要求。
  • 提供了一個名為C++ Build Insights的新工具集。欲知詳情,請參閱C++團隊部落格。

另一個主要的更新來自Cppcon大會,MSVC團隊在會上宣布將他們的標準模板庫實現開源!詳情請參見:

MSVC宣布開源其標準模板庫實現 | C++ 團隊部落格(https://devblogs.microsoft.com/cppblog/open-sourcing-msvcs-stl/)

一些其他新聞:

  • AddressSanitizer (ASan)在 Windows上支援MSVC | C++ 團隊部落格
  • 在Visual Studio中使用clang-tidy進行程式碼分析 | C++ 團隊部落格
  • Visual Studio 2019版本16.3開始支援C+20 Concepts特性 | C++團隊部落格

這裡有一個關於C++標準(包括C++20)的一致性的文檔:

Microsoft C++語言一致性清單(https://docs.microsoft.com/en-us/cpp/overview/visual-cpp-language-conformance?view=vs-2019)。

GCC

最新的穩定版本9.2,發佈於8月12日,詳情請參見:GCC9發布系列更新(https://www.gnu.org/software/gcc/gcc-9/)。

  • GCC對當前C++特性的支援(https://gcc.gnu.org/projects/cxx-status.html)
  • Libstdc++ 狀態(https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html)

Clang

最新的穩定版本9.0,發佈於2019年9月19日。詳情請參見:版本發布說明

  • Clang對當前C++特性的支援(https://gcc.gnu.org/projects/cxx-status.html)
  • libc++ C++1z 狀態(https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html)

Intel Compiler

最新版本19.1,發佈於2019年4月2日。詳情請參見:版本發布說明(https://software.intel.com/en-us/articles/intel-cpp-compiler-release-notes)

  • Intel® C++ Compiler對C++14特性的支援(https://software.intel.com/en-us/articles/c14-features-supported-by-intel-c-compiler)
  • Intel® C++ Compiler對C++17特性的支援(https://software.intel.com/en-us/articles/c17-features-supported-by-intel-c-compiler)

C++ Builder

最新版本為Rio 10.3 更新3,於2019年11月21日發布,詳見版本發布說明。

集成開發環境(IDE)- Embarcadero C++ Builder使用了一個經過修改的Clang編譯器(版本5.5)和一個Dinkumware標準模板庫(STL)實現,它可以與Win32和Win64應用程式一起工作。這是一個功能全面的IDE,用於從單一C++程式碼庫構建iOS、Android、Windows和macOS應用程式。

一些相關新聞:

  • 版本10.3.2新增功能:用於64位Windows環境的C++17 — 實現在所有Windows環境下使用C++17 Clang編譯器。
  • 新的Delphi和C++Builder RAD伺服器課程,已在Embarcadero學院、 Embarcadero部落格站點、開發者工具和IDERA社區提供
  • RAD Studio 10.3新增功能: C++17的非同步程式碼補全,以及其他功能

這裡是一份C++特性的一致性清單:編譯器對現代C++語言特性的支援(http://docwiki.embarcadero.com/RADStudio/Rio/en/Modern_C%2B%2B_Language_Features_Compliance_Status)

各種工具

當編譯器幫助C++程式碼完成了主要任務時,我們也不能忘記其他工具的重要性。

以下是一些重要的工具,值得了解一下:

Clang 工具:

Clang/LLVM 提供了許多強大的實用程式,例如:

  • Clang Tidy
  • Clang-Include-Fixer
  • AddressSanitizer
  • MemorySanitizer
  • 對於Visual Studio,你可以使用Clang Power Tools,它是Visual Studio的一個擴展.
  • 它由Victor Ciura開發 (@ciura_victor)。
  • 最新版本 5.5於2019年12月18日發布. 詳見版本變更日誌。
  • 它同時還有一個付費版本。

集成開發環境

Visual Assist – 最新版本發佈於2019年11月11日。詳見:

  • Tomato Soup部落格文章 | Visual Assist 版本2353已經可用(https://blog.wholetomato.com/2019/11/11/visual-assist-build-2353-is-available/)。

ReSharper C++ – 最新版本為2019.3, 詳見:

  • ReSharper C++部落格文章 | ReSharper C++ 版本2019.3: 支援C++20概念,類型提示, #includes排序, 和其他特性(https://blog.jetbrains.com/rscpp/resharper-cpp-2019-3/)。

CLion – 最新版本為2019.3, 詳見:

  • CLion部落格文章 | CLion 2019.3:一個專註於性能和一些期待已久的增強功能的高品質發布(https://blog.jetbrains.com/clion/2019/11/clion-2019-3-release/)。

Cevelop版本1.13.0 發布(https://www.cevelop.com/2019/10/23/cevelop-1.13.0-release.html)。

為了更好地理解程式碼,你還可以使用SourceTrail。它最近作為完全免費版本發布!詳見:

SourceTrail開發者部落格 | SourceTrail現在已是免費的開源軟體。

程式碼分析器:

CppDepend 版本2019.3:

  • CppDepend – 2019.3版本的新功能(https://www.cppdepend.com/cppdependv2019)!
  • 今年,該團隊增加了對如下工作的支援:MISRA編碼準則、VS 2019、QT項目、UI簡化和嵌入式項目。

PVS-Studio:這是一個使用C、C++和C#編寫的,用於在程式源程式碼中進行錯誤檢測的工具。在Windows和Linux環境下都能夠工作。

  • 最新版本是PVS-Studio 版本7.05,請參閱今年的所有發布說明(https://www.viva64.com/en/m/0010/)。
  • 今年的一些顯著改進包括:.NET Core 3和3.1項目分析、MISRA編碼準則支援、40多項新檢查、對Java和SonarQube插件的支援。

包管理器:

  • Conan– 版本1.21已經可用。
  • Microsoft/vcpkg: VC++打包工具– 一個適用於Windows、Linux和MacOS環境的開源C++庫管理器。

C++相關會議

我們沒有理由抱怨C++會議的缺乏。實際上今年有很多會議機會,尤其是在春季和秋季,下面是幾個會議的例子:

  • CppCon – 2019年9月舉行
  • C++Now – 2019年5月舉行
  • Meeting C++ – 2019年11月舉行
  • ACCU – 春季會議在2019年4月舉行,秋季會議在11月舉行

還有很多其他的會議,如:Code::Dive、C++義大利大會、C++ on Sea、C++ 義大利日、C++俄羅斯大會、核心C++ 2019大會、等等。

如果你沒有參加過任何一個會議,你可以在YouTube上快速輸入它的名字,就會從中找到大部分演講的影片,這很令人驚訝。你也可以使用一些網路搜索引擎很容易地找到相關會議報告。

以防萬一,這裡是ISO C++ 網站上的全球註冊會議的鏈接:C++全球會議和 FAQ(https://isocpp.org/wiki/faq/conferences-worldwide/)。

社區和用戶組

用戶組提供給你遇見其他C++程式設計師,分享你的經驗和學習新事物的機會。我強烈建議你定期訪問這些用戶組,或者至少偶爾訪問一次。

我很高興,我所在的城市(Cracow)的用戶組C++ Krakow用戶組(https://www.meetup.com/C-User-Group-Cracow):今年將繼續存在,如果你住在附近的話可以加入!

如果你在查看完這個全球用戶組列表後確認你附近沒有C++用戶組。你還可以加入如下用戶組:

  • C++ Slack頻道: https://cpplang.now.sh/
  • #include C++(https://www.includecpp.org/)

C++ Poland

此外,今年我們還在波蘭推出了C++部落格:C++ Polska。我們有幾個活躍的作者每個月都會在那裡分享很棒的內容!

同時我們也啟動開始了一個Slack頻道,在那裡你可以討論任何C++和非C++的東西:加入這裡:C++ Polska Slack(https://bit.ly/cpppolskaslack)

書籍和課程

今年的一些發行的書籍和發布的課程值得一看:

有一個驚喜是John Lakos的書!我等了好幾年,終於有貨了!

下面是一些流行的C++自出版書籍的列印版本:

受歡迎程度

C++在哪些領域受歡迎?它的份額都被JavaScript蠶食了嗎?

顯然不是,因為在某些領域C++已經成長或保持在一個穩定的位置。

讓我們看看一些圖表/統計數據:

  • TIOBE 程式語言排行榜中,C++排名第4。它的佔比現在為6.196%,去年超過了7%,兩年前大約5.5%。詳情請參見Tiobe Index。
  • 在 StackOverflow 調查中,C++排名第9,超過了C,但是低於Java,C#,當然也低於Javascript,而它在上一年排名第10。詳見:2019 Stack Overflow開發者調查(https://insights.stackoverflow.com/survey/2019#technology)
  • 在GitHub調查中,C++排名從去年的第5下降到今年的第6。詳見:2019 Octoverse 統計報告(https://octoverse.github.com/#top-languages)

我個人覺得,C++仍然很強大。也許它並不完美,也不容易學習,但是很多程式碼仍然是用這種語言構建的。Rust或其他系統語言不會很快取代它。它的工具越來越好,而這個語言正在致力於降低它的複雜性,所以初學者的體驗希望是越來越好。

然而,C++只是工具的一種,我們很感激今天我們有很多工具可以使用。

我還找到了Daniel Lemire最近發表的一篇文章,十年前他對程式開發和程式語言做了一些預測。他對C++的增長感到驚訝。

讓我們看看Daniel Lemire的評價:

我認為從2010開始,C++已經成為一種更好的語言。這並不容易,但已經超出了我的預期。

問卷調查

一個多星期前,我做了一個快速的問卷調查,希望得到一些關於C++使用的數據。我收到了574個回復!感謝大家!

C++ 標準的使用

在日常工作中,你使用哪個C++標準?

(註:以上百分比的總和不是100%)。

在這份調查中,我沒有明確「使用」的準確含義,所以它既可以指生產環境的編碼,也可以指業餘項目的編碼。比如,我看到C++20的使用率很高,但我相信它主要用於測試,還沒有用於完整的生產環境,或者,也許我錯了?

C++17的使用經驗

你對C++ 17的使用有什麼經驗?

我們可以看到,今年C++17標準的採用率在穩步增長。

C++20的使用經驗

你對C++20的使用有什麼經驗?

編譯器的使用

你使用什麼編譯器?

(註:以上百分比的總和不是100%)。

你還用哪些其他的開發工具?

(註:以上百分比的總和不是100%)。

去年我沒有問這個問題。

我認為這個問題中的「debuggers」不是個好選項,因為我們可以假設所有的開發人員在某個時候都會使用它。

當然還有一些「其他」的答案,包括:ccache、meson、make、Boost build、QMake、Autotools、cmake format、Emacs、Whole Tomato。

你認為2019年發生的最好的事情是什麼?

這是一個開放性的問題,根據我收集到的回答,主要有以下幾件大事(以下列表基於答案中出現的順序,沒有特殊的排序):

  • CppCon 2019大會
  • C++20 新特性和標準化
  • C++20中的模組(Modules)特性
  • 協程(Coroutines)
  • 概念(Concepts)
  • 範圍(Ranges)
  • std::format
  • Code::Dive 2019大會
  • Meeting C++ 2019大會
  • C++部落格 – 幫助更容易學習和掌握最新的語言
  • C++ 書籍和課程 – 提升水平,更多的選擇機會
  • C++ Cast
  • C++ 社區 – 大會,用戶組
  • 越來越好用的工具:Clang build analyser, VS 2019, QTCreator, CLion

有些人還列出了一些個人成就:例如,開始使用C++17,在大會上的第一次演講。有人提到在項目中引入Conan,有人換了工作。還有人回饋說「終於退休了」。這些對所有人都有益處!

我也很高興看到有人說「最好的是我的書」。謝謝:)

給個對這個問題的回答例子:

「最好的事情是了解了C++17的細節」, 當然,這個免費版本堅定了我在項目中使用它的想法。

其他問卷調查

C++標準委員會在今年的二月份也發出了一份問卷調查。他們設法獲得了2000多份回復。

這份問卷調查表和結果可以在這裡找到:第二次C++基金會年度開發者問卷調查:標準C++ (https://www.jetbrains.com/lp/devecosystem-2019/cpp/)

調查結果.

還有一項來自Jetbrains的調查:C++ 2019 – 2019資訊圖表中開發者生態系統狀態調查(https://www.jetbrains.com/lp/devecosystem-2019/cpp/)

總結

本年度我想強調的就以下三件事情:

  • C++ 20即將發布。
  • 開發工具 – 讓編寫C++程式碼更加容易!
  • C++在開發者中的穩定位置

總而言之,我認為在未來的十年,我們可以以一種積極樂觀的態度看待C++。雖然我們無法預知更遠的將來會發生什麼,但是至少在接下來的十年里,我相信C++應該是穩定的。有了所有這些工具的幫助,新的C++標準編寫的C++程式碼會更加容易訪問,並且更加不容易出錯。在可預見的將來,C++仍然是追求性能的應用程式的無二選擇,甚至它會取代C和Fortran。

原文:https://www.bfilipek.com/2019/12/cpp-status-2019.html