本文旨在讓我們回顧 C++ 2019年裡的變化和發展!我們將重點關注本年度裡 C++ 上發生的重大事件,標準的發展,工具的變化等等……
作者 | Bartek
譯者 | 蘇本如,責編 | 屠敏
以下為譯文:
免責聲明:本文提出的觀點僅代表個人立場,並不代表整個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::formatstd::spanstd::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!將結構化綁定擴展為更像變量申明 - P1091R3std::polymorphic_allocator<> - P0339std::midpoint和std::lerp - P0811std::execution::unseq執行策略 - P1001std::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) - P0645C++20同步庫 - P1135constexpr 內存分配 - P0784constexpr std::vector - P1004constexpr std::string - P0980線程可中斷 join 支持(Stop Token) - P0660source_location - P1208using enum - P1099constinit關鍵字 - P1143數學常量 (std::numbers::pi和 friends) - P0631將概念(Concepts)的命名方式從PascalCase(駝峰式命名法)改為snake_case(蛇形命名法) - P1754廢棄volatile關鍵字 - P1152布局兼容性和指針互易性特徵 - P0466構造函數的nodiscard 屬性 - P1771改進的iterator concept hierarchy - P1207Move-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、安卓、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 TidyClang-Include-FixerAddressSanitizerMemorySanitizer對於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::formatCode::Dive 2019大會Meeting C++ 2019大會C++博客 - 幫助更容易學習和掌握最新的語言C++ 書籍和課程 – 提升水平,更多的選擇機會C++ CastC++ 社區 – 大會,用戶組越來越好用的工具: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
本文為 CSDN 翻譯,轉載請註明來源出處。