Anthropic Engineering Blog 中文翻译

create: 2026-02-05
update: 2026-08-10
author: thinkycx
title: 【译】用并行 Claude 团队构建 C 编译器
description: Anthropic 研究员用 16 个并行 Claude Agent 组成团队,从零构建了一个 10 万行 Rust 代码的 C 编译器,能够编译 Linux 6.9 内核。文章分享了如何设计 Agent 协同机制、测试驱动的自主编程方法论,以及多 Agent 并行开发的实战经验。
category: translation
tags: anthropic, engineering, translation, parallel-agents, compiler

用并行 Claude 团队构建 C 编译器

原文发布于 2026 年 2 月 5 日,作者 Nicholas Carlini,Anthropic Safeguards 团队研究员

GitHub 仓库:https://github.com/anthropics/claudes-c-compiler

hero

概述

16 个 Claude 实例并行工作两周,自主生产了一个能编译 Linux 内核的 C 编译器。 这是一次"Agent 团队"(多个 Claude 实例并行协作)的实验:让 Opus 4.6 从零开始构建一个 C 编译器。作者"基本上走开了",让 Agent 自主运行。经过近 2,000 次 Claude Code 会话、花费约 2 万美元 API 费用,16 个 Agent 产出了一个 10 万行 Rust 代码的 C 编译器,能在 x86、ARM 和 RISC-V 架构上编译 Linux 6.9。


让 Claude 持续长时间运行

用一个简单的无限循环实现 Agent 的持续自主运行。 现有的 Agent 框架通常要求操作者在线监控。为了让 Agent 能持续自主推进,作者构建了一个极简的循环 harness:

#!/bin/bash

while true; do
    COMMIT=$(git rev-parse --short=6 HEAD)
    LOGFILE="agent_logs/agent_${COMMIT}.log"

    claude --dangerously-skip-permissions \
           -p "$(cat AGENT_PROMPT.md)" \
           --model claude-opus-X-Y &> "$LOGFILE"
done

Agent prompt 指示 Claude 将问题拆分成小块、追踪进度、自行判断下一步做什么、然后继续前进。有一次 Claude 不小心运行了 pkill -9 bash——直接把自己杀死了,终止了整个循环。


并行运行多个 Claude

并行化解决了单 Agent 的两个核心瓶颈:串行执行和缺乏专业分工。 多个并行实例弥补了单 Agent 方案的两个弱点:

问题 并行化如何解决
单个会话一次只能做一件事 多实例同时处理不同任务
缺乏专业分工 不同 Agent 承担不同角色

实现方式

  • 创建一个裸 git 仓库
  • 为每个 Agent 启动一个 Docker 容器,将仓库挂载到 /upstream
  • 每个 Agent 在 /workspace 做本地 clone

同步算法

  1. Claude 通过向 current_tasks/ 写入文本文件来"锁定"任务(如 current_tasks/parse_if_statement.txt)。Git 的同步机制迫使第二个 Agent 在冲突时选择不同的任务。
  2. Claude 完成任务后,从 upstream 拉取、合并变更、推送自己的修改、移除锁文件。"合并冲突很频繁,但 Claude 足够聪明,能自己搞定。"
  3. 无限循环在新的容器中启动新的 Claude Code 会话。

这里没有编排 Agent——每个 Claude 自主决定做什么,通常会选择"下一个最显而易见"的问题。


用 Agent 团队编程的经验教训

编写极高质量的测试

当 Agent 自主工作时,测试验证器的质量决定了产出的质量。 "Claude 会自主地去解决我给它的任何问题。所以,任务验证器近乎完美是至关重要的。" 改进测试 harness 需要:寻找高质量的编译器测试套件、编写验证器、在发现新的失败模式时设计新的测试。当 Claude 开始破坏已有功能后,作者增加了一个更严格的 CI pipeline。

站在 Claude 的角度思考

为 AI 设计工具接口,而不是为人类。 测试 harness 是为 Claude 设计的,不是为人。关键考量:

设计要点 说明
上下文窗口污染 不要打印数千字节的无用信息。将信息记录到文件中,"预先计算聚合统计数据,这样 Claude 就不必重复计算"
时间感知缺失 "Claude 没有时间概念,如果不管它,它会开心地花几小时跑测试而不是推进开发。" 加入 --fast 选项,每个 Agent 运行确定性的 1% 或 10% 随机样本

让并行化变得简单

失败测试多时并行化很容易,测试通过率高时需要更巧妙的任务分割策略。 当存在大量不同的失败测试时,并行化是轻而易举的事。在达到 99% 通过率后,Agent 转向编译不同的开源项目(SQLite、Redis、libjpeg、MQuickJS、Lua)。

对于 Linux 内核(一个巨型单一任务),Agent 不断撞上同一个 bug。解决方案是用 GCC 作为"在线已知正确编译器 oracle"——随机地用 GCC 编译大部分内核文件,只让 Claude 的编译器处理其余部分,然后逐步缩小故障范围。还运用了 Delta debugging 技术。

多 Agent 角色

并行化使专业分工成为可能。 不同 Agent 承担不同职责:

Agent 角色 职责
代码整合者 合并重复代码
性能优化者 提升编译器本身的性能
输出优化者 优化生成代码的效率
代码评审者 从 Rust 开发者视角审视设计
文档维护者 维护项目文档

压力测试极限

该项目作为 Claude 4 系列模型的能力基准测试。 此前的 Opus 4 模型几乎无法产出可用的编译器。Opus 4.5 能通过大型测试套件但无法编译真实项目。Opus 4.6 被推到了极限。

项目数据

指标 数据
会话数 约 2,000 次 Claude Code 会话,跨两周
Token 使用 20 亿输入 token、1.4 亿输出 token
成本 略低于 2 万美元
代码量 10 万行 Rust 代码
实现方式 洁净室实现(无互联网访问),仅依赖 Rust 标准库

能力

  • 可编译并启动 Linux 6.9(x86、ARM、RISC-V)
  • 可编译 QEMU、FFmpeg、SQLite、PostgreSQL、Redis
  • 大多数编译器测试套件通过率 99%,包括 GCC torture test suite
  • 能编译并运行 Doom

局限性

局限 说明
16 位 x86 编译器 无法生成从 real mode 引导 Linux 所需的 16 位代码(需调用 GCC)
汇编器/链接器 没有自己的实现,仍有些 bug
替代能力 不能作为真实编译器的直接替代品
代码效率 生成代码的效率低于"关闭所有优化的 GCC"
代码质量 Rust 代码"还行,但远未达到 Rust 专家的水平"

关于 16 位问题的细节:编译器可以通过 66/67 操作码前缀输出正确的 16 位 x86 代码,但结果超过 60KB,远超 Linux 的 32K 代码限制。对于 ARM 或 RISC-V,Claude 的编译器可以完全独立完成编译。


展望未来

每一代模型都带来了全新的工作方式——从 Tab 补全到完全自主的 Agent 团队。 作者回顾了与 AI 编程协作方式的演进:从 Tab 补全,到函数级补全,到与 Claude Code 结对编程,再到如今的完全自主 Agent 团队实现复杂项目。

然而,作者也表达了不安:"构建这个编译器是我最近最开心的事,但我没想到这在 2026 年初就已经接近可能。" 作为前渗透测试从业者,他指出"程序员部署自己从未亲自验证过的软件,这种想法是一个真实的隐忧。"


致谢

特别感谢 Josef Bacik、Edwin Chen、Bernardo Meurer Costa、Jake Eaton、Dan Kelley、Felix Klock、Jannet Park、Steve Weis 以及 Anthropic 的其他同事。