C++两大派系之争源码服务器代码库编译器电子邮件

C++,这门承载了数十年辉煌历史的编程语言,曾是系统软件、游戏开发和数据库系统等关键应用的基石。然而,伴随着对更高安全性和效率的需求,C++的未来正面临愈发明显的分裂。近日,软件工程师Mond发布的《TheTwoFactionsofC++》一文引发了热烈讨论,他详细剖析了这门语言当前的困境:一方面是现代技术企业对更高性能和工具链的渴望,另一方面则是庞大的遗留代码库对向后兼容性的刚性要求。与此同时,C++标准委员会试图在不破坏现有代码的前提下引入新特性,这种努力能否弥合分歧,仍是悬而未决的问题。

作者|Mond翻译|屠敏

出品|CSDN(ID:CSDNnews)

C++的现状

当前,我们所使用的C++似乎正处于以下局面:

1.C++的演进工作组(EWG)刚刚就采纳P3466R0达成共识——即,(重新)确认未来C++演进的设计原则:

这无论这是好是坏,都表明C++的发展方向在进一步巩固当前的轨迹。

2.与此同时,一方面,美国政府希望人们停止使用C++:

截至目前,美国政府的各个部门已经发布了文件、报告和建议,警告行业不要使用内存不安全的语言。

3.各种大型科技公司正在采用Rust:

说到大型科技公司,近期还有几件事值得注意:

4.社区中的问题:

我不知道你怎么看,但如果我作为一个外行人来看待这一切,C++似乎基本上已经分崩离析了,而且似乎很多人已经对C++委员会能够处理这些问题的能力失去了信心。

C++的两大派系

人们似乎正在寻找其他解决方案。

比如说Google。自从ABI投票以来,Google显然对“这一标准化流程”失去了信心。这种失望并非针对C++语言本身——Google自己拥有庞大的C++代码库,这门语言对他们来说一直表现出色。然而,他们对C++在多方压力(如潜在的政府监管、其他语言的竞争、大厂对更高性能和安全保障的需求等)下继续演进的能力失去了信心。

那么问题出现在哪里?为什么C++不能做出改变呢?

答案其实很简单。我们可以参考HerbSutter在其关于配置文件的论文中所说的话:

“我们必须尽量减少对现有代码的修改需求。根据几十年的经验,对于拥有大型代码库的大多数客户来说,即便是为了安全原因,也不会因为严格性规则而修改哪怕1%的代码,除非有法规要求强制执行。”

——HerbSutter

这很合理,不是吗?没人对此感到惊讶。

现在,对比一下Google工程师ChandlerCarruth在WG21成员页面上的简介:

“我主导了基于Clang的C++工具和自动化重构系统的设计,这些工具现在已成为Clang项目的一部分……

在Google内部,我带领团队将这些基于Clang的自动化重构工具扩展到整个代码库,超过1亿行C++代码。我们可以在20分钟内对整个代码库进行分析并应用重构。”

看到了吗?这里ChandlerCarruth提到了一个关键词是“自动化工具”。但不只是自动化迁移工具,这只是最显眼的例子。

两种C++用户阵营的对立

实际上,我们看到的是两种完全不同的C++用户阵营之间的冲突:

这两种用户之间的关键区别在于:前者能够相对顺利地应对迁移,因为他们能从版本化源码构建整个C++栈,而后者则仍在使用1998年的老旧库。

这种能力——从版本化源码构建整个依赖栈(最好还带有自动化测试)——是两大阵营之间最重要的分水岭。

当然,在实践中,这是一个渐进的过程。我可以想象,要把大公司的代码库从可怕的泥球变成半可管理、可构建、经过代码检查、适当版本化、稍微不那么可怕的泥球,必须流下多少汗水、泪水、账单和心血。

事后看来,很容易认为这一切都是不可避免的:像Google这样的公司(使用相对现代的C++,拥有自动化工具和测试,以及现代基础设施)的需求与强烈向后兼容的愿望之间存在明显的脱节。

大胆地说,单一、无方言且统一的C++的概念似乎已经死多年了。至少,我们有两种主流风格的C++:

你会注意到,这两种文化的分歧不在于C++语言本身,而是工具和是否能从版本化源码进行干净、有定义的构建。理想情况下,甚至能够在不需要记住以前开发者通常设置的那个标志或环境变量的情况下进行部署。

例如,Google的代码库是否完全采用“现代”C++习惯用法并不是重点。关键是工具是否到位,以及是否能够从源码构建。

很多人会说工具不是C++标准委员会的责任,这观点是对的。工具确实不是C++标准委员会的责任,因为C++标准委员会放弃了对它的责任(他们专注于语言规范,而非具体的实现)。这是设计使然,考虑到遗留负担很难去责怪他们。C++是一个统一不同实现的标准。

话虽如此,如果说Go语言有一件事做对了,那就是他们把工具放得很重要。相比之下,C++出生于一个比linter更古老的时代。C++没有统一的构建系统,也没有接近统一的包管理系统,语法复杂难以解析(这对工具来说很糟糕),且每次改动都在与Hyrum定律作斗争。

这两个派系(良好的工具,可以毫不费力地从源码构建vs.差劲的工具,无法从源码构建)之间存在着巨大的、不断扩大的裂痕,而且短期内看不到弥合的可能性。

C++委员会似乎坚决维护向后兼容性,无论代价如何。

顺便说一句,我并不一定反对这一点!向后兼容性对许多人来说非常重要,理由充分。然而,对另一些人而言,这并不重要。这不是谁“对”的问题,而是两种截然不同、无法调和的立场之间的冲突。

造成的后果

这就是为什么配置文件的设计是这样的:安全配置文件的目的并不是为了解决现代、技术娴熟的C++公司的需求。它们是为了在不需要对旧代码进行任何更改的情况下带来改进。

同样地,对于模块也是如此。设计初衷是让你“只需”以模块形式导入头文件,而不会引发任何向后兼容性问题。

毫无疑问,大家都喜欢那些可以直接引入并在不改动旧代码的情况下带来改进的功能。但很明显,这些功能的设计初衷是为了迎合“传统C++”的需求。任何需要从传统C++迁移的功能对C++标准委员会来说都是不可行的,因为正如HerbSutter所说,你基本上不能指望人们自己去迁移。

(再次强调,考虑传统C++的需求并不是坏事。这完全是一个合理的决策。)

这一点我始终牢记在心,每当我阅读C++提案时都会注意:C++其实有两个主要受众群体。一是现代C++用户,另一个是传统C++用户。这两个阵营对许多问题的看法大相径庭,且许多提案都是针对其中一个特定群体的需求而撰写的。

显然,这导致了许多人无法互相理解,话说不到一块:尽管许多人以为安全配置文件和safeC++是在解决同样的问题,实际上它们面向的是完全不同的受众,解决的是完全不同的问题。

C++委员会正试图阻止这种裂痕进一步扩大。这或许就是为什么SeanBaxter撰写的《SafeC++》对他们来说毫无意义的原因。这种提案是一种激进且全面的变革,可能会开创一种完全不同的C++编程方式。

当然,也有人提出另一个问题:是否某些C++标准委员会成员只是过于固执,抓住各种理由来阻止他们个人在审美上不认可的演进。

这是否属实,我不便评判,但关于C++标准委员会应用“双重标准”的说法并非首次听闻。比如“如果你想让这个提案被通过,我们要求你提供多个编译器的完整、可用的实现;但我们仍然愿意支持某些大项目(例如模块、配置文件),即便这些项目根本没有任何可用的概念验证实现。”

如果真是如此(我无法确证),我无法预测C++还能沿着这条道路走多久,除非最终发生更为剧烈的分裂。

更不用提,打破ABI兼容性可能引发的巨大麻烦和一系列问题,那简直就是个无底洞。

C++未来将何去何从?

面对现代企业和遗留系统给C++社区内部带来两极分化的趋势,不少网友看法不一。

来自Reddit的用户ravixp表示:

(想象一下试图对这样的代码添加静态分析支持:它同时包含了std::string、C风格字符串,以及20年前STL性能较差时团队自行创建的字符串类型的奇怪中间状态!)

关键在于,现代化的成本非常高昂。这里提到的“现代”C++不仅仅是用不同的方式编写代码,它还包括一整套支持现代化标准的工具体系,这可能需要从零开始构建,还需要一个能够跟上C++演进的工程团队。

需要牢记的是,这里的冲突并不是“喜欢遗留C++”的人与“喜欢现代C++”的人之间的矛盾,而是“能负担得起现代C++”的人与“负担不起”的人之间的矛盾。C++的确需要改变,但真正的问题是:我们集体能够承受多少变化的成本,以及如何从中获得最大的价值。

Kronikarz评价道:

从道德角度来看,我认为这反映了一种分歧:一部分人对C++逐渐变成下一个COBOL不以为意,另一部分人则对这一想法感到排斥。

另一位网友KittensInc则认为:

如果像缓冲区溢出这样的漏洞被认为是完全可以预防的,那么从逻辑上讲,如果某次黑客攻击、勒索软件事件或数据泄露的根本原因是缓冲区溢出,保险公司可能会拒绝赔付。这样一来,公司可能会要求软件供应商对其代码库进行第三方静态分析审计。

于是我们到达了这样一个节点:不进行现代化改造的成本变得过高。你要么升级你的代码库,要么你的公司走向灭亡。采用现代开发实践的企业只需运行一些简单的分析工具并完成一些文书工作,而那些没有任何像样工具并且背负着数十年技术债务的公司将陷入严重困境。

对此,你怎么看?

目前距离2024全球C++及系统软件技术大会召开仅剩6天,现在报名可享九折优惠,抓住最后1天优惠期,立即锁定席位!

THE END
1.互联网Java面试八股文汇总(2024最新整理,持续更新)最近也是一直有粉丝朋友私信我说,2025快到了,LZ 有没有一份内容全面,题目高频的面试题库,最近面试老挂,需要系统的梳理一下!我的内心:这我上哪儿整去啊!没办法好歹也是坐拥 5W 粉丝的小博主,粉丝就是我的上帝,于是各大渠道耗时114天为大家整理了一份 Java 全栈面试进阶宝典!希望对大家有所帮助! https://maimai.cn/article/detail?fid=1855247847&efid=VBsObuTWQYi3X1ciewGs9g
2.一周通过前端面试,2024最新前端八股文题库分享现在各行各业的大环境其实都一样,没有那么的好,但是计算机行业总体要比任何一行的环境要好一些,虽然总是加班,但工资也是非常可观的,前端算是计算机行业里入门比较简单的了,虽然往后走需要学的东西更杂更多,但是它也是零基础入门计算机比较快的一个板块了。 https://blog.csdn.net/qq_66118130/article/details/144142022
3.2024年面试必问的Web前端面试八股文及答案整理!纯干货超详细找朋友要了比较核心的一千多页前端八股文,3月背了一个月,面试了一些公司(包括三家还不错的公司)后面都没信,以为都挂了。 今天下午正在背八股,突然一通电话过来,说我面试通过了问我下周一能不能去报道。我二话不说就答应了,然后就给我发了offer过来,面试前不是在背八股文,就是在背八股文的路上啊 https://www.jianshu.com/p/ec135abe5dee
4.2024年11月24日随笔档案Ning0713摘要: 一、实验目的 知道什么是类模板,会正确定义和使用简单的类模板 会使用C++正确定义、使用派生类 加深对类的组合机制(has-a)、类的继承机制(is-a)的领悟和理解 练习标准库string, vector用法,能基于问题场景灵活使用 针对具体问题场景,练习运用面向对象思维进行设计,组合使用标准库和阅读全文 ?https://www.cnblogs.com/ning0713/p/archive/2024/11/24
5.C++相关八股14wx65950818d835e的技术博客C++相关八股-14 1.C++11中的auto是怎么实现自动识别类型的?模板是怎样实现转化成不同类型的? auto仅仅只是一个占位符,在编译期间它会被真正的类型替代,或者说C++中变量必须要有明确类型的,只是这个类型是由编译器自己推导出来的。函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式具体类型函数的模具,所以https://blog.51cto.com/u_16492348/12670283
6.C#文档Microsoft Learn Challenge Nov 23, 2024 – Jan 10, 2025 立即注册 消除警报 Learn 发现 产品文档 开发语言 主题 登录 C# 文档 开始使用 基础 C# 中的新增功能 教程 语言集成查询 (LINQ) 异步编程 C# 概念 操作指南 C# 文章 高级主题 .NET Compiler Platform SDK (Roslyn API) https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/
7.C++知识点面试题目总结(八股文).pdf发布时间:2024-01-09发布于河南 浏览人气:233 下载次数:仅上传者可见 收藏次数:0 需要金币:*** 金币(10金币=人民币1元) C++知识点面试题目总结(八股文).pdf 关闭预览 想预览更多内容,点击免费在线预览全文 免费在线预览全文 宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒。——《洪应明》 https://m.book118.com/html/2024/0107/8023120014006024.shtm
8.多益网络2024秋招游戏服务端开发面试楼主就对Java和Python熟悉一些,但是看的老哥春招面经以为会考C++相关的,就没怎么看Java的,结果踩了大坑.楼主是第一次面试,就纯当积累经验了(>﹏<)面试(45min)一.自我介绍 二.八股文1.Java多态的实现原理是怎么样的2.Java里面为什么不支持运算符的重载3.深拷贝和浅拷贝的区别4.什么情况下使用浅拷贝,什么情况下https://m.nowcoder.com/feed/main/detail/4b1fcdccf7654903a250eb0e78b4d747
9.MicrosoftVisualC++2015码农集市专业分享IT编程学习资源2024-11-19 14:34:52 积分:1 操作系统复习题.mp4 2024-11-19 13:53:56 积分:1 虚拟机械臂文件part1 2024-11-19 13:18:30 积分:1 嵌入式校招面试常用八股文 2024-11-19 12:06:20 积分:1 VMworkstation17+秘钥 2024-11-19 11:44:16 积分:1 日立https://www.coder100.com/index/index/content/id/1268403
10.暗黑百科全书CN[V1.0]上传者:Anrun123时间:2024-09-17 Dark Pixel UI v1.0 unity Dark Pixel UI v1.0 上传者:oBourne1时间:2023-09-30 暗黑风格-C++八股文-v1.0.pdf 暗黑风格-C++八股文-v1.0.pdf暗黑风格-C++八股文-v1.0.pdf暗黑风格-C++八股文-v1.0.pdf暗黑风格-C++八股文-v1.0.pdf暗黑风格-C++八股文-v1.0.pdf暗黑风格https://www.iteye.com/resource/shiju007-1731775
11.才华入组,分享码农求职资料javac++python测试教程面试八股来自: 柑橘甘菊 2024-06-06 10:34:49 已编辑 北京 求职路线: 大学上课是学不废的想找工作全靠自学,学会语言能自己写出点小项目以后就刷力扣,背八股,找实习,有实习经验再找工作就好找很多,码农现在卷了大厂还很看学历。。 java的,从入门到小型springboot项目 【超级会员V3】通过百度网盘分享的文件:java 链接:https://m.douban.com/group/topic/306948494/
12.SegmentFaultc++的问题 https://segmentfault.com/q/1010000045323111 2024-09-25T23:44:01+08:00 2024-09-25T23:44:01+08:00 年轻有为的小熊猫_ejItkh https://segmentfault.com/u/nianqingyouweidexiaoxiongmao_ejitkh 0 想入坑CPP游戏开发,有没有什么适合面试看的书,比如讲八股文讲的详细的,看完印象深刻,而且面试官那边https://segmentfault.com/feeds/tag/c%2B%2B
13.代码随想录知识星球精华├──代码随想录知识星球精华(最强八股文)第五版(C++篇).pdf 2.81M ├──代码随想录知识星球精华(最强八股文)第五版(Go篇).pdf 1.31M ├──代码随想录知识星球精华(最强八股文)第五版(Java篇).pdf 57.46M ├──代码随想录知识星球精华(最强八股文)第五版(概述).pdf 610.94kb https://985it.cn/15543/
14.包括但不限于C/C++GolangJavaScriptVue操作系统3、?校招八股文 3.1、编程语言 3.2、操作系统 3.3、计算机网络 3.4、数据库 3.5、智力题&情景题 4、数据结构与算法 4.1、算法基础 4.2、带你快速刷完67道剑指offer 4.3、精选力扣300+道算法题 4.4、面试高频算法真题 5、学习心得&总结 https://github.com/forthespada/InterviewGuide
15.代码随想录知识星球精华(第五版)最强八股文PDF下载C++篇:新增精选C++语试题 40+ 题,篇幅增加三分之?。 这份PDF总结了 代码随想录知识星球 的全部精华内容,覆盖了?乎程序员学习必备的内容,聚集了知识星球?录友们智慧的结晶。 ?家打开PDF的时候,看?录,就能感受到内容有多全了。 https://cmsblogs.cn/5039.html
16.重学C++引用一文看懂引用的本质与右值引用存在的意义总结一下C++中引用与指针的区别,常见面试八股文: 初始化和绑定: 引用:在声明时必须被初始化,并且一旦一个引用被绑定到一个对象,就不能再被重新绑定到另一个对象。 指针:可以未初始化,并且可以指向任何类型的对象,也可以重新指向另一个对象。 间接访问: https://developer.aliyun.com/article/1490480