惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
有赞技术团队
有赞技术团队
博客园_首页
H
Help Net Security
GbyAI
GbyAI
aimingoo的专栏
aimingoo的专栏
V
Visual Studio Blog
The Cloudflare Blog
腾讯CDC
Jina AI
Jina AI
Last Week in AI
Last Week in AI
月光博客
月光博客
博客园 - 叶小钗
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
Blog — PlanetScale
Blog — PlanetScale
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
爱范儿
爱范儿
N
Netflix TechBlog - Medium
F
Fortinet All Blogs

Tony Bai

Rust重写运动,到底是真香还是被吹爆? 刚刚,DeepSeek开源Harness:把Agent拆成插件,一切皆可换 Google官方下场安利:AI时代,Go才是“最适合”的编程语言 从 Mozilla 孤儿到独立王国:起底 Rust 基金会如何“养大”一门产业级语言 扎克伯格罕见发万字长文:超级智能不能被少数人垄断,必须属于每一个人 3600人、95%覆盖率、24万次拦截:Cloudflare怎么用AI把“提效不降质”变成现实 1.5万星背后:Google首次揭秘Agent Skills是怎么“造”出来的 Go 核心团队公开新提案流程设计:加权投票、多轨评审,能拯救积压的近千个提案吗? Go 密码学前掌门人亲自提案:crypto/passkey 要把“免密登录”这件事一次性做对 Rust官方发文:AI 可以审代码,但不能写代码 AI智能体的记忆,终于有人认真研究“文件系统”这条路了——新论文给出五个反直觉答案 三年磨一剑!Go 桌面框架 Wails 发布 v3公测版:多窗口、AST 绑定、透明构建系统一次到位 Go 正在背离初心?一条 Reddit 热帖,暴露了 Go 社区最深的分歧:简单,到底能坚持多久? ccsa:给 Claude Code 的 session 起个人类可记的名字,一键 resume 谷歌重磅论文:多智能体不是万能药!260组实验实测出AI 智能体的第一条“缩放定律” YC亲自下场开源内部Harness:QM,一个“多人在线”的公司级Agent操作系统 前谷歌工程师万字拆解:AI替你写代码的时代,你更需要写好一份设计文档 隐退三年后杀回来:HashiCorp创始人官宣二次创业,这次要做「万物的多路复用器」 Thoughtworks最新报告:代码生成不再是瓶颈,“没人能验证”才是! 刚刚,MCP协议迎来“史上最大更新”:State彻底消失,Claude率先适配支持 Go 1.28 大动作:泛型集合终于要进标准库了,Set、树形Map、堆一次性标准化 上次说“没有靠谱的尺子”,这次 Dex Horthy 找到了一把——Opus 5 实测通过率只有 24% AI 写了 75% 的代码,工程师却越来越慌:“黑灯软件工厂”的问题不在 harness,而在模型本身 不用 Python,也能训练大模型:两年之后再看 Go 语言机器学习框架 GoMLX 重磅!Tokio官方发布全栈框架Topcoat:不用WASM,AI时代Rust也能“糊”网页了 软件工厂的明与暗:当代码可以自动生产,人类为何必须留下一盏灯? Twitter之父再出手:Block开源Buzz,要让人类和AI Agent「同工同权」 Go 密码学维护者放大招:把 Passkey 存成一行字符串,还顺手为 Go 1.28 写好了 API Loop Engineering才火两个月,硅谷已经卷出“Graph Engineering”了 我开源了 cc-session-migrate :让 Claude Code 会话在多台机器之间自由迁移
百万行代码,两周搞定!Anthropic揭秘AI代码迁移六步法:秘诀...
Tony Bai · 2026-07-25 · via Tony Bai

本文永久链接https://tonybai.com/2026/07/25/ai-code-migration-claude-code-six-steps

大家好,我是Tony Bai。

导读:代码语言迁移,曾经是工程团队避之不及的“三年之痒”项目——耗资数百万美元、耗时数年、还可能烂尾。但Anthropic最近披露,公司内部工程师用Claude Code在一个月内完成了10个代码包的迁移,其中包括Bun联合创始人Jarred Sumner把百万行Zig代码迁移到Rust,只用了不到两周;Labs联合负责人Mike Krieger把一套Python代码库迁移成16.5万行TypeScript,只花了一个周末。这背后到底是什么样的方法论?答案出人意料:真正的关键不是让AI“改代码”,而是让AI“改生产代码的流程”。

文章要点:

  • Anthropic工程师一个月内用Claude Fable 5和Claude Opus 4.8迁移了10个代码包,规模从数万到数十万行不等;
  • Bun百万行代码从Zig迁移到Rust,不到两周完成,CI测试100%通过后才合并;
  • 迁移后内存占用从6745MB降至609MB,暴降91%;二进制体积减小19%;性能提升2%至5%;
  • Mike Krieger一个周末把Python代码库迁移为16.5万行TypeScript,动用了数百个智能体、8个阶段关卡、3轮对抗式审查;
  • Anthropic总结出可复用的“六步迁移法”,并开源了配套的迁移工具包;
  • 核心方法论:不要试图直接修好代码,而要修好“产出代码的那个循环”。


一个周末,16.5万行代码。

这不是某个创业公司连夜赶工的产物,而是Anthropic Labs联合负责人Mike Krieger,把一套Python代码库完整迁移成TypeScript所花的时间。整个过程动用了数百个智能体、8个阶段关卡、3轮对抗式审查,最后还有一轮把每一条命令的输出结果都和Python原版逐一比对的“一致性核查”。

几乎同一时间,Bun联合创始人、现Anthropic技术成员Jarred Sumner,用Claude Code把Bun这个拥有百万行代码的项目从Zig迁移到了Rust。整个过程不到两周,合并前Bun原有测试套件100%通过CI。合并之后陆续发现了19个回归问题,也已经全部修复。

在过去,这种规模的语言迁移是工程团队想都不敢想的“多年工程”,动辄需要三到四百万美元的人力投入,跨越数年时间。而现在,Anthropic的工程师在一个月内,靠Claude Fable 5、Claude Opus 4.8和动态工作流(dynamic workflows),一口气迁移了10个代码包,规模从数万行到数十万行不等。

Anthropic把这套方法论写成了一篇详细的复盘文章。今天新智元就来拆解一下,这套“六步迁移法”到底是怎么把不可能变成可能的。

为什么现在是迁移语言的好时机

先说清楚“为什么”和“什么时候”,而不是急着讲“怎么做”。因为这类项目的成本账本,已经彻底变了。

团队启动语言迁移,通常是因为最初的技术选型和现在的项目需求之间出现了错位:要么当初的权衡取舍如今变成了掣肘,要么出现了更好的方案,要么原有的技术生态正在萎缩。

Jarred当初选择Zig,是因为它兼具C语言级别的性能和极致的简洁性——这对于一个人在奥克兰的小公寓里、在LLM出现之前独自写Bun的创始人来说,是最合适的选择。但这份简洁性也带来了众所周知的代价。

时间快进到2026年,Bun的CLI月下载量已经超过1000万次,并且在Claude Code内部被大量使用。放在一个季度以前,这些代价还不足以让团队冻结路线图、投入巨大资源去做一次跨季度的大迁移。语言迁移固然能带来更小、更快、更安全的系统,但没人愿意为此买单。

工程师们过去还要承担这类超级项目本身自带的职业风险:维护两套并行代码库长达数个季度甚至数年,如果最终结果只有90%的行为一致,那你的麻烦只会比开始时更大。

而现在,最坏的结果不过是删掉分支,重新再来一次。

当然,商业上的理由依然要站得住脚。虽然百万行级别的迁移不再需要三四百万美元、耗时四年的投入,但依然需要数万到数十万美元不等的成本。以Bun的迁移为例,整个项目消耗了59亿个未缓存输入token和6.9亿个输出token,按API定价计算大约花费16.5万美元。Mike的迁移主体部分则消耗了2700万token。

但迁移的理由不再需要是“生死攸关”的。 一年里changelog上反复出现的内存bug、一个长期存在的性能瓶颈,如今就足以构成迁移的理由。

Mike这次项目的导火索,正是一个编译环节。他团队维护的内部工具以单一二进制文件的形式分发给用户,用Python工具链构建这个二进制文件,每个平台大约要8分钟,整个构建矩阵每次发布加起来要等30分钟。迁移之后,同样的编译过程只需要大约2秒,二进制启动速度提升了6倍,团队甚至因此得以下线一整条独立的部署流水线。

Claude Fable 5是Anthropic目前能力最强、已经公开可用的模型。Fable和Opus 4.8尤其擅长的,是在多条并行任务线之间分派、指挥、验证子智能体的工作,并且能找到多条通往目标的路径。

大规模代码迁移之所以特别适合交给这类高阶模型来做,原因有五点:

  • 工作本身是并行的。工作可以拆分到成千上万个独立单元(比如文件、crate)上同时执行,智能体之间不需要互相等待;
  • 上下文清晰完整。旧代码本身就是一份绝佳的需求文档,同时也是构建翻译规则手册的核心参考;
  • 有天然的裁判。大多数大型代码库都自带测试套件,可以直接用来验证智能体的工作。当验证标准是客观的,模型可以连续几天对着一个“标准答案”死磕,而不需要人来仲裁质量;
  • 任务队列会自己生成。编译或者测试一旦失败,失败项自然就成了下一个待修复的任务;
  • 具备一致性和边界情况处理能力:整个流程被设计成让“偏差无处遁形”——审查者对每一条意见都要引用背后的规则,一次违规就变成了队列里的一个任务,而不是悄无声息的分歧。当智能体真的碰到边界情况时,这次的修复方式会变成后续所有智能体都要遵循的新规则。

后文会看到,Mike和Jarred都在关键步骤里用到了Fable,尤其是一种“顾问模式”——用不同档位的模型组合,来优化token消耗。

核心方法论:别修代码,修流程

这是整篇文章最重要的一句话:

你不是在修代码,你是在修产出代码的那个循环(loop)

也就是说,AI代码迁移的本质,不是让模型逐文件地“翻译”代码,而是工程师去写迁移规则和验证循环,然后让智能体在这套循环里不断翻译、编译、测试,直到新代码的行为和原代码完全对齐——把原本要跨越数年的项目,压缩进几周之内。

开始之前:先造一个“裁判”

在动手迁移之前,必须先有一套能公平评判“原始代码”和“目标代码”的裁判系统,否则你既没有退出条件,也没有成功的衡量标准。

用原语言写的测试套件,往往依赖只存在于原语言里的内部函数,这些函数在目标语言里根本不存在。所以要先做三件事:

  1. 给现有测试分类。用Claude识别哪些测试可以表达成外部调用,哪些依赖无法迁移的内部实现;
  2. 为可移植性重写测试。把面向外部的测试,改写成可以同时跑在原代码和迁移后代码上的断言,并用对抗式智能体验证改写后的测试没有削弱原有的判定标准;
  3. 验证这个裁判本身。先跑一遍原始代码确认能通过,再跑一遍故意写坏的代码确认能失败——一个抓不住“坏代码”的裁判,就不是合格的裁判。

Jarred手里有一套用第三种语言(TypeScript)写的大型测试套件,但大多数项目不会有这种条件。Mike则是为他的Python到TypeScript迁移,专门造了一套包含7个真实场景的一致性核查工具,任何行为上的变化都被当作bug来修复。

六步迁移法完整拆解

整个流程分为六步,其中Jarred的方法论更接近“结构保留式”迁移(每个阶段都有审查和关卡),Mike则是把整个迁移端到端跑一遍、根据结果修改规则和工作流、再跑一遍——每次都推倒重来,直到第三次才保留结果。

第一步:规则手册、依赖地图、差距清单

这一步是在打地基:找出哪些代码需要重构而不只是翻译,制定一套翻译规则手册,再画出依赖地图,用来确定并行迁移的先后顺序。

顺序很重要:规则手册要先于差距清单。

差距清单本质上是“规则手册默认规则覆盖不到的部分”,两者要放在一起联合审计。

规则手册的具体形态,取决于一个关键的架构决策:新代码是保留原有结构,还是彻底重新设计?

如果是前者(如Jarred的做法),规则手册主要就是在不同语言之间做类型和习惯用法的对照表,遇到难翻译的部分就指向差距清单。如果是后者(如Mike的做法),规则手册就变成了一份设计文档。

Jarred的做法是直接和Claude对话,为每一处存在歧义的地方形成一条明确的策略,同时用8个子智能体,专门针对他凭经验总结出的8类常见失败模式做审查。

依赖地图方面,你需要理解文件之间的依赖关系,才能合理拆分并行迁移的工作流,知道哪些文件要先迁移、哪些文件要归入同一批次。有些语言和代码库有明确的依赖清单,但对于遗留代码库以及C/C++、Python这类常见语言来说,这些依赖关系往往需要靠工具去发现和梳理。Claude Code可以部署智能体,编写并运行一个确定性脚本来生成这份依赖地图。

差距清单和“怀疑论”审查者方面,新语言相比旧语言总会有一些新的硬性要求。比如从Zig到Rust,最大的差异就是手动内存管理(这一点C和C++也是同样的问题):

Zig:

fn readConfig(allocator: std.mem.Allocator) ![]u8 {
    const buf = try allocator.alloc(u8, 1024);
    // ...fill buf...
    return buf; // caller must free this  but only the comment says so
}

// 调用者忘了 'defer allocator.free(buf)' 依然能编译通过——内存泄漏只会在运行时暴露

Rust:

fn read_config() -> Vec<u8> {
    let buf = vec![0u8; 1024];
    // ...fill buf...
    buf // 所有权转移给调用者,内存自动释放
}
// 用完之后还想用?重复释放?两种情况都编译不过
// 忘记释放?根本没有free调用需要你去忘记,drop是自动的

而从Python到TypeScript,差距则体现在接口和契约上。Python不要求声明一个对象接受什么形状的数据、返回什么类型,但TypeScript要求:

Python:

def register(handler):
    handler.setup()
    return handler.run({retries: 3})

# 任何有 .setup() 和 .run() 方法的对象都能传进来。到底哪些对象会被传进来?得读完整个代码库才知道

TypeScript:

interface RunResult { ok: boolean }

interface Handler {
    setup(): void;
    run(opts: { retries: number }): Promise<RunResult>;
}

function register(handler: Handler): Promise<RunResult> {
    handler.setup();
    return handler.run({ retries: 3 });
}

// 契约必须先写清楚,代码才能编译通过

Jarred和Mike都建了差距清单文件,把这些隐性知识记录下来。区别在于,Jarred是提前把这些差距梳理清楚,Mike则是先翻译、再通过事后审计的方式生成差距清单——实际项目中,你可能两种方式都需要用到。

第二步:压力测试规则

这一步相当于给正式迁移做一次“下水前的试航”,是一次小规模的迷你迁移。

Jarred的做法是:一个智能体按照规则手册翻译3个文件,另一个智能体“像一名资深Rust工程师”那样翻译同样的3个文件,第三个智能体负责对比两者的差异,生成新的翻译规则。就是在这一步,他发现了两个关键问题——如果不提前发现,这两个问题一旦扩散到全部1448个文件,后果不堪设想。

需要注意的是,这种压力测试只适用于“保留结构”的迁移,也就是同一份文件的两种翻译版本可以逐行对比的情况。如果你的规则手册本质上是一次重新设计(就像Mike那样),等效的做法是直接用对抗式审查者攻击设计文档本身,再用一次可丢弃的端到端试跑来验证。

无论哪种方式,这一步翻译出来的文件都要全部扔掉——目的是打磨规则,而不是取得实质性进展。

第三步:全量翻译

从这一步开始,后续几个阶段都会重复同一套多智能体循环架构:实现、审查、修复。

实现类的工作可以交给较小的模型,审查类的工作留给更大的模型。比如Mike在主体迁移阶段,用Claude Sonnet铺开了12个子智能体。

任务队列的运转应该是机械化的:批处理脚本通过检查磁盘上翻译文件是否存在来判断任务是否完成,然后把待处理的文件切分成批次分配给负责实现的智能体。由于队列每次都是从磁盘状态重新构建的,整个迁移天生就是可断点续跑的。

在这个阶段,智能体有时会过于谨慎,不敢下手改动太多。解决办法很直接:用一句直白、强硬的提示词告诉它,编译器会在下一步帮你兜底纠错。

任何翻译智能体没有把握执行的地方,都会被标记为 // TODO(port): <原因>,留到第四步处理。从这里开始,待办清单基本可以自动生成:编译器会列出错误,冒烟测试会揪出崩溃,测试套件会报告失败项。

两个对抗式审查者会在各自独立的上下文中评估实现智能体的工作成果,一旦两者意见不一致,就交给第三个智能体裁决。当某个审查者反复在不同文件里抓到同一类错误时,解决办法不是逐文件修补,而是在规则手册里加上一句话,重新生成受影响的那批文件。规则手册在这一步会持续扩充,代码本身永远不会被拿去“手动打补丁”对抗规则。

关于这一步有个值得注意的设计决策,是编译器放在流程的哪个位置。Mike选择在每一轮循环里都跑一次TypeScript编译器,因为它几秒钟就能检查完一个单元;Jarred则完全把编译器排除在这一轮循环之外,留到下一步,因为cargo编译要花几分钟。

到这一步,大部分繁重的工作已经完成,提示词也开始变短。

第四、五、六步:编译、运行、行为对齐

这三步共享同一套循环架构,需要的人工判断也逐步减少,所以放在一起讲。第四步在某些语言和规模的迁移里,甚至会直接融入第三步。

具体要不要跑这一步,取决于编译环节的规模和难度。Jarred的做法是用一个编排脚本,对整个工作区一次性调用编译器,“修复智能体”再并行处理错误列表并进行对抗式审查,然后重新构建,如此循环。

审查错误列表本身也很有价值,可以发现需要系统性调整的问题。比如Jarred遇到过成千上万个Rust模块错误,这些错误是在修复Zig原本靠“惰性编译”容忍的循环导入问题后才暴露出来的。他的解决办法是编写一套分类逻辑,用来判断某个依赖关系应该删除、移动,还是重新划定边界。

第五步同样有一个机械化的判断依据,类似编译器错误列表——冒烟测试中出现的崩溃。这里的循环修复方式也是把问题按根因分类,再交给对抗式子智能体审查。

第六步,也是整个故事的收尾,是对比两套代码库的行为表现。

此时文件已经完成翻译、编译和冒烟测试,接下来要把它们分片,用第一步准备好的测试套件跑一遍。用“修复智能体”处理失败的测试,对照两套代码库找问题,对抗式审查者再检查这些修复是否合理。

这个循环的下一个环节是一个构建守护进程(build daemon),它是唯一被允许重新构建二进制文件的进程。修复智能体只负责写补丁,守护进程负责批量处理这些补丁、统一重新构建、重跑受影响的测试,再把结果反馈回去。这样做的目的,是把最昂贵的操作串行化,避免多个智能体各自触发重复构建。

当同一个失败反复出现在很多测试里时,修复方式会上移一层:直接修改产生这个bug的规则,只重新生成这条规则影响到的文件。

Mike的做法在这里特别值得参考,因为大多数开发者手里并没有现成的、已经迁移好的测试套件。Mike让Claude写了一个小脚本,用7个真实场景分别跑一遍新迁移的版本和原始Python代码库,再比对结果差异。每个失败的场景都配一个专属的修复智能体,循环运行直到7个场景全部通过。

然后他又往前多走了一步:让Claude自己设计一套端到端测试套件,连续四个晚上自主运行、自动修复出现的问题。正是这一步,抓到了任何场景清单都不可能预先想到的各种细枝末节的问题。

这里的启示是:没有现成测试套件,不该成为这一步的绊脚石。 如果你继承不了一个现成的裁判,那就让Claude自己造一个。不管怎样,你的原始代码库始终是那个“绝对真理”。

代码迁移最佳实践

每一次迁移都会教会团队一些上一次没学到的东西,你的下一次迁移大概率也会教你这份指南里没写的东西。但以下几条原则,在每一个项目里都成立:

  • 不要照本宣科。每一次迁移都不一样。把这份指南当作起点,在真正动手之前,先和Claude一起规划你自己的迁移方案;
  • 不要盯着单个失败不放。处理单个失败是循环该干的事,修复智能体会负责把这些失败一个个消灭掉。你的注意力应该放在“规律”上;
  • 让审查对抗化,让验证机械化。对抗式审查能支撑更长时间的任务运行,多花一些token往往是值得的。让脚本——编译器、diff、测试套件——去当裁判;
  • 不要什么都用最大的模型。token消耗集中在你的循环里,所以要有意识地设计。较小的模型足以胜任大批量的实现工作,把最强的模型留给审查者,以及那些会为其他智能体制定规则的关键节点;
  • 把人力前置。规则手册和压力测试阶段最耗人力,后面的环节基本就是看着任务队列自己跑完;
  • 让任务队列机械化、可断点续跑。“完成”的定义应该就是“输出文件已经存在于磁盘上”。

复盘:这次迁移到底值不值

Jarred的Bun迁移项目现在已经在生产环境跑着,当然任何迁移都会有取舍——比如大约4%的Rust代码位于“unsafe”代码块内,主要是C/C++边界上的单行指针操作。

但新代码库在各项指标上都有可衡量的提升:团队工具能检测到的每一个内存泄漏都已修复,一项针对2000次重复构建的基准测试显示,内存占用从6745MB降到了609MB。二进制文件在Linux和Windows上体积缩小了19%。跨语言优化还带来了2%到5%的性能提升,覆盖HTTP服务和next build、tsc这类真实工作负载。

Anthropic给出的建议很直接:重新算一算你那个被长期搁置的迁移项目的账。 挑一个你已经忍了很久的代码库,问问Claude,这个项目的迁移流程会是什么样的。


延伸阅读:

本文编译整理自Anthropic官方博客文章《How Anthropic runs large-scale code migrations with Claude Code》,原文发布于2026年7月16日。


还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 从0 开始构建 Agent Harness 将带你:

  • 抛弃臃肿框架,回归“驾驭工程 (Harness Engineering)”的第一性原理
  • 用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等,复刻极简OpenClaw
  • 构建坚不可摧的 Safety Middleware 与飞书人工审批防线
  • 在底层实现 Token 成本审计、链路追踪与自动化跑分评估
  • 从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”

扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。