11天重写百万行代码:Bun的AI实验改写了软件工程的规则

2026.07.11 16:03
Bun作者贾里德·萨姆纳用64个并行的Claude Fable 5模型实例,在11天内将JavaScript运行时Bun从Zig完整重写为Rust,生成超100万行代码,API费用仅16.5万美元。这不仅是技术栈迁移,更是对软件工程基本假设的重新定义——当AI能以十分之一的人工成本完成生产级代码迁移时,所有写代码的人都需要重新思考自己的角色。

11天,100万行代码,16.5万美元。一个JavaScript运行时完成了从Zig到Rust的完整重写。

如果让人类工程师来做,同样的工作预计需要一年。而贾里德·萨姆纳(Jarred Sumner)只用了11天,用64个并行的Claude Fable 5模型实例,生成超过100万行代码,把Bun这个月下载量超过2200万次、支撑着Claude Code和无数项目的JavaScript运行时,从Zig完整翻译成了Rust。

这不是一次平平无奇的技术栈迁移。它在回答一个所有软件团队都正在问、但很少有人敢正面回答的问题:当AI能够以十分之一的人工成本完成一整条生产级代码库的迁移时,软件工程的规则还和昨天一样吗?

Zig写不动的Bug,Rust来写

要理解萨姆纳为什么做出这个决定,先得理解Bun的处境。

Bun诞生于2021年。萨姆纳在一间奥克兰的狭小公寓里,花了一年时间,用Zig语言把esbuild的Go代码逐行移植过来。Zig的单页语言参考手册和极致的底层控制力让他兴奋。Bun的野心也大得出奇:它不仅仅是一个运行时,还内置了包管理器、打包器、测试运行器、HTTP/1.1和WebSocket客户端,以及大量Node.js API的实现。四年后,Bun的CLI月下载量超过2200万次,Vercel、Railway、DigitalOcean都和Claude Code、OpenCode一样,把Bun作为默认运行时。

但规模越大,Zig的阴影越长。

翻看Bun v1.3.14的Bug修复列表,像一份法医鉴定报告。在node:zlib中调用.reset()时异步写入仍在进行,堆内存被释放后再次使用,进程崩溃。在node:http2中,嵌套的JavaScript回调触发了哈希表重排,内部流指针失效。在UDPSocket.sendMany()中,用户代码通过回调改变了连接状态,导致越界写入。在tlsSocket.setSession()中,每次调用泄露一个SSL_SESSION,约6.5KB,调用多了就是灾难。

这些Bug的共同点指向同一个根因:在一个进程中同时管理垃圾回收和手动内存分配。JavaScriptCore对异常处理和GC有极其严格的规则,而Zig像C一样,不会自动管理内存。当两种范式共存于同一个进程,每一次内存分配都需要逐行审视:这些字节在哪里释放?如何确保只释放一次?JavaScript异常是否被正确处理?这个由GC管理的指针,保守式栈扫描器能否看到?

Bun团队已经做了很多努力:给Zig编译器打上Address Sanitizer补丁,在每个提交上运行ASAN测试,用Fuzzilli连续模糊测试,做大规模端到端内存泄漏测试。但Bug报告仍在涌入。

“我们的Bug修复列表让人心情沉重。我厌倦了每晚入睡前担心Bun会崩溃。”——贾里德·萨姆纳

萨姆纳不把责任推给Zig。其他Zig用户并没有遇到Bun的问题,因为把GC与手动管理的内存混用是软件中极少见的场景,几乎没有任何语言为此设计。但真正让改写变成必然的,还有另一个原因。Zig社区对AI生成代码持明确的排斥态度,Zig联合创始人安德鲁·凯利(Andrew Kelley)曾在公开场合称AI辅助的代码贡献“毫无价值,甚至有害”。Bun团队在被Anthropic收购后日常开发高度依赖AI辅助,两者之间的路线冲突变得不可调和。Bun被迫维护一个上游社区拒绝合并代码的Zig分支,这在任何开源项目中都不可持续。

语言选择的矛盾,在技术层面和社区层面同时爆发了。

AI重写的真实成本账

重写的执行细节,可能是这篇文章中最令工程师震撼的部分。

萨姆纳使用了一个预发布版本的Claude Fable 5。他启动了64个并行AI实例,每个实例负责Bun代码库的一部分。他的工作不是写代码,而是监视代码。他每天手动阅读AI生成的输出,检查问题和Bug,然后给Claude发回指令调整循环。有点像一个人指挥一支100人规模的开发团队,只不过这些工程师不睡觉、不问问题、每小时输出几千行代码。

几天之内,测试套件通过率开始飙升。萨姆纳看到新生成的Rust代码与原有的Zig代码库高度匹配。不是逐行翻译,而是用Rust的惯用写法重新实现了同样的逻辑。最终,整个迁移涉及超过100万行代码变更、6,778次提交、约50个在Claude Code中运行的动态工作流。消耗了59亿个未缓存输入令牌、6.9亿个输出令牌和720亿个缓存输入令牌读取。

API费用约16.5万美元。Bun在2025年12月已被Anthropic收购,这笔费用由母公司承担。

作为对比,如果让一支完全熟悉Bun代码库的工程师团队来做同样的工作,光是人力成本就在120万到180万美元之间,按6到8名资深工程师的一年薪酬计算,还不算机会成本。在这一年里,这些工程师本来可以用来推进新功能、修复Bug和打安全补丁。

16.5万美元对比180万美元。11天对比一年。这是数量级的碾压,不是边际改善。

性能账也同样清晰。Bun v1.4.0 Canary版本同步发布,修复了128个缺陷。在2000次构建的压力测试中,Rust版本的内存占用从6.7GB降至609MB,性能提升2%到5%,二进制体积缩小约20%。独立开发者的基准测试也验证了Rust版本在内存使用上比Zig版本低5%到6%,而速度基本持平。正如一位开发者所说:无聊的改进,才是健康的改进。

成本门槛被踩碎之后

Bun的这次实验,最大的意义不在Bun本身,而在于它揭示了一个正在发生的根本性变化。

历史上,大型软件项目的语言迁移极为罕见。Netscape把C重写为C++,代价是几乎输掉了浏览器战争。Google Go团队早期重写了大量C工具。近年来备受讨论的RIIR运动,真正完成的寥寥无几。原因很简单:成本和风险。一个生产级代码库的完整重写意味着半年到两年的人力投入,数百万美元的工资支出,以及最重要的一个变量:在这段时间内竞争对手可能已经超过你。

一个最近的参照是Turborepo。Vercel在2023到2024年用Rust重写Turborepo,3到5名工程师花了大约14个月,隐性成本高达数百万美元。Vercel认为这笔投资值得,但不是每个团队都做得到。

而现在,Bun展示了另一种可能性。成本门槛从几百万美元降到十几万美元,时间窗口从一年多变成一个周末到两周。这不是增量改进,这是对软件工程基本假设的重新定义。

语言迁移将不再是不可逆的决策。选择的代价变小了,就可以重新选择。一个月前还在讨论要不要从X迁移到Y的团队,现在可以直接试。如果AI在11天里做到了Bun的重写,体量更小的项目只会更简单得多。

技术债消除将从季度性的战略主题变成随时可以执行的战术动作。不再需要等待大重构窗口,周末的时间窗口就够了。代码不再是一旦写好就无法轻易改动的资产,而是可以用AI持续重构和优化的活物。

Rust生态将成为最大的受益者之一。当团队可以用极低成本把C++或Go或Zig代码重写为Rust,Rust的内存安全承诺就变成了一座触手可及的堡垒。Bun选择的正是这个方向。从Zig到Rust,不是为了性能,两者在性能上几乎不相上下,而是为了内存安全的系统性保障。

AI时代的编程语言选择将增加一个新维度:模型对该语言的熟悉程度和代码生成质量。一个模型对A语言的理解远远好于B语言,这个事实本身可能成为选择A语言的理由,哪怕B语言在技术指标上更优。Zig的例子尤其明显。社区排斥AI,意味着AI对Zig的代码生成质量天然受限,这反过来削弱了Zig在AI辅助开发时代的竞争力。

当AI写代码快过人类审查

但在所有积极叙事之外,硬币有另一面。

萨姆纳在重写过程中发现了大量非显而易见的Bug。那些只有在特定并发条件下、在极端边界输入下才会触发的错误。AI模型能复制逻辑,但它能理解这些Bug产生的深层原因吗?当原始代码中隐藏着某个开发者在三年前花了两周才调试出来的微妙竞态条件时,AI重写的Rust版本是否忠实地复现了这个竞态条件,还是默默地修复了它,同时在另一个地方引入了新的、更隐蔽的竞态条件?

萨姆纳之所以能成功,是因为他对Bun的代码库有无与伦比的熟悉度。他是Bun的唯一创始开发者,对每一行代码的意图都了如指掌。但全世界绝大多数项目都不是这样。接手他人代码的团队、已经在维护一座巨大遗产系统的团队、甚至刚加入一个大型项目的新人,他们能用同样的方式信任AI生成的代码吗?

还有一个更深层的问题。当AI写出的代码超过人类理解的范围时,谁来为这些代码负责?Bun的重写版本可能已经通过了绝大多数测试,但那剩下的边缘场景涵盖了哪些情况?如果AI重写后的代码在生产环境中运行六周后崩溃,而没有人能理解崩溃的根因,因为代码不是任何人写的,那该怎么办?

萨姆纳花了11天生成代码,但他花了同样多的时间阅读、检查、修正。如果没有他的工程直觉和领域知识,64个Claude实例生成的100万行代码可能只是一堆语法正确但系统层面不可靠的代码。AI生成的代码,就像任何外部贡献的代码一样,需要审查、需要理解、需要为之负责。区别在于:AI生成代码的速度远远超过了人类审查它的能力。这个缺口,是接下来几年软件工程领域最棘手的问题。

分水岭

2026年7月8日,软件工程领域发生了两件事。一件是一个JavaScript运行时换了编程语言。另一件是重写一个大型生产级系统的成本曲线被永久性地改变了。

第一件事只影响Bun的用户和开发者。第二件事影响所有写代码的人。

在Bun用AI在11天内完成了原本需要一年的人工劳动之后,再去争论AI能不能写代码已经没有意义了。真正的问题变成了:当AI能写这么多、这么快的时候,人类工程师应该做什么?

答案不是什么都不用做了。答案恰恰相反,人类工程师需要做更重要的事情:决定写什么,验证写得对不对,理解系统层面发生了什么,为生产环境中的后果负责。

AI不会取代工程师。但AI会重新定义什么是工程师。而Bun的这次重写,就是那个定义被改写的时刻。

作品声明:内容由AI生成