编程 Bun 深度拆解:当 AI 决定「用 11 天重写 50 万行代码」——从 Zig 到 Rust,一个 110K Star 的 JavaScript 运行时如何被 Claude 彻底重塑

2026-08-05 00:16:24 +0800 CST views 10

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 运行时的核心瓶颈在于:

  1. 启动速度:V8 引擎需要初始化 JIT 编译器,启动耗时较长
  2. 内存占用:V8 的垃圾回收器会带来额外的内存开销
  3. 包安装速度:npm 的依赖解析算法效率低下

Zig 允许 Bun 团队直接操作内存布局、优化热路径、避免不必要的抽象层。配合 Apple 的 JavaScriptCore(JSC)引擎——Safari 浏览器使用的 JS 引擎——Bun 在启动速度和内存占用方面实现了对 Node.js 的碾压:

指标Node.js (V8)Bun (JSC+Zig)提升倍数
启动时间~45ms~12ms3.75x
Hello World HTTP~18,000 req/s~72,000 req/s4x
包安装速度~30 packages/s~850 packages/s28x
TypeScript 执行需要编译步骤原生支持
内存占用 (空闲)~45MB~15MB3x

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 的 SendSync 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 的核心论点:

  1. 问题不在语言,而在工程实践:Bun 的漏洞不是 Zig 造成的,而是 Sumner 糟糕的编程实践造成的
  2. 100 万行未经审查的代码:测试套件能捕捉功能 bug,但能捕捉代码质量问题吗?
  3. AI 生成代码的可维护性:未来谁来维护这 100 万行 AI 生成的代码?

5.2 支持者的观点

HashiCorp 联合创始人 Mitchell Hashimoto 在 X 平台评价道:

"绝对不可能有拿着那种薪水的工程师,能在 11 天内实现 Claude 所取得的里程碑。"

支持者认为:

  1. 效率革命:11 天 vs 1 年,AI 让不可能变为可能
  2. 质量保证:百万级测试套件提供了足够的信心
  3. 成本效益:$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 对开发者的影响

  1. 学习曲线降低:Rust 版 Bun 保持了 100% 的 API 兼容性,现有 Bun 用户无需任何改动
  2. 稳定性提升:Rust 的内存安全特性消除了 Bun 最被诟病的稳定性问题
  3. AI 开发体验:作为 Claude Code 的执行引擎,Bun 的 Rust 重写直接提升了 AI 编程工具的体验

7.3 对开源社区的影响

这次事件引发了关于 AI 生成代码的广泛讨论:

  • 代码审查:100 万行 AI 生成的代码,谁来审查?
  • 可维护性:未来修改这些代码时,开发者能否理解 AI 的"思路"?
  • 许可证合规:AI 生成的代码是否受原始语言许可证的约束?
  • 贡献者归属:AI 生成的代码,贡献者应该写 Claude 还是人类?

第八章:未来展望

8.1 Bun 的路线图

根据 Anthropic 的公告,Bun 将继续由原团队开发维护,保持 MIT 许可证开源。未来可能的发展方向:

  1. 更强的 AI 集成:Bun 可能成为 AI 代码生成的标准执行环境
  2. Edge Computing:利用 Rust 的轻量级特性,Bun 可能成为边缘计算的首选运行时
  3. WebAssembly 支持:Rust 与 WASM 的天然亲和性可能带来更好的 WASM 支持

8.2 AI 辅助编程的未来

Bun 的 Rust 重写只是一个开始。随着 AI 模型能力的提升,我们可能会看到:

  • 大规模代码迁移成为常态:从一种语言迁移到另一种语言,从一种架构迁移到另一种架构
  • AI 代码审查工具:专门用于审查 AI 生成代码的工具
  • 人机协作的新范式:人类负责架构设计和质量保证,AI 负责代码生成和测试

总结

Bun 的 Rust 重写是软件工程史上的一个里程碑事件。它证明了:

  1. AI 可以完成大规模系统级重构:11 天重写 100 万行代码,这是人类团队需要一年才能完成的工作
  2. 测试套件是 AI 代码质量的重要保障:百万级测试套件提供了功能等价性的保证
  3. Rust 是系统级软件的安全选择:编译时内存安全保证消除了 Bun 最被诟病的稳定性问题
  4. AI 辅助编程的边界正在扩展:从代码补全到大规模重构,AI 的能力在快速增长

但同时,这次事件也留下了深刻的反思:

  • 代码质量 ≠ 功能正确性:测试能验证"做了什么",但很难验证"怎么做的"
  • 可维护性是长期挑战:100 万行 AI 生成的代码,未来谁来维护?
  • AI 不是万能的:架构设计、安全审计、性能调优仍然需要人类工程师

对于 JavaScript 开发者来说,Bun 1.4.0 (Rust) 现在是一个更加稳定、安全的选择。如果你还没有尝试过 Bun,现在是最好的时机。


参考资源

推荐文章

PHP 命令行模式后台执行指南
2025-05-14 10:05:31 +0800 CST
windows下mysql使用source导入数据
2024-11-17 05:03:50 +0800 CST
Golang实现的交互Shell
2024-11-19 04:05:20 +0800 CST
程序员茄子在线接单