2023年全球C++及系统软件技术大会参会报告

举报
飞得乐 发表于 2023/12/17 22:19:17 2023/12/17
【摘要】 2023年的C++大会选在北京召开。举办会议的两天,恰好遇上了北京大降温,室外飘着大雪,平均气温只有约-10摄氏度。这一次会议上演讲主题的内容也给C++语言带来了一丝寒意,感觉越来越多的人开始认真思考C++这门老当益壮的语言未来的地位会不会受到威胁。下面总结我听的每个会议主题演讲的内容。Bjarne Stroustrup:实现C++安全编程:挑战与方案第一场演讲照例由C++之父进行。这一次B...

2023年的C++大会选在北京召开。举办会议的两天,恰好遇上了北京大降温,室外飘着大雪,平均气温只有约-10摄氏度。

这一次会议上演讲主题的内容也给C++语言带来了一丝寒意,感觉越来越多的人开始认真思考C++这门老当益壮的语言未来的地位会不会受到威胁。

下面总结我听的每个会议主题演讲的内容。

Bjarne Stroustrup:实现C++安全编程:挑战与方案

第一场演讲照例由C++之父进行。这一次Bjarne演讲的内容和以前有很大差别,整场演讲都围绕着语言的安全特性。Bjarne先从C++的历史讲起,说强类型检查、const、面向对象、RAII等这些特性的加入都有安全方面的考量。他说:很多安全问题来自于所谓的“C/C++”语言——然而,根本不应该存在“C/C++”这种语言,使用C++就应该写现代C++代码。“C/C++”语言的叫法意味着很多人在用C语言的写法写C++代码。这些缺少封装,直接操作底层的写法导致了大量的安全隐患。但是,想要让C++语言去掉那些不安全的特性,形成一个安全的语言子集也是行不通的,因为总有某些地方需要用这些特性。Bjarne提到有些其他的语言号称解决了C++的安全问题,但是它们只是在实验室里造出来的。而大规模工业使用的场景和实验室完全不同:一旦某种语言被广泛的应用,就必须要考虑大规模的存量代码、不同水平的工程师、各种不同的使用场景。在这些背景下,C++很难一刀切的建立安全特性。

Bjarne最后给出了一种解决方案:C++的Profiles新特性。Profiles允许程序员用标注的方式指定对代码的安全约束(如非空指针、类型和资源控制等等),并通过静态检查来有条件的保证代码安全。演讲中给出的很多安全设计手段和Rust语言的设计比较像。

提问环节的第一个问题是怎么看待大语言模型对软件开发的影响。Bjarne在回答中首先强调专家之所以能成为专家,最重要的一点是知道自己不知道什么。Bjarne坦言自己对大模型了解不多,没法发表太多意见。但是他听说大模型在有些领域很好用,某些细分领域准确率甚至能达到90%,但是这也说明大模型没法做到完全正确。因此Bjarne认为当你要开发对正确性要求很高的软件时,使用大模型一定要非常非常小心。

有人提问C++能否从Python之类的其他语言中借鉴一些特性。Bjarne先给出肯定的回答,然后又补充特别强调C++是给工程师解决实际问题用的,不是给学校的孩子当玩具用的。因此C++的语言特性要瞄准解决实际问题,不能盲目的抄其他语言。

另一个问题是C++标准库中能否加入像.NET、JDK这样的功能更全面的框架。Bjarne说你要是给我几百万美金和一个上千人的大团队,我这些都能干。但问题是C++不像其他语言那样背靠一个大金主——我们没钱。

最后一个问题是C++语言总在演进,升级编译器会导致老代码编译失败,应该怎么办。Bjarne的回答简单粗暴:实际的编译器从来就不让老特性失效。Bjarne说他倒是很希望真的把一些特性给deprecate,彻底不让用。但问题是每次一提这个就一大堆人反对,说有些场合需要用这些特性。最后C++语言就只能继续兼容老特性,几乎没哪个C++特性在现实编译器上真正被废弃掉。

PS:看起来,Bjarne在这次演讲中的身体状况似乎不如从前了,时不时的就会停下来咳嗽。

李建忠:基于大语言模型的软件智能化新范式

李建忠提出计算机产业发展历史上有连接-计算的钟摆规律:每次连接的技术革命发生后,会发生一次计算的技术革命,然后再下一次连接革命……今年的大语言模型属于计算2.0革命。他认为大模型会给软件的开发范式、交互范式、交付范式都带来变化。他还参考汽车行业的自动驾驶标准,给“自动软件开发”定义了5级的分级标准。

这场演讲可能李建忠之前在其他场合也讲过,总觉得PPT内容以前见过。

David Sankel:展望C++未来30年的发展

David是Adobe的首席科学家,他在演讲中试图预测C++语言未来30年的发展状况。

David认为未来10年的趋势是比较好预测的:Modules、包管理、静态反射、Sender、还有一些从其他语言借鉴来的特性几乎确定会加入C++。值得注意的是:调查显示现在已经有超过20%的C++程序员同时也用Rust,预计10年后,这个数字会增长到50%。

未来20年,C++语言将会变得非常复杂——因为不断有新的语言特性加入,导致C++越来越臃肿,代码库中各种写法的代码交织在一起。至于号称C++继任者的那些语言,只有Rust和Swift可以确定还会继续存在。

未来30年,很少有人会出于兴趣学习C++语言,AI将会取代人类成为主要的C++代码维护者,C++语言将会是一个尴尬的历史遗留存在。David举了一个例子:美国大量公路上的限速牌写的数字,是以英里为单位的。但是现在主流的公制单位是公里,人脑进行这种单位转换很困难。然而,如果把全美国的限速牌全部都换掉,又会导致大量人不适应,所以美国只好一直保持着这个历史遗留的英里单位限速牌。David认为30年以后,C++就像这些限速牌一样,遗留在大量的历史代码库之中,即使问题很多,也不可能被全部替换。

从演讲内容看,David似乎认为C++会进入一种积重难返的境地,总体来说这个预测是偏悲观的。

翟季冬:图算融合的人工智能编译器

翟季冬是清华大学计算机系的教授,他的演讲围绕着如何改进人工智能程序的编译方法,内容和C++语言没有直接关系。现有对人工智能程序的编译优化都是在图层和算子层分别进行,而翟季冬团队提出了在图层做局部等价优化,以及把图层和算子层结合起来的张量表达式优化两种新方法,取得了很好的优化效果。

嘉宾论坛:大语言模型时代的软件与编程之未来

李沫南、李建忠、David Sankel、翟季冬4位嘉宾在台上讨论了大语言模型对C++语言的影响。嘉宾的一个观点是由于大模型对机器性能的要求很高,所以在底层仍然会大量使用C++编码。另一个观点是由于C++能用于模型训练的存量代码更多,因此大模型生成C++代码时会比生成其他语言代码更加擅长。

Bryce Adelstein Lelbach:C++地平线:C++的未来三大特性

Bryce介绍了预计会加入C++26标准的3个特性:静态反射、模式匹配、Sender,并给每个特性都举了几个代码例子。从例子看,新特性的加入再次让C++代码显得陌生了,没学过新特性的程序员肯定没法看懂用这些新特性写的代码。其中模式匹配特性的语法几乎和Rust语言的match表达式一模一样。

Bryce Adelstein Lelbach:C++并行编程及标准化

在第二天,Bryce又做了并发编程的专题演讲。这次演讲的内容可以看作是把前一天讲过的Sender特性进一步的细化,举了更多的例子来介绍怎样用Sender写出可以跑在各种CPU、GPU、分布式环境下的通用C++代码。除此之外,Bryce还介绍了C++23中加入的std::mdspan,它是多维数组的一个切面视图,支持各种可定制的slicing操作。std::mdspan的很多用法和Python语言有几分相似。

Fedor Pikus:非统一内存架构(NUMA)及性能实践(上)

Non-Uniform Memory Architecture(NUMA)是一种新的体系结构,在这种架构中每个CPU只能访问自己独占的内存空间,而不像以往那样所有CPU共享访问同一片内存空间。NUMA在近几年的Intel桌面CPU产品中已经得到了应用,其性能表现和传统架构会有差异。Fedor通过展示一些性能测试结果,阐述了NUMA架构的特点。尤其要注意:NUMA架构在执行某些并发程序时,只用32个核的性能甚至比同时用64个核的性能还好。

这个系列演讲共有两场,我听了上半场后觉得和自己业务关系不大,就没有再听下半场。

Daniel Betz:如何用C++编程而不被炸掉整条腿

Daniel是Qt的工程师。这场演讲的标题取得很唬人,但内容实际上是对静态检查工具的代码测试例展示。演讲内容包括多个违反了MISRA、AutoSAR等编程规范的代码例子,如空指针、非法指针、生命周期、变量初始化等各种编码问题。这些基本上都是业界讲了很多年的C++语言问题,展示的静态检查工具并没有在检测技术上有什么新的突破。

David Sankel:从系统底层看C++:汇编语言、系统调用和硬件

这是Adobe的首席科学家David做的另一个演讲主题。这场演讲是一场有趣的现代汇编语言教程:从CPU寄存器开始介绍,讲汇编指令的基础语法,然后从例子中学习C++代码如何被编译成汇编代码,还深入介绍了Linux系统调用时使用的VDSO的原理。

在第二天上午,本来属于Bill Hoffman的议题,由于Bill临时网络不通,改为由David Sankel临时救场。David接着前一天的话题,继续讲原子操作在CISC和RISC架构下的汇编实现,以及调用main函数的汇编代码是什么样。

在提问环节,有人问并发编程应该注意什么。David说:最重要的是记住:Don't do it! 尽可能的不要写并发代码,如果非要写并发,也先去找业界的成熟库来用,而不要自己实现。

嘉宾论坛:大模型赋能软件开发:现状与未来展望

李沫南、王博、贺美迅、韩炳涛4位嘉宾在台上讨论了大模型给软件开发带来的变化。嘉宾的几个观点:

1. 大模型给软件开发人员的能力要求带来了变化,未来的开发人员需要更注重任务分解的能力和系统设计的能力。

2. 贺美迅认为3年内,大模型可以让软件开发效率提升30%。大模型可以让精英程序员能完成更多的工作。

3. 韩炳涛认为大模型会降低程序员的门槛,就像高级语言相比汇编语言让更多人进入了编程行业一样,未来使用大模型的“程序员”可以远比现在多,不用担心初级程序员会出现断层。

滕志鹏:B站搜索推荐场景中的KV技术优化

滕志鹏来自Bilibili公司,他的演讲主题介绍如何对hash表做性能优化。优化的一个基础是absl::flat_hash_map所采用的Swiss Table,它使用SIMD的指令大幅加快了key匹配的速度。在Swiss Table的基础上,滕志鹏他们进一步研究了在hash冲突时,链表存储和二次探测两种方法的优缺点,然后巧妙的把两者优点结合起来,在局部范围内用节点紧凑存储链表。再加上节点热度排序、AMAC、SIMD、RCU读写并发等多种手段,使得hash数据结构性能显著的超越了业界的现有水平。

John Lakos:狭义契约和noexcept的不兼容性

John来自Bloomberg,他的演讲内容主要介绍C++的函数契约。John先展示了几个简单的函数,指出这些函数的完整契约并没有想象的那么简单。John在演讲中特别提到了被广泛误传的“里氏替换原则”(Liskov Substitution Principle,LSP),即所谓的“子类可以替换父类”。John说这个定义是错误的,就连维基百科上写的都是错的。他之所以这么肯定,是因为之前Liskov本人也去了Bloomberg公司,John亲自去找Liskov确认LSP的准确定义是什么,Liskov明确告诉John网上流传的说法是错误的。John说老有很多人和他争论LSP的定义,表示现在还有人要争的话,去和Liskov本人争,不要和他争。

John揭示了真正的Liskov Substitution Principle(LSP)的定义:对于所有当前的程序P,使用了版本为V的库L,如果把库L从版本V换成版本V+1,不会导致任何一个P产生可观测的行为变化,则称“V+1 is subtitutable for V”。显然,真正的LSP讲的是后向兼容的定义而不是继承关系。

C++函数的noexcept修饰会带来很多后向兼容的问题,它几乎总是导致程序可观测行为的可能变化。因此,John的总结是:不要主动给函数加上noexcept,除非标准库的一些接口要求你这么做。

Paul McKenney:猎取海森堡Bug:并发调试策略

海森堡bug(heisenbug)是指在尝试研究它时似乎会消失或者改变行为的bug,常常在大规模的并发程序中出现,这种bug极其让人头疼。Paul在演讲中介绍了如何让很难重现的并发问题大幅度增加重现概率,手段包括:增加内核操作次数、让队列接近满负荷、增大读写延迟、构造特殊的状态等等。采用这些方法,可以使得用更少的机器、更短的时间来完成大规模集群的压测。除了如何复现并发问题,Paul也介绍了如何预防这种问题,而预防的手段则并不新奇:仔细设计、测试、做好代码检视和验证。

Ivan Cukic:使用std::expected和协程

传统C++程序使用异常、返回值、特殊值等方法来传递错误,但是这些方法各有缺点。在C++23中,增加了std::expected,它封装正常的返回值和可能的错误对象在同一个对象之中(类似std::variant),让调用者无法忽略错误处理。为了让std::expected使用更方便,还提供了一系列的配套工具,让不同错误类型之间能方便的转换。如果结合协程,std::expected工具甚至可以用来在caller和callee之间交互错误处理过程。

在我看来,std::expected和Rust的Result太像了,很多操作函数几乎照抄Rust语言的设计。

Rainer Grimm:来自C++核心指南的最佳实践

Rainer是个比较有名的德国专家,几年前我学习C++20时就经常看他写的系列博客。但是Rainer这一次演讲并没有提多少C++的新特性,而是介绍了一遍C++ Core Guidelines各章节中的重点条款。其中很多编写C++代码的建议,对于写过现代C++的程序员应该都不陌生了。

Nina Ranns:类模板参数推导CTAD解析

CTAD是C++17的新特性。在C++17之前,只有函数的模板类型参数可以被自动推导,而类模板的类型参数必须在实例化时显式的写出来。有了CTAD以后,类的模板参数也可以在初始化时自动推导了,这使得很多C++代码得到了简化。Nina在演讲中详细介绍了CTAD的用法、原理,CTAD和函数模板参数推导的区别,以及CTAD使用中的一些陷阱和注意事项。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。