Bun 创始人 Jarred Sumner 公布,团队借助 Claude 等编码代理,把 Bun 的核心实现从 Zig 迁移到了 Rust。新代码不是先给 Bun 官方版本用,而是先塞进了 Anthropic 自己的 Claude Code:从 v2.1.181(6 月 17 日发布)开始,Claude Code 内置的 Bun 运行时就已经换成 Rust 版本,到现在跑了将近一个月。

用户能感觉到的变化很小,Linux 上启动速度快了约 10%,其余几乎没人注意。这次重写真正值得记的,不是"Rust 赢了 Zig",而是前沿模型加测试套件,把一次动辄百万行代码的重写,变成了可以监控、可以验证的工程活。

Bun 换了引擎,但换血现场在 Claude Code 里

这篇博客 Sumner 从 5 月 9 日就在 X 上开始预告,拖了两个月才写完,拖的时间比重写本身还长。

需要先说清楚范围。Claude Code 是 Anthropic 自家的编码代理工具,内部用 Bun 当 JS 运行时。这次曝光的 Rust 版本,先随 Claude Code 一起上线,不是 Bun 面向所有开发者的独立发行版首发。

时间/版本事件
5 月 9 日Sumner 在 X 上首次预告这篇博客
6 月 17 日Claude Code v2.1.181 发布,首次内置 Rust 版 Bun
发布至今Rust 版 Bun 在 Claude Code 里跑了近一个月

换句话说,普通 Bun 用户目前用到的还是 Zig 版本。Rust 版本目前只在 Anthropic 自己的产品里跑了一个月实战,没有独立开源发布的时间表。

为什么换语言:一份内存bug清单,不是信仰争论

Sumner 没有把这次重写包装成语言之争。他先谢了 Zig,说 Bun 能走到今天全靠 Zig,这句感谢不是客套话。

真正的导火索是 bug 清单。里面一大批是 use-after-free、double-free,以及错误处理路径里忘记释放内存。这类问题在 Zig 里只能靠手动检查,出错常常是运行时才炸。

换到 safe Rust 之后,这些问题不少直接变成编译期报错,配合 Drop 的自动清理机制,一部分排查工作提前挪到了编译阶段。

内存bug:从运行时排查到编译期拦截 Zig(手动内存) use-after-free double-free 错误路径忘记释放 问题多在运行时暴露 Rust(safe + Drop) 编译器直接报错 Drop自动清理 部分bug类型直接消失 问题提前到编译阶段

凭什么信这百万行代码:测试套件加人工监控

能撑住这次自动化迁移的前提,是 Bun 的测试套件本来就用 TypeScript 写。这让它天然成了一套语言无关的 conformance suite,Rust 代码跑同一批断言,通过就说明行为对得上。这是编码代理能大规模生成代码的底气,不是模型突然变聪明了。

团队用了至少 11 天,人工盯着工作流输出,发现问题就去改生成代码的流程,而不是直接手改代码。加上对抗式代码评审,这套组合才让团队敢合并一份加了 100 多万行的 PR。

Joel Spolsky 在 2000 年那篇《Things You Should Never Do, Part I》里说得很硬:永远不要从零重写大型软件。这次案例没有推翻这个判断,只是把重写的风险从"不可控"降到"可控",没有降到零。

别急着抄:16.5万美元账单和三道门槛

合并前,整个迁移消耗了 59 亿未缓存输入 tokens、6.9 亿输出 tokens,以及 720 亿次缓存输入读取,按 API 定价估算约 16.5 万美元。这是外部 API 计费口径下的估算,Anthropic 内部用自家模型,并不等于真的付出了这笔现金。

重写前的Token账单(API定价估算) 59亿 未缓存输入tokens 6.9亿 输出tokens 720亿 缓存输入读取 ≈16.5万美元 按API定价估算,非实际现金支出

这笔投入背后,还有三个不太好复制的条件:Anthropic 对模型的直接访问权限,一套已经跑了多年的语言无关测试套件,以及有人持续盯着输出的人工评审。少一个,普通团队都很难建立起同样的信心。

对象现在该怎么做
评估要不要上编码代理的工程负责人先确认自己有没有类似语言无关的测试套件,没有就别急着让代理做百万行级重写
关注 Bun/Rust/Zig 技术选型的开发者先观望,等 Rust 版本给普通用户发布、后续 bug 清单数据公开后再决定要不要跟着迁移

接下来该盯的是两件事:Rust 版 Bun 会不会开源给普通用户,以及跑够几个月之后,bug 清单是不是真的比 Zig 时代短。这两个数字出来之前,现在的信心还只建立在 Anthropic 自己的一个月观察窗口上。