2022年C++:在“替代”中寻找“转机”!

发表时间: 2023-01-09 11:16

【CSDN 编者按】告别各种不确定的 2022,我们迎来了崭新的 2023 年,岁末年初,大家都有写总结的习惯,回顾与展望。作为知名的 C++ 开发人员,Bartlomiej Filipek 在自己的博客上对 C++ 2022 进行了非常全面的总结。CSDN 组织译者进行了编译。

原文链接:https://www.cppstories.com/2022/cpp-status-2022/

未经授权,禁止转载!


作者 |Bartlomiej Filipek
译者 | 昕慈 责编 |梦依丹
出品 | CSDN(ID:CSDNnews)

每三年更新一次新功能、新标准的 C++ 在过去几年的表现着实有点“稳定”和“无聊”,甚至微软 Azure CTO 直接呼吁大家停用 C++。但 2022 年可以说是 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<std::string> createStrings();for (char c : createStrings().at(0)) // <<!{ // some code...}

自 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。

此公告主要针对<format>, <chrono> 以及 <ranges> 的一些额外更改和 DR 标准进行修复。如果能够完成,implementation 将再次稳定运行。

GCC

当前稳定版本 GCC 12.2 是 2022 年 8 月发行的 GCC 12 系列,即将发布的 GCC 13 预览版可参考:
https://gcc.gnu.org/gcc-13/changes.html

性能调试

让我们扩展一下性能和反馈循环相关内容,可以参考 Vitorio Romeo 的这篇文章:https://devblo
gs.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++20std: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++ 有什么看法?对你来说最重要的事件/消息是什么?欢迎留言讨论。