AI迁移COBOL到Java:连bug都原样搬过来了
说实话,看到这个结论我一点不意外。大模型做代码迁移的本质是“照着翻译”,不是“重新设计”——你把COBOL一段算利息的逻辑丢给它,它给你吐出一段长得像Java的代码,但背后那套几十年前的业务假设和边界条件,它一个都不会替你修正。所谓“bugs included”,翻译过来就是:AI把你当年踩过的坑,原封不动地搬到了新系统里。
我特意去翻了那个案例的细节。他们用AI把一处处理账务的COBOL模块迁移成了Java,结果AI不仅保留了原程序里那个“闰年多算一天”的老bug,甚至连Y2K时代的日期处理补丁都当成业务逻辑原样复刻了。更离谱的是,有一段已经死掉的代码路径,AI也在Java里给保留了——逻辑上完全等价,功能上完全没有意义。
这其实暴露了代码迁移的真正风险点:大模型不区分“业务逻辑”和“历史包袱”。你让它“保持逻辑一致”,它就忠实地把逻辑缺陷、废弃分支、临时补丁全都保留下来。你让它“清理代码”,它又可能把那些没写注释但确实在用的隐式约定给丢了。两头都不讨好。
人在这种流程里的角色,不该是“审核AI的翻译结果”,而应该是先定义“哪些是bug、哪些是feature”。我在实际跑这个流程的时候,是先把遗留COBOL程序拆成模块,人工标注出已知bug区域(顺便写进注释里),每个模块单独喂给Claude Code做迁移,跑完单测再合回去。不是做宏大的“全量迁移”,而是做成逐模块的带约束移植——迁移指令里额外加了这么一段:
以下函数包含已知缺陷(见注释),迁移到Java时:
1. 保留业务语义,不修正已知缺陷(除非明确要求)
2. 识别并标记疑似死代码,不自动删除
3. 对日期计算逻辑单独输出警告这样至少能保证AI“翻错了”的时候,你知道它翻错在哪。不然你以为在升级系统,其实是在给五十年前的程序员写的bug续命。
更系统的工具评测汇总在AI工具实测笔记,有不少直接可参考的案例。