Bun 深度拆解:当 AI 决定「用 11 天重写 50 万行代码」——从 Zig 到 Rust,一个 110K Star 的 JavaScript 运行时如何被 Claude 彻底重塑
引言:一个改变软件工程范式的实验
2026 年 7 月 8 日,JavaScript 运行时 Bun 的创始人 Jarred Sumner 发布了一篇注定载入软件工程史册的博文。他宣布:在 Claude Fable 5 模型的帮助下,仅用 11 天、64 个并行 Claude 实例、16.5 万美元的 API 费用,将整个 Bun 运行时从 Zig 语言完全重写为 Rust 语言,生成超过 100 万行 Rust 代码。
这不是一次普通的语言迁移。这是一个关于「AI 能否替代人类完成大规模系统级重构」的终极实验,也是一个关于「当 AI 生成的代码通过了百万级测试套件,我们是否还需要代码审查」的哲学拷问。
Bun 在 GitHub 上拥有超过 110K Star,月均下载量超过 700 万次,是目前增长最快的 JavaScript 运行时。2025 年 12 月,Anthropic 以未公开的价格收购了 Bun 及其团队,将其作为 Claude Code 的核心执行引擎。这次 Rust 重写,正是 Anthropic 收购后的第一个重大技术决策。
本文将从架构设计、语言选择、AI 辅助编程、性能对比、社区争议五个维度,深度拆解这次史无前例的运行时重写。
第一章:Bun 的前世今生——为什么是 Zig?
1.1 Bun 的诞生:对 Node.js 生态的反思
2022 年 7 月,前 Stripe 工程师 Jarred Sumner 发布了 Bun v0.1。它的核心理念非常简单:JavaScript 开发者不应该需要 5 个工具才能完成一个项目。
在 Node.js 生态中,一个典型的全栈项目需要:
Runtime → Node.js
Package Manager → npm / yarn / pnpm
Bundler → Webpack / Vite / esbuild
Transpiler → Babel / SWC
Test Runner → Jest / Vitest / Mocha
5 个工具,5 套配置,5 个维护团队。Bun 的目标是一个二进制文件解决所有问题:
Runtime → Bun
Package Manager → bun install
Bundler → bun build
Transpiler → bun(原生支持 TypeScript/JSX)
Test Runner → bun test
1.2 为什么选择 Zig?
Zig 是一门新兴的系统级编程语言,由 Andrew Kelley 于 2016 年创建。它被设计为 C 的现代替代品,提供:
- 手动内存管理:没有垃圾回收器,开发者完全控制内存分配
- 编译时计算:支持在编译阶段执行任意代码
- 交叉编译:原生支持为任意目标平台编译
- 与 C 的无缝互操作:可以直接调用 C 库,无需 FFI 绑定
Sumner 选择 Zig 的原因是极致的性能控制。JavaScript 运行时的核心瓶颈在于:
- 启动速度:V8 引擎需要初始化 JIT 编译器,启动耗时较长
- 内存占用:V8 的垃圾回收器会带来额外的内存开销
- 包安装速度:npm 的依赖解析算法效率低下
Zig 允许 Bun 团队直接操作内存布局、优化热路径、避免不必要的抽象层。配合 Apple 的 JavaScriptCore(JSC)引擎——Safari 浏览器使用的 JS 引擎——Bun 在启动速度和内存占用方面实现了对 Node.js 的碾压:
| 指标 | Node.js (V8) | Bun (JSC+Zig) | 提升倍数 |
|---|---|---|---|
| 启动时间 | ~45ms | ~12ms | 3.75x |
| Hello World HTTP | ~18,000 req/s | ~72,000 req/s | 4x |
| 包安装速度 | ~30 packages/s | ~850 packages/s | 28x |
| TypeScript 执行 | 需要编译步骤 | 原生支持 | ∞ |
| 内存占用 (空闲) | ~45MB | ~15MB | 3x |
1.3 Zig 的隐患:代码质量的债务
然而,Zig 的灵活性也是一把双刃剑。
Zig 创始人 Andrew Kelley 在后来的博文中透露,早在 Anthropic 收购之前,Zig 团队就对 Bun 代码库中的编程实践"感到震惊"。问题包括:
- 内存安全漏洞:Zig 不像 Rust 那样在编译时强制保证内存安全,Bun 的混合内存管理模型(垃圾回收 + 手动管理)导致了频繁的内存错误
- 错误处理粗糙:为了追求发布速度,许多错误路径被简单忽略
- 技术债务堆积:激进的功能发布策略导致代码质量持续下降
- AI 生成代码的泛滥:RoboBun(一个 Claude 机器人)曾是 Bun 仓库中提交合并 PR 最多的贡献者,但其生成的代码质量参差不齐
2026 年 3 月,Anthropic 发生了一起严重的代码泄露事件:51.2 万行 Claude Code 源代码被意外公开。泄露的根源正是 Bun 打包器中的一个漏洞——即使在构建时被指示不生成源映射,该漏洞仍会强制生成。
Sumner 在博文中承认:"这些漏洞并非 Zig 之过,而是源于 Bun 架构混合了垃圾回收与应用驱动的内存管理。Zig 并非为此类任务设计。"
第二章:Rust 重写——一场 11 天的极限实验
2.1 为什么是 Rust?
Rust 是 Mozilla 开发的系统级编程语言,其核心卖点是编译时内存安全:
- 所有权系统:每个值有且仅有一个所有者,编译器在编译时追踪所有引用
- 借用检查器:确保引用不会悬空、不会产生数据竞争
- 零成本抽象:高级抽象在编译时被完全优化,运行时无额外开销
- 无垃圾回收:通过所有权和生命周期实现自动内存管理,无需 GC 暂停
对于 Bun 这样一个需要同时处理 JavaScript 垃圾回收和底层系统调用的项目,Rust 的所有权模型提供了 Zig 无法保证的安全性保证。
2.2 Claude 的角色:64 个实例并行重写
Sumner 启动了约 50 个动态 Claude Code 工作流,峰值速度达到每分钟 1,300 行代码。整个重写过程的核心工作流如下:
┌─────────────────────────────────────────────────┐
│ Bun Rust 重写工作流 │
├─────────────────────────────────────────────────┤
│ │
│ 1. Zig 源码分析 │
│ ↓ │
│ 2. Claude Fable 5 生成 Rust 等价代码 │
│ ↓ │
│ 3. 64 个并行实例同时工作 │
│ ↓ │
│ 4. 峰值速度: 1,300 行/分钟 │
│ ↓ │
│ 5. 11 天完成 100 万行 Rust 代码 │
│ ↓ │
│ 6. 百万级测试套件验证 (100% 通过率) │
│ │
└─────────────────────────────────────────────────┘
关键数据:
| 指标 | 数值 |
|---|---|
| 总耗时 | 11 天 |
| 并行 Claude 实例数 | 64 个(峰值) |
| 生成代码行数 | >1,000,000 行 |
| API 费用 | ~$165,000 |
| 测试通过率 | 100% |
| 跳过/删除的测试用例 | 0 |
| 人工团队预估耗时 | ~1 年 |
2.3 测试套件:百万级断言的验证
重写完成后,基于 Rust 的 Bun 通过了包含超过一百万项断言的详尽测试套件。Sumner 称,其在所有支持平台上以 100% 的通过率通过测试,未跳过或删除任何用例。
这个测试套件的规模本身就是对 AI 生成代码质量的一种验证方式——如果 100 万行 AI 生成的代码能通过百万级测试,那么它在功能上至少是等价的。
但问题在于:功能等价不等于质量等价。测试能验证"做了什么",但很难验证"怎么做的"。代码的可读性、可维护性、安全性是否达到了人类工程师的标准?这是测试套件无法回答的问题。
第三章:架构深度对比——Zig vs Rust
3.1 内存管理模型
Zig 版本(旧):
// Zig 的内存管理:手动 + 垃圾回收混合
const allocator = std.heap.page_allocator;
var buffer = try allocator.alloc(u8, 1024);
defer allocator.free(buffer);
// JavaScript 堆由 JSC 的 GC 管理
// 但 Bun 的原生代码需要手动管理
// 两套系统交叉导致了大量内存安全问题
Rust 版本(新):
// Rust 的内存管理:所有权系统
fn process_data() {
let buffer = vec![0u8; 1024]; // buffer 的所有者是当前函数
let reference = &buffer; // 不可变借用,不转移所有权
// buffer 在函数结束时自动释放,无需手动 free
// 编译器保证:buffer 在有引用时不会被释放
}
Rust 的所有权系统在编译时就消除了以下常见的内存安全问题:
- Use-After-Free:释放后使用
- Double-Free:重复释放
- Buffer Overflow:缓冲区溢出
- Data Race:数据竞争
- Dangling Pointer:悬空指针
3.2 错误处理对比
Zig 版本:
// Zig 的错误处理:可选类型 + 错误联合类型
const result = readFile(path) catch |err| {
// 错误被显式处理
std.log.err("Failed to read: {}", .{err});
return error.FileNotFound;
};
Rust 版本:
// Rust 的错误处理:Result<T, E> 类型
fn read_file(path: &str) -> Result<String, io::Error> {
let content = fs::read_to_string(path)?;
// ? 运算符自动传播错误
// 编译器强制处理所有可能的错误路径
Ok(content)
}
// 调用方必须处理 Result
match read_file("config.json") {
Ok(content) => println!("Content: {}", content),
Err(e) => eprintln!("Error: {}", e),
}
Rust 的 Result<T, E> 类型让编译器强制开发者处理所有可能的错误路径。忘记处理错误?编译失败。这从根本上消除了 Bun Zig 版本中"错误处理粗糙"的问题。
3.3 并发安全
Zig 版本:
// Zig 的并发:需要手动同步
var counter: u32 = 0;
const mutex = std.Thread.Mutex{};
fn increment() void {
mutex.lock();
defer mutex.unlock();
counter += 1;
// 如果忘记加锁,就是 data race
// 编译器不会阻止你
}
Rust 版本:
use std::sync::{Arc, Mutex};
// Rust 的并发:编译时保证线程安全
let counter = Arc::new(Mutex::new(0));
fn increment(counter: Arc<Mutex<u32>>) {
let mut num = counter.lock().unwrap();
*num += 1;
// 编译器保证:Mutex 保护的数据不会被无锁访问
// 如果尝试无锁访问,编译失败
}
// Send/Sync trait 在编译时保证类型可以安全地跨线程传递
Rust 的 Send 和 Sync trait 在编译时保证类型可以安全地跨线程传递和共享。这消除了 Zig 版本中需要开发者手动保证线程安全的负担。
第四章:性能基准对比——Rust 版本是否更快?
4.1 Bun v1.4.0 (Rust) vs Bun v1.3.x (Zig)
根据 Sumner 的博文,Rust 版本的 Bun 在所有支持平台上通过了测试,运行速度提高了约 2% 到 5%。这个提升幅度虽然不大,但考虑到是从 Zig——一门已经非常接近底层的语言——迁移到 Rust,这个结果是合理的。
| 指标 | Bun v1.3.x (Zig) | Bun v1.4.0 (Rust) | 变化 |
|---|---|---|---|
| 启动时间 | ~12ms | ~11.5ms | -4% |
| HTTP 吞吐量 | ~72,000 req/s | ~74,500 req/s | +3.5% |
| 内存占用 | ~15MB | ~14.2MB | -5% |
| 包安装速度 | ~850 pkg/s | ~870 pkg/s | +2.4% |
| TypeScript 编译 | ~2.1s (10K行) | ~2.0s (10K行) | -5% |
4.2 与 Node.js 和 Deno 的对比
HTTP 吞吐量 (req/s, 越高越好)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Bun 1.4.0 (Rust) ████████████████████████████████ 74,500
Bun 1.3.x (Zig) ██████████████████████████████ 72,000
Deno 2.9 ████████████████████████ 52,000
Node.js 24 ████████████████████ 45,000
启动时间 (ms, 越低越好)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Bun 1.4.0 (Rust) ██ 11.5
Bun 1.3.x (Zig) ██ 12.0
Deno 2.9 █████ 28.0
Node.js 24 █████████ 45.0
内存占用 (MB, 越低越好)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Bun 1.4.0 (Rust) ███ 14.2
Bun 1.3.x (Zig) ███ 15.0
Deno 2.9 █████ 25.0
Node.js 24 █████████ 45.0
4.3 Claude Code 集成后的实际体验
Bun 被 Anthropic 收购后,成为了 Claude Code 的核心执行引擎。Claude Code v2.1.181 版已整合了 Rust 重构版 Bun,在 Linux 平台上启动速度快 10%。
这意味着当你使用 Claude Code 编写代码时,底层的 JavaScript 执行、TypeScript 编译、测试运行都在 Rust 版 Bun 中完成。Rust 的内存安全特性让 Claude Code 在长时间运行时更加稳定——不再因为内存泄漏或崩溃而中断。
第五章:社区争议——AI 生成代码的边界在哪里?
5.1 Zig 创始人的批评
Zig 创始人 Andrew Kelley 在题为《我对 Bun Rust 重写的看法》的博文中表达了强烈批评:
"Bun 放弃 Zig 反而是好事,这将避免 Zig 被视为'如何不编写 Zig 代码'的反面教材。"
Kelley 的核心论点:
- 问题不在语言,而在工程实践:Bun 的漏洞不是 Zig 造成的,而是 Sumner 糟糕的编程实践造成的
- 100 万行未经审查的代码:测试套件能捕捉功能 bug,但能捕捉代码质量问题吗?
- AI 生成代码的可维护性:未来谁来维护这 100 万行 AI 生成的代码?
5.2 支持者的观点
HashiCorp 联合创始人 Mitchell Hashimoto 在 X 平台评价道:
"绝对不可能有拿着那种薪水的工程师,能在 11 天内实现 Claude 所取得的里程碑。"
支持者认为:
- 效率革命:11 天 vs 1 年,AI 让不可能变为可能
- 质量保证:百万级测试套件提供了足够的信心
- 成本效益:$165,000 vs 一个工程师团队一年的薪资
5.3 我的思考:AI 辅助编程的边界
这次事件揭示了 AI 辅助编程的几个关键问题:
AI 擅长的:
- 大规模代码迁移(语言 A → 语言 B)
- 重复性代码生成
- 测试用例编写
- 文档生成
AI 不擅长的:
- 架构设计决策
- 代码审查和质量保证
- 安全审计
- 性能调优的关键路径优化
核心矛盾:AI 可以生成大量代码,但谁来保证这些代码的质量?测试套件能验证功能正确性,但无法验证代码的可读性、可维护性和安全性。
第六章:实战指南——如何迁移到 Bun
6.1 安装 Bun
# macOS / Linux
curl -fsSL https://bun.sh/install | bash
# Windows
powershell -c "irm bun.sh/install.ps1 | iex"
# 验证安装
bun --version
# 输出: 1.4.0
6.2 从 Node.js 迁移
# 1. 直接运行现有的 Node.js 项目
bun run start
# 2. 安装依赖(比 npm 快 28 倍)
bun install
# 3. 运行 TypeScript 文件(无需编译)
bun run index.ts
# 4. 运行测试
bun test
6.3 Bun HTTP 服务器示例
// server.ts - 使用 Bun 原生 HTTP API
const server = Bun.serve({
port: 3000,
async fetch(req) {
const url = new URL(req.url);
// 路由处理
if (url.pathname === "/api/hello") {
return new Response(
JSON.stringify({ message: "Hello from Bun 1.4.0 (Rust)!" }),
{
headers: { "Content-Type": "application/json" },
}
);
}
// 静态文件服务
const path = url.pathname === "/" ? "/index.html" : url.pathname;
const file = Bun.file(`./public${path}`);
if (await file.exists()) {
return new Response(file);
}
return new Response("Not Found", { status: 404 });
},
});
console.log(`Server running at http://localhost:${server.port}`);
6.4 Bun 内置 SQLite
// Bun 原生支持 SQLite,无需额外依赖
import { Database } from "bun:sqlite";
const db = new Database(":memory:");
// 创建表
db.run(`
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
// 插入数据
const insert = db.prepare(
"INSERT INTO users (name, email) VALUES (?, ?)"
);
insert.run("张三", "zhangsan@example.com");
insert.run("李四", "lisi@example.com");
// 查询数据
const users = db.query("SELECT * FROM users").all();
console.log(users);
// [{ id: 1, name: "张三", email: "zhangsan@example.com", ... }, ...]
6.5 Bun 测试框架
// math.test.ts - Bun 内置测试框架,兼容 Jest API
import { describe, expect, test } from "bun:test";
function add(a: number, b: number): number {
return a + b;
}
describe("add 函数", () => {
test("正数相加", () => {
expect(add(1, 2)).toBe(3);
});
test("负数相加", () => {
expect(add(-1, -2)).toBe(-3);
});
test("零值处理", () => {
expect(add(0, 5)).toBe(5);
});
});
// 运行: bun test math.test.ts
第七章:对 JavaScript 生态的影响
7.1 运行时竞争格局
Bun 的 Rust 重写标志着 JavaScript 运行时竞争进入新阶段:
2023 年格局:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Node.js │ │ Deno │ │ Bun │
│ (V8/C++) │ │ (V8/Rust) │ │ (JSC/Zig) │
│ 稳定可靠 │ │ 安全现代 │ │ 极致性能 │
└─────────────┘ └─────────────┘ └─────────────┘
2026 年格局:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Node.js │ │ Deno │ │ Bun │
│ (V8/C++) │ │ (V8/Rust) │ │ (JSC/Rust) │
│ 生态成熟 │ │ 企业级 │ │ AI 原生 │
│ │ │ │ │ Claude Code │
└─────────────┘ └─────────────┘ └─────────────┘
7.2 对开发者的影响
- 学习曲线降低:Rust 版 Bun 保持了 100% 的 API 兼容性,现有 Bun 用户无需任何改动
- 稳定性提升:Rust 的内存安全特性消除了 Bun 最被诟病的稳定性问题
- AI 开发体验:作为 Claude Code 的执行引擎,Bun 的 Rust 重写直接提升了 AI 编程工具的体验
7.3 对开源社区的影响
这次事件引发了关于 AI 生成代码的广泛讨论:
- 代码审查:100 万行 AI 生成的代码,谁来审查?
- 可维护性:未来修改这些代码时,开发者能否理解 AI 的"思路"?
- 许可证合规:AI 生成的代码是否受原始语言许可证的约束?
- 贡献者归属:AI 生成的代码,贡献者应该写 Claude 还是人类?
第八章:未来展望
8.1 Bun 的路线图
根据 Anthropic 的公告,Bun 将继续由原团队开发维护,保持 MIT 许可证开源。未来可能的发展方向:
- 更强的 AI 集成:Bun 可能成为 AI 代码生成的标准执行环境
- Edge Computing:利用 Rust 的轻量级特性,Bun 可能成为边缘计算的首选运行时
- WebAssembly 支持:Rust 与 WASM 的天然亲和性可能带来更好的 WASM 支持
8.2 AI 辅助编程的未来
Bun 的 Rust 重写只是一个开始。随着 AI 模型能力的提升,我们可能会看到:
- 大规模代码迁移成为常态:从一种语言迁移到另一种语言,从一种架构迁移到另一种架构
- AI 代码审查工具:专门用于审查 AI 生成代码的工具
- 人机协作的新范式:人类负责架构设计和质量保证,AI 负责代码生成和测试
总结
Bun 的 Rust 重写是软件工程史上的一个里程碑事件。它证明了:
- AI 可以完成大规模系统级重构:11 天重写 100 万行代码,这是人类团队需要一年才能完成的工作
- 测试套件是 AI 代码质量的重要保障:百万级测试套件提供了功能等价性的保证
- Rust 是系统级软件的安全选择:编译时内存安全保证消除了 Bun 最被诟病的稳定性问题
- AI 辅助编程的边界正在扩展:从代码补全到大规模重构,AI 的能力在快速增长
但同时,这次事件也留下了深刻的反思:
- 代码质量 ≠ 功能正确性:测试能验证"做了什么",但很难验证"怎么做的"
- 可维护性是长期挑战:100 万行 AI 生成的代码,未来谁来维护?
- AI 不是万能的:架构设计、安全审计、性能调优仍然需要人类工程师
对于 JavaScript 开发者来说,Bun 1.4.0 (Rust) 现在是一个更加稳定、安全的选择。如果你还没有尝试过 Bun,现在是最好的时机。
参考资源: