AI 自主完成代码迁移,开发者只需在关键节点审核
Anthropic用Claude Code实现了一套代码迁移流程:AI可以自主完成从规划、翻译、编译到行为验证的整个链条,开发者只在几个关键节点做决策和审核。
这套流程被概括为六个步骤,但真正的起点不是步骤一,而是一个严格的前提。
迁移前:必须有评判标准
流程的核心条件是一个强大的“评判标准”(judge)——用来判断原始代码和目标代码行为一致的工具。没有它,你就没有成功的度量,也没有退出条件。
构建评判标准的方法是:先对现有测试分类,再改写成可移植的断言,最后验证这个标准是否真的能抓到行为差异。Jarred(Bun的创建者)有一个用TypeScript写的大型测试套件,但大多数项目不会这么幸运。Mike在做Python到TypeScript迁移时,就自己创建了一个包含7个真实场景的奇偶校验框架,并把任何行为变化当作需要修复的bug对待。
这个前置工作几乎全是人工的。它决定了后续AI执行的可靠性。
步骤1:创建规则手册、依赖映射和差距清单
规则手册的形状取决于一项关键决策:新代码是保持原有结构,还是完全重新设计。如果是前者,规则手册是翻译指南;如果是后者,规则手册就是设计文档。
Jarred用跟Claude聊天的方式创建了规则手册,为每类模糊地带制定应对策略。他还用了8个子代理专门审查8种常见的失败模式。依赖映射可以用Claude Code部署代理来生成确定性脚本。
最微妙的是差距清单——它捕获新旧语言之间的隐式知识差异。比如从Zig迁移到Rust,差距是手动内存管理;从Python迁移到TypeScript,差距是接口和契约。这些差异不会写在文档里,但AI能识别出来。
注意:文章提供了一份通用的迁移入门工具包,但那是模板,不是具体项目中实际运行的版本。
步骤2:用迷你迁移来压力测试
规则手册不能直接投入全量翻译,必须先在小范围上验证。Jarred的做法是:用一个代理按规则手册翻译三个文件,用一个代理“像资深Rust工程师一样”翻译三个文件,再用一个代理通过对比差异来生成新规则。这一步他抓住了两个关键问题。
这个压力测试只适用于结构保留的迁移。如果规则手册是重新设计(像Mike的案例),就要用对抗性审查来攻击设计文档,然后通过一次性端到端运行来验证。
步骤3:全量翻译——多代理循环架构
从这一步开始,流程进入相同的循环架构:实现、审查、修复。
实现工作可以卸载到较小的模型,审查则用较大的模型。Mike在主迁移中用了Claude Sonnet和12个子代理。工作队列是机械的:批处理脚本检查翻译文件是否存在,把待处理文件切片成批次。翻译器遇到无法自信执行的内容,会标记为 // TODO(port): <reason>,留到下一步处理。
审查环节采用对抗性方式:两个审查员用不同上下文评估实现者的工作,意见不一致时交给第三个代理。如果审查员在多个文件中发现了相同的错误,不逐个修复,而是往规则手册里加一句话,然后重新生成受影响的批次。
Mike在每个循环中都跑TypeScript编译器,因为检查一个单元只需几秒。Jarred则把编译器推迟到下一步,因为cargo编译一次需要几分钟。
步骤4、5、6:编译、运行、行为匹配
这三个步骤共享同一个循环架构,但需要的人工判断越来越少。
步骤4中,Jarred用编排器脚本在整个工作区调用编译器一次,然后用“修复代理”并行处理错误列表。他遇到了数千个Rust模块错误——原因是Zig的懒惰编译容忍了循环依赖,但Rust不行。他通过编码逻辑来对依赖进行分类(删除、移动或重构边界)才解决了这个问题。
步骤5的机械信息来源是冒烟测试的崩溃。步骤6则比较两个代码库的程序行为:把文件分片,运行测试套件,修复代理审查失败测试,对抗性审查员检查修复。Mike的方法更简洁:让Claude创建一个小脚本运行7个真实场景,对比新端口和原始Python代码库,再diff结果。
最令人印象深刻的是:Claude自主设计了一套端到端测试套件。连续四个晚上自动运行,发现问题就修复,然后重新运行,完全没有人工干预。
人的角色
整个流程中,人的工作集中在几个节点:制定规则手册、构建评判标准、对抗性审查设计文档、更新规则手册。AI负责执行翻译、编译、测试和修复,人做的是决策和审核。
最佳实践也确认了这一点。不要盲目遵循指南,关注模式而非个别失败。使审查对抗性、验证机械。不要对所有任务使用最大模型。前置人工时间。使工作队列机械且可恢复。审查循环结果而非代码。
实际效果:Bun迁移的案例
目前最完整的成果是Jarred的Bun迁移,已经投入生产。迁移后的Rust代码中约4%位于“unsafe”块,大多是C/C++边界上的单行指针操作。
性能提升相当显著。在一个2000次重复构建的基准测试中,内存使用从6,745 MB降到609 MB,降低了90%。二进制在Linux和Windows上缩小了19%。跨语言优化让HTTP服务和真实工作负载(如next build和tsc)速度提升2-5%。
文章同时提供了迁移入门工具包和代码现代化插件的链接,给想要尝试的团队直接使用。