张大妈

GCC 本身是 C++ 写的,Linus 却把 C++ 挡在kernel门外:这轮吵翻的语言之争,他算的是三笔账

源自156位全网作者

18:46

这两天,知乎上一个老问题突然被顶上来好几条新回答——为何 GCC 转向 C++ 后,Linus Torvalds 不复 Git 当年旧事,用 C 写一个编译器? 提问的逻辑很直接:GCC、Clang 这些编译器自己都是 C++ 写的,跑得好好的;而 Linus 二十多年如一日把 C++ 挡在 kernel 门外——今年四月,有人试探着把 C++ 往内核里带,换来他一句「我还没死」。 五月流传的剪辑视频,标题还是那句老台词「C++ 真是一门相当糟糕的语言」。 既然你如此看不上 C++,为什么不干脆像 2005 年那样掀桌子——当年 BitKeeper 授权被收回,他十几天用 C 写出了 Git。怎么轮到编译器,就肯用「别人的 C++ 编译器」编自己的 C 内核了?知乎微博微博

这个问题底下,本周两条新回答把讨论撕出了质量。一条的观点是:他当年是没得选——Linux 社区违反协议、授权被收回,没有靠谱的东西了,才自己写了 Git;而 GCC 改用 C++ 没有任何缺陷,反而全是优点,没什么必要再造一个。 另一条说得更狠:Linus 不是只会用纯 C,他攻击的一直是写不明白代码、还看不明白人话的队友;C++ 不上不下的标准库和天马行空的范式,没法把那群人圈起来,让他的 review 心力交瘁。 把这两条放回时间线里看,会发现这场吵了三十年的语言战争里,Linus 真正在算的从来是三笔账,而不是站队哪个语言。知乎知乎

第一笔账:Git 和编译器,根本不在同一个成本量级上

2005 年那场危机里,问题是「没人给我一个能用的版本管理工具」——空白是真实的,替代方案不存在,失败的成本可控:Git 写砸了,内核开发退回手工补丁邮件也活了几十年。所以他敢花十几天,拿最顺手的 C 造一个出来。

编译器是镜像问题。GCC 把代码库从 C 换成 C++ 已经是十几年前的事,之后要求构建它的 C++ 标准一年年往上爬;Clang 从 2007 年立项第一天就是 C++ 项目。这个「内部语言」对内核贡献者是不可见的:你用 GCC 还是 Clang 编内核,产物里没有一个字节因为编译器内部用什么语言写而不同。换句话说,「C++ 编译器」从来没有强迫「内核用 C++ 写」这两件事发生任何关系。

Linus 本人对「编译器是看不见的基建」这件事,给过一句很妙的吐槽——六月那段刷屏的视频里他说,99% 的代码要是 AI 写的,那 100% 就是编译器写的,怎么没人吹编译器? 在他眼里,编译器就是藏在底下干活的基建。基建自己用什么语言盖,取决于盖基建的人的效率;上层工程用什么语言,取决于审代码的人的效率。拿「GCC 用了 C++」来推导「Linus 双标」,是把两层楼看成了一层。哔哩哔哩

第二笔账:他攻击的从来不是语言,是 review 的瓶颈

内核每年几千名贡献者、上万名活跃开发者往同一个代码库里塞补丁,Linus 的岗位是这条流水线上最后一个闸口。C 的「简陋」在这个场景里是特性:代码说什么就是什么,没有隐式类型转换、没有模板展开、没有构造函数在你看不见的地方偷偷申请资源,也没有 RAII 和移动语义把「这段代码实际做了什么」变成一道阅读理解题。

C++ 的问题不是性能,恰恰相反,它给 GCC/Clang 这种代码量百万行、作者稳定、接口收敛的项目提供了组织复杂性的武器。但对内核这种「代码量巨大、作者极度分散、任何补丁都要过人眼」的项目,C++ 的复杂度会藏进 review 看不见的角落——他挡的是这个,不是语言本身。这就是为什么高票回答那句「C++ 没法把那群人圈起来」比「C++ 性能差」的争论更接近真相:他的标准从来是『人的审查扛不扛得住』,不是『语言现不现代』。

第三笔账:收 Rust 进内核,正好证明他不是 C 原教旨主义者

如果是「我只会 C,别的都防」,那 2021 年他给内核 Rust 实验开绿灯、2022 年 Rust 支持随 6.1 合入主线就无法解释了。而且今年十月,这个趋势还在加速:Linux 7.4 的合并窗口已经开启,Rust for Linux 负责人向内核主线提交了本轮 Rust 代码拉取请求,规模约 1.7 万行,是近期 Rust 内核支持中体量较大的一次更新。 核心变化来自 Zerocopy 库——这个负责原始字节与结构化类型之间安全转换的库,在 7.4 里一次性向前推进了八个版本,内核 Rust 代码还将新增 mem、ratelimit 模块,此前微软等厂商已多次为 Linux 7.4 贡献驱动代码。网易

区别就在第二笔账上:Rust 的很多坑是编译器替你堵死的——借用检查不过,代码根本编译不出来,错误暴露在作者自己的机器上,而不是暴露在 maintainer 的 review 邮件列表里。C++ 的 UB 恰恰相反,写得越「聪明」,藏得越深。同一种「新语言」,一个把复杂度前置到编译期,一个把复杂度后置到 review 现场——Linus 对两者的态度差异,就是这把尺子量出来的。他九月还有条被搬运回 B 站的视频,专门解释 C 和 Rust 的关系,口径和这条线完全一致。哔哩哔哩

四类人,各拿各的东西

  • 写内核模块/驱动的:没得吵。对外 API 是 C ABI,内核树内就是 C(加上一点点被圈在特定区域的 Rust)。想在内核构建里夹带 C++ 用户态工具,今年四月那句「我还没死」就是答案。

  • 学操作系统/嵌入式的:别把 Linus 的台词当语言选型指南。九月微博评论区还在吵「他自诩不用 C++,却反对 RTLinux 的技术路线进内核,这算不算双标」。 典型的误读就是没分清「他反对 C++ 进内核」和「C++ 不行」。Qt、游戏引擎、高频交易、编译器本身都在用 C++ 好好跑。微博

  • 正在选第一门语言的:这条争论对你的决策权重约等于零。编译器用什么语言写不改变你该学什么——看目标领域,不看大佬偏好。

  • 看热闹的:下次再刷到「Linus 怒喷」的剪辑,先分辨他在喷工程约束还是在站队语言。他喷的从来是前者。

接下来值得盯什么

今年夏天,GCC 在自家贡献治理上也划了一条红线:AI 生成的关键代码贡献,禁止合入。 十月,内核又往 Rust 那头推进了 1.7 万行。Rust 什么时候碰核心子系统、C++ 什么时候再往门口挪一步,才是 Linus 这套「review 扛不扛得住」逻辑真正的下一次压力测试。语言战争每年都要复燃一次,但看懂这三笔账的人,看的是成本结构,不是段子。36氪

内容由AI生成
0
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章