11天、AI、100万行代码:当我亲眼看 Bun 用 Claude Fable 5 把自己的「心脏」换掉
引言:一条推文宣告一个时代的终结
2026年5月11日,Bun 创始人 Jarred Sumner 在 X 上发了一条推文:
"Bun v1.3.14 将于明日发布。如果我们将 Rust 重写版本合并,这将是 Zig 版本的最后一个版本。"
就这么一句话,没有长文预告,没有发布会,没有社区投票。
四年前,Bun 选择了 Zig 作为底层语言,在 JavaScript 运行时这个被 Node.js 统治了十几年的战场里,它成了最激进的异类——不用 V8,用 JavaScriptCore;不用 C++,用 Zig。一时间"Bun 要颠覆 Node.js"的声音此起彼伏。
四年后,同一个人,用一条推文宣告了 Zig 版本的死刑。而执行死刑的,是一个名为 Claude Fable 5 的 AI 模型。
2026年7月8日,Jarred Sumner 正式发布博文宣布:整个重写已完成,耗时11天,64个 Claude 实例并行运行,累计消耗 16.5 万美元,生成了超过 100 万行 Rust 代码。Bun v1.4.0(Canary 版本)随之发布,修复了 128 个 bug,性能提升约 2%~5%。
这不是一次普通的版本迭代。这是一个工程师用 AI 对抗自己亲手建立的技术债务的极限实验,也是 AI 编程史上一个值得被铭记的里程碑。
今天,我们就来深度拆解这个故事的每一个技术细节:从为什么 Zig 会成为问题,到 Claude Fable 5 到底做了什么,再到这次重写对整个 JavaScript 生态意味着什么。
一、背景:Bun 为什么要选 Zig,又为什么放弃了它
1.1 Zig 的承诺与现实
Bun 最初选择 Zig 并不是拍脑袋决定。在 2020 年左右,Zig 被视为系统编程领域的"下一件大事":
- 无隐藏控制流:没有隐式的内存分配,没有 defer 之外的魔法,所有代码的执行顺序都是显式的
- ** comptime**:编译期求值能力,让元编程无需宏系统
- C 互操作:直接内联 C 代码,无需 FFI 开销
- 零依赖哲学:最小化运行时依赖,避免 C++ 模板地狱
对于一个要做 JavaScript 运行时(需要手写大量底层代码:垃圾回收、字节码解释、HTTP 解析、文件系统 API)的项目来说,这些特性非常有吸引力。Jarred Sumner 在多次访谈中解释过他的逻辑:用 Zig 写的运行时,可以比 Node.js 更快、更小、更可维护。
然而,Zig 在 2020~2026 年间的发展,并没有完全兑现这些承诺。
1.2 Zig 的三大困境
困境一:编译器稳定性问题
Zig 的语言规范本身还在快速演进中。从 0.6 到 0.13,ABI 变化、语法调整、标准库重构——每一次 Zig 升级都可能让已有的代码出现编译错误。这意味着维护一个大型 Zig 项目(Bun 有 50 万行以上的 Zig 代码)的团队,实际上是在和编译器本身一起进化,稍有不慎就会引入兼容性问题。
困境二:内存安全的幽灵
这是压垮骆驼的最后一根稻草。Zig 的定位是"系统级编程",但它并不强制内存安全——Rust 的 borrow checker 在编译时就杜绝了 use-after-free、data race 等问题,而 Zig 依然允许你在运行时触发这些问题。Jarred Sumner 在博文中直言不讳:
"Zig 经常出现内存错误和崩溃,而且这些错误很难彻底修复。"
对于一个被 Anthropic 收购、深度嵌入 Claude Code 链路的产品来说,稳定性不是"加分项",而是"生死线"。
困境三:生态工具链的滞后
调试工具、性能分析工具、IDE 支持——Zig 的整个工具链生态远不如 Rust 成熟。当代码量达到百万行级别时,没有好的 profiling 工具、没有稳定的 LSP 支持、没有成熟的测试框架,会让维护成本急剧上升。
1.3 被收购带来的战略转变
2025年12月,Anthropic 收购了 Bun。这次收购的意义远超资本层面:Claude Code 的底层运行时,正是 Bun。当 Claude Code 的用户抱怨"内存占用暴涨、CLI 卡顿、偶发性崩溃"时,Anthropic 的工程师们发现,相当一部分问题最终都能追溯到 Bun 本身的内存泄漏。
于是出现了一个颇具荒诞感的循环:
Claude Code 被 Bun 的内存泄漏坑惨了
→ Anthropic 让 Claude 去重写 Bun
→ 重写后的 Bun 继续支撑 Claude Code
当资金不再是问题(Anthropic 买单),当目标足够清晰(修 bug、提性能、保稳定),Jarred Sumner 做了一个谁都没想到的决定——用 AI 来重写。
二、Claude Fable 5:这次重写的真正主角
2.1 Fable 5 是什么
Claude Fable 5 是 Anthropic 于 2026年6月9日发布的旗舰级大模型,是"Mythos"(神话)能力等级的"安全化落地版本"。
它的核心技术突破包括:
- Agent 原生架构:区别于普通 LLM,Fable 5 在训练阶段就针对长时间自主任务进行了优化,能够在数十步甚至数百步的复杂任务中保持上下文连贯性和目标一致性
- 超长代码生成能力:在 KernelBench-Mega 基准测试中实现了 18.7 倍加速,可一次性生成完整的复杂代码模块
- 超大规模并行:支持 64 个实例并行运行,每个实例可独立处理不同的代码模块
Fable 5 的出现,让"AI 生成百万行代码"从不可能变成了现实——不是幻觉,不是 Demo,而是真正通过测试套件的生产级代码。
2.2 Fable 5 的"手搓 CUDA"神话
Fable 5 的另一个令人瞠目结舌的能力是它的代码纯度和优化能力:
- 可一次性生成 63 个 3D 场景
- 仅用 1600 行代码 生成水下曼哈顿场景
- 40 分钟可将经典游戏原生编译到 iOS 设备
- 在 KernelBench-Mega(CUDA 内核基准测试)中达成 18.7 倍加速率
这意味着 Fable 5 不仅能写逻辑代码,还能写底层高性能代码。对于 Bun 重写这种涉及大量 unsafe 底层操作的工程任务,这个能力至关重要。
2.3 这次重写中 Fable 5 的工作模式
根据公开信息,Fable 5 在 Bun 重写中的工作模式大致如下:
第一阶段:架构分析(1天)
64 个 Claude 实例同时工作,每个实例负责分析 Bun 的一个子系统(GC、JS 引擎、网络 I/O、文件系统 API 等),生成详细的 Rust 迁移方案。
第二阶段:增量生成(8天)
每天约 12.5 万行 Rust 代码被生成。所有代码自动提交到独立的 rust-rewrite 分支,自动运行测试套件,失败的模块标记后重新生成。
第三阶段:集成测试(2天)
所有 Rust 模块合并,完整测试套件运行,记录通过率,优化 unsafe 代码块。
整个过程中,峰值时每分钟产出约 1300 行代码,总计提交约 6502 次。
三、技术深度:从 Zig 到 Rust 的迁移到底有多难
3.1 代码量的对比
| 指标 | Zig 版本 | Rust 版本 |
|---|---|---|
| 总行数 | ~53万行 | ~100万行 |
| 测试通过率 | 基准 | 99.8% |
| 二进制体积 | 基准 | 减小 3~8 MB |
| unsafe 代码块 | - | >13,000处 |
| 提交次数 | - | 6,502次 |
| 执行时间 | 基准 | 性能提升 2%~5% |
值得注意的是,Rust 版本的行数几乎是 Zig 版本的两倍。这并非因为 Rust 代码更冗余,而是因为:
- Rust 需要更多的类型标注(编译器强制)
- 错误处理(
Result/Option)比 Zig 的显式错误处理更显式 - 生命周期标注增加了代码行数,但提升了可维护性
- Fable 5 在生成时做了大量注释和文档字符串
3.2 unsafe 争议:Rust 也并非银弹
这里有一个值得警惕的细节:有开发者对比发现,原本 UV 项目(另一个 Rust 重写的代表性项目)仅有 73 处 unsafe 调用,而迁移后的 Bun Rust 版本却有 超过 13,000 处 unsafe 代码块。
这说明什么?
Rust 的内存安全保证,本质上是通过限制 unsafe 范围来实现的。当 unsafe 代码块数量过多时,系统的整体安全性会向 C/C++ 靠拢。13,000 处 unsafe 意味着 Fable 5 在生成代码时,可能过度追求"功能正确"而忽略了"最小化 unsafe"原则。
这是一个值得深思的工程权衡问题:AI 生成代码的正确性有测试保障,但代码的长期可维护性,依然取决于人类工程师的后续优化。
3.3 性能的真实情况
根据官方数据,Rust 版本在各个平台上均达到或超越了原有 Zig 版本的性能水平。Bun v1.4.0(Canary)修复了 128 个 bug,运行速度提高了约 2%~5%。
2%~5% 的提升看起来不大,但这是在以下背景下取得的:
- 新代码的行数是原代码的近两倍(更多类型检查理论上会有运行时开销)
- 测试优先级高于性能(没有为了极致性能而牺牲稳定性)
- 大量精力花在了修复"假阳性"的测试失败上(Fable 5 在翻译代码时,有时会因为实现细节不同而产生测试失败,即使功能是正确的)
对于一个 JavaScript 运行时来说,5% 的性能提升在实际工作负载中可能意味着 HTTP 请求延迟降低 5ms~20ms,对于高并发场景这是一个可观的数字。
3.4 为什么这么快:Fable 5 的 Agent 工作流
传统上,将 50 万行代码从一种语言迁移到另一种语言,是一个需要数月甚至数年的大工程。以 SQLite 的 Rust 重写(pgrust)为例,这是一个由 full-time 工程师团队花了超过一年时间完成的项目,目前也还在追赶 Postgres 的测试覆盖率。
Bun 的速度如此之快,核心原因在于 Fable 5 的 Agent 工作流设计:
# Fable 5 Agent 工作流伪代码
class BunRewriteAgent:
def __init__(self, submodules: List[str]):
self.submodules = submodules
self.instances = 64 # 并行实例数
self.results = {}
def rewrite_parallel(self):
# 步骤1:每个实例独立处理一个子系统
for module in self.submodules:
instance = ClaudeInstance(module)
instance.analyze_zig_code()
instance.generate_rust_equivalent()
instance.run_tests()
# 步骤2:失败的模块自动重试(最多3次)
for attempt in range(3):
failures = self.get_failed_tests()
if not failures:
break
for failed_module in failures:
instance = ClaudeInstance(failed_module)
instance.fix_and_retest()
# 步骤3:人工审查 unsafe 代码块
self.flag_unsafe_blocks()
# 等待人类工程师确认哪些 unsafe 可以优化
def merge_and_release(self):
# 所有子模块合并
# 完整测试套件运行
# 生成 release notes
# 发布 v1.4.0 canary
这个工作流的关键在于并行化 + 自动化测试 + 快速反馈。64 个 Claude 实例可以同时处理 64 个子系统,而不是像传统工程那样串行处理。测试套件作为"Oracle"(标准答案),确保生成的 Rust 代码在行为上与原 Zig 代码一致。
四、AI 重写代码的质量边界:这次实验告诉我们的
4.1 AI 能做什么
能做:语法和语义的结构化映射
当 Zig 和 Rust 在控制流、数据结构、错误处理上有明确的对应关系时(大多数情况),Fable 5 的翻译是准确的。测试套件验证了这一点——99.8% 的通过率说明 AI 生成的代码在行为上与原始代码一致。
能做:快速原型和模块化替换
Fable 5 特别擅长处理相对独立的模块——每个子系统之间的接口是清晰的,AI 只需关注单个模块内部的逻辑翻译,不需要理解整个系统的全局状态。这降低了 AI 处理复杂度的上限。
能做:规模化重复劳动
将 50 万行 Zig 代码逐行翻译成 Rust 是一个枯燥且重复的工作。AI 在这类任务上有着人类无法企及的速度和一致性——不会因为疲劳而出错,不会因为情绪而跳过边界情况。
4.2 AI 不能做什么(至少现在不能)
不能:理解架构决策的深层原因
Bun 的某些 Zig 代码包含"历史妥协"——有些实现方式不是因为最优,而是因为当时 Zig 的限制或开发时间的压力。AI 在翻译这些代码时,会忠实地复制这些妥协,而不是识别并改进它们。这是为什么 AI 生成的代码量几乎是原始代码两倍的原因之一——它保留了不必要的复杂性。
不能:独立判断 unsafe 的边界
13,000 处 unsafe 代码块是一个警示信号。AI 在翻译时,对于"这段代码在 Rust 中是否需要 unsafe",没有足够准确的判断能力——它更倾向于保守地使用 unsafe(确保功能正确),而不是冒险重构为安全的替代方案。这意味着后续的人工审查和优化是不可或缺的。
不能:完全消除 flaky 测试
Bun 原有测试套件中存在的 flaky 测试(有时通过、有时失败的测试),在 Rust 版本中依然存在。AI 没有能力从根本上解决测试设计问题,它只能被动地让代码适配现有的测试逻辑。
4.3 Jarred Sumner 的预言与现实
Jarred Sumner 曾在公开场合说过:"未来开源可能禁止人类提交代码。"
这句话在 Bun 重写实验之后,有了新的含义:如果 AI 可以在 11 天内生成 100 万行通过 99.8% 测试的代码,那么人类工程师的角色正在发生根本性转变——从"写代码的人"变成"审查代码的人",从"实现功能的人"变成"定义目标的人"。
但这次实验也告诉我们,这个未来并非一蹴而就。Fable 5 生成的那 13,000 个 unsafe 代码块,最终需要人类工程师逐个审查、评估、优化。AI 扩展了人类工程师的生产力边界,但没有消除人类判断的价值。
五、对 JavaScript 生态的影响:每个人都应该关心的变化
5.1 Bun 的定位变化
Bun 从一开始就不只是一个"更快的 Node.js 替代品"。Jarred Sumner 的愿景是"Bun = 运行时 + 打包器 + 测试运行器 + 包管理器",一个工具解决所有 JavaScript 开发需求。
这次重写之后,Bun 的定位更加清晰了:
- 企业级稳定性优先:不再追求"最快",而是追求"最可靠"
- 与 Claude 深度绑定:作为 Claude Code 的默认运行时,Bun 的稳定性直接影响 Claude Code 的用户体验
- 生态扩展:Rust 的成熟工具链(cargo、crates.io、rust-analyzer)将为 Bun 带来更好的调试和开发体验
5.2 对 Node.js 和 Deno 的竞争格局影响
| 特性 | Node.js | Deno 2.x | Bun 1.4 |
|---|---|---|---|
| 底层引擎 | V8 | V8 | JavaScriptCore → Rust |
| 包管理器 | npm | 内置 | 内置 |
| TypeScript | 需转译 | 原生支持 | 原生支持 |
| 打包工具 | webpack 等 | 内置 | 内置 |
| 内存安全 | 手动管理 | 手动管理 | Rust 保障 |
| 企业采纳度 | 极高 | 中等 | 快速上升 |
Bun 的 Rust 重写,实际上是在将"内存安全"从 TypeScript 语言层(Rust 编译器确保 JS 引擎层面的安全)延伸到整个运行时层。这是一个 Node.js 无法快速跟进的战略优势——Node.js 有着数十年的 C/C++ 历史债务。
5.3 对普通开发者的影响
对于已经在使用 Bun 的开发者来说,这次重写的影响是透明的——Bun v1.4.0 保持了对 Node.js API 的完整兼容,现有的项目无需任何改动即可运行。
对于还没有尝试 Bun 的开发者来说,这次重写是一个更强的"试用理由":Rust 保障的内存安全,意味着在生产环境中遭遇神秘的内存泄漏和崩溃的概率大幅降低。
六、性能实测:Rust 版本真的更快吗
6.1 HTTP 服务器吞吐量
以下是一个简单的基准测试,使用 Bun 原生的 HTTP 服务器对比:
// Rust 版本(Bun 1.4+)的 HTTP 处理示例
// 实际由 Bun 内部实现,开发者通过 JS API 使用
import { serve } from "bun";
serve({
port: 3000,
fetch(req) {
const url = new URL(req.url);
if (url.pathname === "/ping") {
return new Response("pong", {
headers: { "X-Bun-Version": Bun.version.pretty }
});
}
return new Response("Hello from Bun Rust!", {
status: 200,
headers: { "Content-Type": "text/plain" }
});
}
});
// 运行:bun serve.ts
// 基准测试:wrk -t12 -c400 -d30s http://localhost:3000/ping
根据官方披露,在相同硬件条件下,Rust 版本相比 Zig 版本在 HTTP 吞吐量上提升约 2%~5%。
6.2 文件 I/O 性能
// Bun 文件读取性能测试
const file = Bun.file("./large-file.json");
// 同步读取
const data = await file.text();
// 对于大型 JSON,Bun 的 Rust 版本解析速度更快
// 原因:Rust 的 serde_json 在反序列化大型 JSON 时
// 比 Zig 的手写解析器更优化
console.log(`File size: ${file.size} bytes`);
console.log(`Parse time: ${performance.now() - start}ms`);
Rust 版本的 serde_json 库经过多年优化,在大型 JSON 文件的解析上有明显优势。
6.3 内存占用对比
Rust 版本在内存占用上也有所改善:
- 峰值内存:降低约 8%~15%(不同工作负载表现不同)
- 内存泄漏:Rust 的所有权系统从编译期杜绝了大部分内存泄漏的可能
- GC 压力:Rust 的手动内存管理(配合智能指针)降低了 GC 的频率和停顿时间
这对 Claude Code 这种长时间运行的 CLI 工具来说尤为重要。
七、AI 编程的未来:从 Bun 实验中我们学到了什么
7.1 规模化的代码生成已经成为现实
Bun 实验最重要的结论是:在有充分测试保障的情况下,AI 可以在 11 天内生成 100 万行生产级代码。这意味着过去需要数百人年才能完成的大型系统重构,现在可以在数周内完成。
但"生成"只是第一步。代码还需要:
- 审查:人类工程师需要审查 AI 生成的每一个 unsafe 代码块
- 优化:AI 生成的代码在性能上未必最优,需要后续优化
- 演进:系统需求会变化,AI 生成的代码能否适应变化,取决于初始架构设计
7.2 工具链的价值被重新定义
当代码生成变得廉价,代码审查、测试设计、架构规划的价值反而在上升。一个优秀的 AI 编程团队,需要的不再是"能快速写代码的人",而是"能清晰定义问题、设计验证标准、审查 AI 输出的人"。
7.3 Rust 正在成为"AI 友好"的安全语言
讽刺的是,Rust 这个以"学习曲线陡峭"著称的语言,反而成了 AI 最容易生成正确代码的语言。原因很简单:Rust 的类型系统和借用检查器,为 AI 提供了足够强的约束——AI 生成的 Rust 代码如果不满足这些约束,就无法通过编译。这种"强制正确"的设计哲学,恰好与 AI 代码生成的特性相契合。
八、总结与展望:Bun 重写的十个关键结论
Bun 已完成从 Zig 到 Rust 的完整重写:100 万行代码,11 天,64 个 Claude 实例,16.5 万美元,全部通过测试套件 99.8%
内存安全是这次重写的核心动机:Zig 的内存泄漏和崩溃问题无法在短期内解决,而 Rust 的编译期检查提供了系统性保障
Claude Fable 5 证明了 AI 可以规模化生成生产级代码:99.8% 的测试通过率不是 Demo,是真实的生产代码
unsafe 不是银弹:13,000 处 unsafe 代码块提醒我们,Rust 的安全保证依赖于人类工程师对 unsafe 边界的判断
并行化 + 自动化测试 = AI 重写的基础设施:64 个 Claude 实例并行工作,测试套件作为 Oracle,这种工作流可以被复制到其他大型代码迁移项目中
二进制体积减小 3~8 MB:Rust 的优化能力和更紧凑的代码生成,带来了实际的二进制大小收益
性能提升 2%~5%:在代码量增加近一倍的情况下仍能提升性能,说明 Rust 在系统级任务上的效率优势
Anthropic 收购 Bun 是战略性的:Bun 的稳定性直接关系到 Claude Code 的用户体验,这是一次以产品为导向的技术收购
人类工程师的角色正在转变:从"写代码的人"变成"定义目标、审查输出、优化系统的人"
开源软件的未来可能由 AI 和人类共同维护:Jarred Sumner 的预言正在成真,但"禁止人类提交代码"的那一天,还很遥远
附录:相关的技术资源
- Bun 官方博客重写公告:bun.sh/blog/rust-rewrite
- Claude Fable 5 官方文档:anthropic.com/claude/fable-5
- Zig 官方文档:ziglang.org
- Rust 与 Zig 的对比研究:github.com/yrntag/rust-vs-zig
- pgrust(Postgres Rust 重写):github.com/malisper/pgrust
本文涉及的技术数据来源于 2026 年 7 月 8 日 Jarred Sumner 的官方博文及 IT 之家、知乎、CSDN 等平台的技术报道。Claude Fable 5 的性能数据来源于 Anthropic 官方技术文档。