采访 | Tim Anderson
整理 | 云昭
出品 | 51CTO技术栈(微信号:blog51cto)
上周,5月6-7日,于慕尼黑举行的Qt World Summit大会上,C++之父Bjarne Stroustrup在其《21世纪的C++》主题演讲前特别接受了外媒DevClass的专访,访谈中涉及到很多,比如:
如何写出现代风格的C++?为什么替代这门语言很难?AI潜在的风险,以及为何拥有多套略有差异的编译器反而是一件好事?等等。
尽管演讲题目如此,Stroustrup并未将重点放在C++26(下一个主要版本)即将到来的特性上,比如反射和契约(contracts)。
图片
他说:“这门语言并不只是最近新加进去的功能而已。要写出符合当代的C++,你得把从语言诞生早期到现代的各种特性组合起来使用……我最主要想说的并不是‘有几个特别棒的新特性你一定要用’,而是‘你应该用好现在这门语言本来的样子’。它现在是一个更加连贯的整体,更高效、更具表现力、更安全。”
C++程序员应该用哪些特性,才能写出‘现代风格’的代码?
Stroustrup说:“很多关键点在于这些特性是如何相互配合的。我一直在努力让程序员能用语言本身更直接地表达意图。比如写循环,现在95%到99%的循环场景其实都是‘对这个容器里的所有元素做点什么’,根本不用手动定义循环变量。你可以写成‘for x in y’或类似的结构,直接表达你要做的事情。这样编译器更容易优化,程序员犯错的概率也更低,代码也更简洁。”
他还提到范型编程:“类型通常是可以自动推导出来的,所以你总能得到正确的类型。”
另一个至关重要的点是资源管理。他说:“如果你用RTTI(运行时类型识别)来确保资源被正确释放,比如对象被销毁、文件被关闭等等,你需要有作用域来承载这些资源。所以,所有资源都应该由一个句柄(handle)来管理,句柄本身存在于作用域内。这样,绝大多数内存泄漏问题就不见了。”
现代C++开发者有哪些做法是千万不能做的?
“千万不要把裸指针当作资源句柄来用。”他说,“如果这么做,就完全违背了我刚刚说的原则。也绝不要用单个裸指针去传递一组元素,比如指针指向数组。你根本不知道数组里有多少个元素,也无法做合理的范围检查。但如果你传递的是vector,它自己就知道自己有多少元素、是什么类型。”
“另外,我几乎再也不用强制类型转换(cast)了。范型编程的好处就在这里。不用类型转换,类型错误的风险就大大降低。”
“以前要从函数里返回一大堆数据,通常做法是放到动态内存里,再把指针返回,然后还得记得手动delete。现在,直接把一个vector move出来就行,基本是零开销。”
在演讲中,Stroustrup还强调了模块(modules)。用import语句来代替传统的#include。因为#include是传递性的,顺序会影响编译结果,而且会导致重复编译和一些隐晦的bug。而import没有传递性,编译也能一次性完成,大大提高效率。
他特别提到的其他特性还包括模板(templates)和概念(concepts)(C++20强制支持的标准特性)。他PPT上的一句话是:“用概念其实比不用更简单。”他说,自己的生产环境代码也没有用什么比本次演讲里更复杂的特性,而且基本测试通过之后,已经很多年没有再遇到过资源泄漏。
如何强制团队写出符合现代C++风格的代码呢?
Stroustrup承认这是个难题:“在大型代码库里,光靠手册式的编码规范根本行不通。我们需要工具支持。所以我正在做一套‘profiles’,可以根据设定好的规范来强制检查。”
不过他也直言,这个机制目前还没有被C++标准采纳,短期内也不太可能:“很遗憾,标准委员会这件事上有点迷糊,没能保证C++26里会加入。”
现在开发者可以用Clang-Tidy之类的工具来辅助检查。“它已经实现了我称之为‘C++核心指南(C++ Core Guidelines)’的一部分检查功能,这是我跟Red Hat、微软等公司联合做的项目。”
他是否担心AI对C++开发的影响?
“是的,我确实很担心。不是说AI没用,但它往往会把大家引导到以前人们常用但其实不好的做法上。更糟糕的是,我担心人们会因此失去主动发现问题的能力,因为大家都习惯于让AI帮你搞定。”
像谷歌Carbon这样的新语言,会取代C++吗?
他说:“如果你只针对一个小场景,要做出比C++更好的语言其实很容易。但C++的优势就在于它能同时适用于非常多样化的领域。再说了,就算这些语言成功了,它们也必须跟C++、Python这些语言互操作。如果我们不小心,最后可能不是一个‘过于庞大的C++’,而是‘十个都不完整、还互相勉强兼容的小语言’。”
C++演进是不是太慢了?
“你判断是不是节奏合适的方法就是,看是不是有一半人觉得太慢,一半人又说太快。”Stroustrup笑说,“是的,我确实希望比标准委员会稍微快点。但标准委员会太庞大了,大家关注的点太多,这会拖慢节奏……不过,我估计更多C++程序员其实是觉得‘太快了’。”
不同C++编译器实现标准的细节差异,会不会给开发者带来麻烦?
“是的,但你要知道,每个主流编译器,甚至每个非主流的嵌入式编译器,用户数量可能都比大多数语言多。而且,我很讨厌‘单一生态(monoculture)’。如果历史告诉我们什么,那就是一旦出现单一生态,一个bug或一个毒点,整个生态就完了。”
他说,虽然主流C++编译器彼此实现不完全一致,但它们彼此之间差距其实已经越来越小了。“如果只有一个实现,当然有些好处,但那就是单一生态。而多个实现就能带来竞争空间,也有利于创新。它们不可能完全一致——事实上,至今没有任何一个C编译器是100%标准兼容的,从来没有过。”
参考链接:https://devclass.com/2025/05/09/interview-bjarne-stroustrup-on-21st-century-c-ai-risks-and-why-the-language-is-hard-to-replace/