2026 年 7 月 8 日,Bun 团队在其官方博客发布重磅消息:经过 11 天的高强度工作,Bun 全部 1448 个 Zig 文件已被机械式转换为 Rust 代码,测试套件实现 100% 通过率。新版本(v1.4.0)已通过 canary 渠道发布,标志着这个曾以极致性能著称的 JavaScript 全栈工具链正式迈入 Rust 时代。
这一决定并非简单的语言替换,而是 Bun 团队在面对长期稳定性难题后做出的系统性选择。项目创始人 Jarred Sumner 披露,Bun 已被 Anthropic 于 2025 年 12 月收购,此次重写也服务于内部 AI 开发工具 Claude Code 的需求。消息一出,Hacker News 相关帖子迅速获得 219 分,开发者社区围绕 Zig 与 Rust 的取舍、AI 辅助编程的边界展开激烈讨论。
Bun 的 Zig 起源与野心勃勃的范围
Bun 诞生于 2021 年 4 月,最初是 Jarred Sumner 对 esbuild Go 代码的 Zig 逐行移植。选择 Zig 的原因在于其单页语言参考文档和对底层控制的极致追求。短短一年内,Jarred 在狭小的 Oakland 公寓里,用 Zig 实现了令人惊叹的功能集合:JavaScript/TypeScript/CSS 转译器与打包器、npm 兼容的包管理器、Jest 风格测试运行器、Node.js 模块解析、HTTP/WebSocket 客户端,以及数十个 Node.js API 的兼容实现。
这一“全家桶”定位让 Bun 迅速崛起。目前其 CLI 月下载量超过 2200 万,Vercel、Railway、DigitalOcean 等平台提供原生支持,Claude Code 和 OpenCode 等工具也将其作为核心运行时。Zig 的低抽象、显式内存管理帮助项目在早期快速落地,但也为后续埋下隐患。
广泛功能引发的稳定性危机
随着代码规模膨胀到 53 万多行 Zig,内存安全问题逐渐成为瓶颈。v1.3.14 版本中修复的典型 bug 包括:node:zlib 在异步 write 期间的 use-after-free 崩溃、node:http2 因重入回调触发的哈希表重哈希导致的 use-after-free、UDPSocket.sendMany 中的 ArrayBuffer 分离问题、Buffer#copy/#fill 的越界读写、crypto.scrypt 的内存泄漏,以及 CSS 解析器中的 double-free 等。
这些问题大多源于 Zig 缺乏构造函数/析构函数,开发者必须在每个调用点手动使用 defer/errdefer 管理生命周期,同时还要正确处理与 JavaScript 垃圾回收器的交互。团队虽已部署 Address Sanitizer(ASAN)、Fuzzilli 模糊测试、24/7 内存泄漏测试等严苛措施,但仍无法彻底根除“一次性修复”模式。团队最终选择系统性解决方案,而非继续打补丁。
为什么是 Rust?内存安全的根本答案
Rust 的核心优势在于编译时内存安全。借用检查器和 Drop trait 确保资源在作用域结束时自动、精确地释放一次,无需开发者手动编写 defer。这对于同时管理手动分配内存和 GC 对象的 JavaScript 运行时尤为关键。
团队对比了清理机制:Zig 依赖显式 defer,C++ 依赖析构函数与代码规范,而 Rust 通过 impl Drop for Bytes 等方式实现自动清理。切换到 C++ 无法解决根本问题,因为它仍依赖人工审查。Rust 则将整个类别 bug 变为编译错误。
重写并非重新架构,而是“机械移植”——保留原有设计、性能特性与行为,最大限度降低对用户的冲击。所有代码被翻译为约 100 个 Rust crate,过程中处理了 16000 个编译错误和循环依赖问题。
AI 驱动的 11 天奇迹
重写主力是一名工程师借助 Anthropic 预发布版 Claude Fable 5 完成。整个过程消耗约 59 亿输入 token、6.9 亿输出 token 和 720 亿缓存读取,API 成本约 16.5 万美元。团队采用多 Claude 实例并行工作流:一个生成代码,另一个进行对抗性审查(假设代码有错),再由修复者迭代。
测试验证极其严谨:烟雾测试、本地分片随机测试、跨 Linux/macOS/Windows 的 CI 全量运行,以及使用 systemd-run + cgroups 进行的资源隔离压力测试。最终在构建 #54202 时,所有平台测试全部通过。项目还生成了 PORTING.md 和 LIFETIMES.tsv 等文档,方便后续贡献者理解。
目前新代码中约 4%(约 1.3 万处)仍使用 unsafe,未来将逐步重构为更惯用的 Rust 风格。
重写带来的实际收益
内存使用大幅改善:Bun.build() 每次调用曾泄漏约 3MB,2000 次构建后 Zig 版本占用 6745MB,Rust 版本仅 609MB。LeakSanitizer 现可追踪所有原生分配。
二进制体积缩小约 20%:通过链接器代码折叠、ICU 数据清理、zstd 延迟解压等优化,Linux 版从 88MB 降至 70MB,Windows 版从 94MB 降至 76MB。
性能小幅提升:在 Linux x64(Xeon Platinum 8488C)基准测试中:
- Bun.serve HTTP 吞吐量从 169.6k req/s 提升至 177.7k(+4.8%)
- Next.js build 从 13.62s 缩短至 13.03s(+4.5%)
- Vite build、tsc 等任务均有 2%–5% 加速
- Claude Code 启动时间在 Linux 上改善约 10%
解析器栈空间使用也因 LLVM 生命周期优化而减少。
稳定性:v1.4.0 修复了 v1.3.14 中的 128 个 bug,核心运行时更少崩溃。
兼容性与验证
TypeScript 编写的测试套件(包含 57k–60k 测试、130 万–140 万 expect() 调用)完全语言无关,因此验证过程顺畅。团队报告仅出现少量语义差异(如 debug_assert! vs assert、切片长度、边界检查),均已修复。用户可通过 bun upgrade --canary 立即体验。
Hacker News 社区的热烈讨论与分歧
Hacker News 讨论呈现两极化但技术深度高的态势。支持者称赞这是“工程壮举”和“AI 辅助大规模重构的里程碑”,Rust 的安全模型被视为长期维护的正确选择。反对或质疑声音主要集中在三点:AI 生成代码(尤其是 78 万行规模)的可维护性与“vibe coding”风险;部分用户认为这是 Anthropic 的营销行为;Zig 的显式控制与简洁性仍有拥趸,认为若投入同等精力优化 Zig 也能达到类似结果。
技术辩论聚焦 Zig vs Rust 在大规模系统中的权衡:Rust 编译器错误作为反馈循环更适合 LLM 迭代,但 Zig 的低抽象在极致性能场景仍有优势。多人指出,此次重写证明了强类型系统在 AI 时代的重要性,也为其他项目提供了“机械移植 + 严格测试”的范式。
对开源生态与 AI 编程的启示
此次事件为开源世界提供了多重观察视角。首先,Rust 在处理与高级语言互操作的系统级项目中展现出独特价值——内存安全不再是“额外成本”,而是生产力提升。其次,AI(尤其是 Claude Code 类工具)已能承担从翻译到审查、再到修复的完整闭环,将原本需要数十人月的重写压缩至 11 天。
同时,它也引发深层讨论:当代码主要由 LLM 生成时,人类审查的边界在哪里?长期可维护性如何保障?Zig 社区或许需要反思,在追求极致简洁与性能的同时,如何更好地应对大规模项目的复杂性。
对 Bun 贡献者而言,Rust 版本搭配清晰的移植文档和更安全的 API,长期参与门槛有望降低。社区稳定性提升最终将惠及所有依赖 Bun 的开发者与平台。
未来展望
Bun 团队表示将继续推进惯用 Rust 重构、扩展模糊测试(已执行 1000 亿次解析器执行,发现并修复多处 bug)、进一步压缩二进制体积,并利用 Miri、LeakSanitizer 等工具持续强化稳定性。v1.4.0 只是起点。
无论最终选择哪种语言,Bun 的目标始终是提供更快、更简单、更可靠的 JavaScript 开发体验。此次 Rust 转型,是对“稳定性优先”理念的坚定实践,也为整个开源工具链领域树立了新标杆。
在 AI 重塑软件开发的今天,Bun 的故事提醒我们:技术选择从来不是非此即彼,而是如何在性能、安全、开发效率与长期演进之间找到最优平衡。Rust 版本的落地,或许只是 Bun 新篇章的开始。