Matt Godbolt: The art, science, and history of processor design (2024-04-10, glm-4.7-flash)
1. 导读
在本期深度访谈中,编译器探索器的创造者 Matt Godbolt 并没有像大众认知的那样,重点讨论如何用 C++ 写出更好的代码,而是 presented了一场关于人类如何通过不断加砌“抽象的砖墙”来对抗物理极限的历史演进回顾。为什么这期节目值得你哪怕只花20分钟去听?因为 Matt 提出了一个令人脊背发凉的论断:随着处理器复杂度的指数级上升,现代程序员正在经历一场“认知的失明”。我们被动地接受了从乱序执行到分支预测的各种魔法优化,却遗忘了硬件曾经是如此直白。嘉宾不仅是写过汇编的极客,更是一个在金融高频交易(HFT)前线摸爬滚打过的实战派,这种独特的“双重视角”揭示了当今科技界一个巨大的矛盾——我们为了速度付出了多少非确定性的代价?这场对话不仅关乎如何从汇编层面榨取每一纳秒的性能,更是在探讨在神秘莫测的现代硅基智能面前,工程师究竟该如何保持对底层的体悯与掌控。紧接着 Matt 会提到他创造 Godbolt 工具的初衷,即当你亲身经历过 C++ 编译器的各种隐晦优化后,你就再也无法回过头去信任那些黑盒了。
2. 核心观点
Matt Godbolt 的核心世界观可以概括为:在这个复杂度无限膨胀的数字世界里,“绝对理解“之所以稀缺且昂贵,正在于我们必须主动打破每一个层级之上的抽象锁链,去过问“下面那一层“到底发生了什么。 这种观点极具争议,因为它直接挑战了现代软件工程的主流教条——即我们应当完全信任抽象层,因为底层实现细节应当对开发者在乎的吗?
关键判断一:越接近物理层的原子操作,其确定性价值越高
- 断言:在最底层的硬件层面,解决根本问题的方式是极其直白且机械的(罗列、条件判断、流水线),这种“愚钝”的实体确定性,是解决非确定性软件逻辑的唯一保障。
- 逻辑:从 6502 处理器的“旋转”指令隐约藏着的未定义行为,到神户交错的显存带宽分配,再到模拟器还原现实,所有高效能的开端都源于对硬件物理限制的敬畏。现代处理器为了某种统计上的吞吐率,引入了乱序执行和 speculative execution(推测执行),这本质上是让硬件去“赌博”,而这不仅是性能的来源,也是错误和安全漏洞(如侧信道攻击)的温床。
- 背书:嘉宾讲述了在 BBC Micro 上通过手写汇编构建防破解机制的故事,这群孩子没有 FPGA 硬件,他们直接与电路握手,这种确凿无误的控制权让他印象深刻;他在金融界转向 HFT 的原因也正是为了找回这种在“确定性边界”内操作的感觉。
关键判断二:金融高频交易是现代计算机科学中最硬核的“炼金术”
- 断言:HFT(High-Frequency Trading)不仅是生意,它是目前唯一一个强制要求开发者掌握每一时钟周期循环周期的特殊行业,它在极端压力下验证了底层优化的真实边界。
- 逻辑:在金融领域,当软件优化到极致时,CPU 的瓶颈不再是代码写的有多烂,而是内存控制器、内核调度甚至 GCC 编译器的开关设置。在这个领域,硬件是不透明的、敌对的、甚至是不可信的(如 Spectre/Meltdown 攻击),必须像黑客一样反向工程硬件行为才能生存。
- 背书:Matt 描述了如何在他任职的交易公司使用 C++11 的
range-for循环与保守派争论,并通过制作一个 watching 命令行工具实时对比汇编差异来赢得辩论;他随后提到,一旦进入真正的高级交易,单纯依赖编译器已经不够,必须绕开内核、使用 FPGA 甚至定制的 “Tyera” 芯片(由 64 个 32-bit RISC 核心组成的网格),手动构建每一条数据包的处理流水线。
关键判断三:编译器的黑盒化导致工程素养的退化
- 断言:现代编译器和性能分析工具(如 VTune)虽然强大,但它们构建了一道心理防线,阻止了开发者理解“代码是如何变成电信号的”。
- 逻辑:早年间,左手敲素数逻辑,右手列热力图,程序员知道每一个寄存器的切换。而现在,高性能代码写得像是一团不可读的魔术,你完全不知道 CPU 需要走走停停等待缓存。Matt 提出怀疑:当我们不再需要理解底层逻辑,我们是否在集体失去“如何编写高效软件”的记忆?Godbolt 工具的横空出世,就是要打破这道围墙,让汇编代码重新成为所有高级语言的“公共语言”。
- 背书:Godbolt 的发展历程本身就是这番逻辑的注脚——从一个简单的命令行脚本演变成托管了 3500 多个编译器、运行数 PB 级编译结果的宇宙级公共服务,其用户基础正是那些不信邪、坚持要看底层数据的开发者汇聚而成的。
关键判断四:抽象并非万能,它是受害者,而非设计初衷
- 断言:硬件性能的提升迫使软件不得不使用极其复杂的抽象;虽然这些抽象(如 HDL、高级语言)让开发更快,但它们本质上是在与硬件的物理特性做斗争,结果往往导致性能惩罚。
- 逻辑:在游戏开发早期,程序员可以精心设计指令以匹配处理器的 pipeline(如 Dreamcast 的 SH4 处理器);而现在,编译器接管了这一切。Matt 认为,像 Itanium 这样的 VLIW 处理器失败,是因为它试图在软件层面强行对齐硬件,但事实证明,硬件层面的 speculative(推测)和 aggressive(激进)优化在效率上远超笨拙的软件预判。
- 背书:他在讨论处理器架构时提到 Intel Pentium Pro 引入的 out-of-order execution(乱序执行),虽然让编程变成了“望天收”,但确实带来了数量级的性能飞跃。即便如此,这种复杂性带来了新的灾难——新硬件架构的调试极其困难,连最顶尖的 HFT 公司在面对寄存器重命名和分支预测这样的黑魔法时,也只能 rely on prediction rules(依赖预测规则)而非绝对确定性。
内在逻辑链:这三点观点共同构成了一个“回归底层的螺旋上升”曲线。从 40 年前的 6502 硬件直白性(高确定性、低性能),到图灵完备时代的软件抽象(低确定性、高性能),再到现代处理器为对抗抽象引入的硬件级推测(恢复一定程度的确定性/效率)。Matt 的立场是:无论上层多么精彩,只要我们不再关心直接的下层(硬件),我们就不再是真正的硬件工程师,甚至可能沦为被硅片控制的“软件者”。
3. 批判与质疑
尽管 Matt 的视角极具洞见,但我们必须审视其论述体系中可能存在的“幸存者偏差”与“技术贵族化”倾向。
首先,“必须理解硬件底层”这种主张严重依赖“谁在听”这个前提。对于 Matt 这样的硬核内核工程师或 HFT 创始人,这是真理;但对于生产环境中的 90% 的现代软件工程师(如电商后端、Web 前端、企业级应用),这种知识的边际收益极低,甚至可能影响开发效率。如果他断言“不懂汇编的工程师不是工程师”,这完全是错误的技术决定论,忽视了规模化软件工程对依赖于一致性而非性能的理论保证的需求。我们将泰勒主义引入编程流水线,本意就是为了让人忘掉具体的锤子重几斤,只管“拧螺丝”。
其次,对现代硬件复杂性的批评显得既怀旧又天真。Matt 极力怀念 80 年代硬件“手册写在膝盖上”的时代,但他忽略了那个时代的生产力上限是极低的(比如编译一个 C++ 程序需要 20 分钟)。现代处理器之所以变成“砖块”,是因为数以亿计的晶体管必须被调度来对抗内存墙和功耗墙,这是一种物理上的无奈妥协,而非单纯的商业阴谋。质疑点在于,他是否在美化一个并不存在的“黄金时代”?在那个时代,同样存在 CISC/RISC 的争论和软件工程难题,只是硬件相对简单,变成了拷问机器的“玩具”,而非通向商业成功的“工具”。
此外,他在谈论 HFT 时,几乎完全隐去了该领域的伦理风险与数据垄断性质。他将这种对硬件底层的极致追逐描述为一种纯粹的技术狂欢和“回归童年乐趣”,却轻描淡写了这种算法在现实世界中造成的市场操纵、信息优势不对等甚至“掠夺性竞价”带来的社会危害。当他说“全世界都在使用同样的交换协议、同样的光纤”时,他掩盖了这种竞争纯粹依赖资本实力购买算力,而技术能力本身其实只是微不足道的最后一公里优化。
最后,对话结束时悬而未决的核心问题是“未来的归宿”。如果 AI 和现代编译器进一步接管了对指令流、为寄存器和为执行单元的调度,Matt 预言的“理解直接下层”的目标是否终将面临不可逾越的黑盒?当后端语言能自动生成最优汇编,硬件能根据数据流动态重构电路,那么人类仅仅是作为“目的论”的观察者存在,工程师作为“who makes it happen(亲手制作它)”的主体性将彻底消亡。Matt 的反驳似乎已囊中羞涩:我们只能尽量多退两步,去理解“为什么硬件这么设计”,却无法再“亲手设计”它。
4. 行业视野
这场对话是现代计算发展史的一个微观切片,它印证了计算领域从“人适应硬件”到“硬件适应抽象”,再到当前“硬件与软件景观重构”的演变轨迹。
技术史的坐标:Matt 的经历完美映射了 1980 年代“个人计算革命”向 2000 年代“数据与算法革命”的过渡。BBC Micro 和 6502 是那个时代的象征——人类可以用 10 岁的智力撬动硬件逻辑;而随后进入的 HFT 和 WebGL 渲染时代,则是算力过剩的产物,标志着软件不再仅仅是逻辑的表达,而是成为了对硬件寄生性的挖掘。Godbolt 工具本身就是这一历史的见证者:它是一个服务于游戏程序员和硬件极客的方言本位工具,在如今这个万物皆 API 的世界里,显得既复古又前卫。
挑战的共识:Matt 的担忧呼应了近年来科技界对“软件定义硬件”的反思。以 Arm 为代表的指令集设计、FPGA 在边缘计算的崛起,以及 Intel 在放弃 Itanium 后转向 XPU(AI处理单元)的战略,都在说明一个趋势:单纯的软件文本无法再应对未来的算力需求,未来的架构必须像 AI 模型一样,通过数据驱动对自己进行“进化”和“重塑”。这正是他所在的量化交易公司正在做的事——通过 FPGA 和定制芯片,将软件算法“固化”为专用电路。这标志着行业正从 Moore 定律的延续(单纯缩小晶体管),转向 Dennard 缩放和 power wall 后的新路径(架构创新)。
值得警惕的历史回响:Matt 提到的 BCIC Micro 的故事让人联想到早期“黑客文化”的黄金时代——大家拥有完全相同的机器,因为没有云端,没有容器,不存在“在我的机器上能跑”的问题。这不仅是技术的倒退,更是社区凝聚力的丧失。如今我们看到 Docker 内核逃逸、WSL2 具象化卡顿等新问题,某种程度上正是现代抽象层级过多、硬件层离开发者太远导致的“内爆”。
5. 启示与建议
这场对话挑战了我们对于“专业技能”的传统假设:在计算工具日益强大的今天,深度内功不再是可有可无的锦上添花,而是区分平庸工程师与真正构建者的分水岭。
受影响群体:
- 低延迟交易员 / 网络协议工程师 / 游戏引擎开发者:这些人是 Matt 的“嫡系信徒”。对他们而言,每一个 NVMe 写入、每一个扩展指令的延迟,直接关系到利润或帧率。
- 编译器与语言工具作者 / 高性能架构师:他们需要从 Matt 的职业生涯中汲取灵感,构建能帮助开发者窥探性能黑洞的工具。
- 硬核全栈开发者:无论你写 Python 还是 Node.js,你需要保有一个 Toolchain(工具链),随时愿意潜入 C/C++ 或 Rust 的汇编层面去解决不可解释的 Bug。
具体建议:
- 针对低延迟开发者:不要只看 CPU 的频率参数。在构建仿真环境时,务必引入真实的 CPU 性能手册(如 Agner Fog 的手册),并刻意练习针对特定指令集的流水线微优化,即使是在高级语言中,也要掌握 SIMD 的语义(如 SVE)。
- 针对主流工程师:将 Godbolt 或类似工具(如 Compiler Explorer)作为你的浏览器默认页或开发插件。不要盲目相信
release模式下的性能赞美。当你看到一个简单的to_string被编译成冗长的流水线时,你才会真正读懂代码的物理代价。 - 针对决策者:如果你的决策逻辑涉及 AI 推理或数据分析,请记住 Matt 的提醒——现代架构(如 NPU)充满了针对特定数据模式的假设。在迁移到新架构前,必须进行端到端的混淆测试,而不是仅看吞吐量指标。
信号识别:
- 强信号:Matt 甚至不惜通过越狱调试甚至自己仿真 6502 来理解“未定义行为”,这种对物理事实的执着是识别优秀硬件工程师的关键特征。
- 合理推断/稍作折扣:他认为现代工程师都应该手写汇编建议可以打折扣,这在工业界不具备普适性;但“理解你代码去往何方”的哲学原则是放之四海而皆准的。
6. 金句摘录
“Abstractions are a tool… Abstractions are meant to create boundaries for machines not for people… You should always be aware of the lower the layer below you and a couple of layers above you.” 语境:Matt 引用了同事 Tom Lion 的话,强调了抽象是为了隔离机器的各种实现细节(让机器别烦我),而不是为了隔离人类对世界的认知。如果你想真正掌控代码,就不能活在七层抽象的高塔里。
“I knew that the stuff was written either in assembly or basic… and the Spectrum didn’t have an assembler… I managed to find someone who had an assembler.” 语境:回忆少年时期为了制作游戏写汇编的经历,那种因为没有工具而不得不“找 compiler”的原始开发者体验,是现代工程师极其缺乏的早期实战训练。
“Whether it was a ‘deterministic’ problem… I desoldered the chips off of the board… and I found a series of directives… 255 times.” 语境:讲述破解早期游戏保护机制的往事,展现了编写高性能代码不仅仅是堆砌指令,更是对硬件行为进行数学般的博弈和穷尽的可能性探索。
“This was the first time that they were starting to do proper out of order execution and so we had them come into us and say Hey you know this silly un-vpipe nonsense… forget it”. 语境:描述从游戏行业的显式指令级并行(ILP)转向 CPU 原生侧(SMP)的暴力乱序执行时的震撼,宣告了人类对指令流的控制权在大幅让渡给硬件魔法。