AI迁移COBOL代码时为何会原样复制三十年前的Bug
在处理一套长达数十年的COBOL遗留系统迁移时,我发现大模型在代码转换过程中的一个关键特性:它并非简单地重构或优化,而是以极高的精度保留原始逻辑,包括那些潜伏已久的Bug。这种“忠诚度”体现在AI会将COBOL中的错误直接映射到目标语言中,前提是新旧语言在该逻辑场景下存在对应的实现路径。
团队最初的期望是AI能够“自动修复”低级错误,但实际结果表明,当前的LLM在跨语言迁移时,其核心行为是语义对齐而非逻辑优化。例如,如果原代码中存在定点数运算的溢出或舍入偏差,AI不会主动调整精度处理机制,而是会在Java中复制类似的计算逻辑。这意味着,如果COBOL代码在特定条件下产生0.01的舍入误差,AI生成的Java代码可能会使用与原始逻辑一致的截断方法(如BigDecimal的截断行为),从而重现相同的计算问题。
这种“精准错误”在金融、保险等底层系统中尤为隐蔽。以一个实际案例为例:原COBOL代码在处理特定定点数运算时,由于语言级别的精度机制,会在特定条件下触发0.01的舍入误差。AI在转换为Java时,为了保持“逻辑一致性”,会生成与原始COBOL代码等效的截断逻辑,导致Java程序在相同环境下复制旧Bug。这种错误在初期自动化测试中往往难以检测,因为测试数据可能无法覆盖到边界条件。
关键在于,AI的迁移过程并未引入新的语言特性或优化规则,而是严格遵循“最大似然”的语义对应关系。这意味着:
- 如果COBOL代码中的错误依赖于特定的数值处理方式(如定点数运算或显式截断),Java代码会复制相同的处理方式,而非采用更合适的浮点或精确计算方法。
- 在涉及
BigDecimal的场景下,AI可能会生成与COBOL原始逻辑一致的精度设置(如setScale(2, RoundingMode.HALF_UP)),从而保留原有的舍入行为。 - 对于逻辑漏洞(如边界条件未处理),AI会在Java中保留与COBOL相同的条件判断结构,而非添加额外的边界检查。
这种机制在技术文档中通常被称为“语义保真迁移”,其核心假设是AI能够“理解”原始逻辑,并将其忠实转换到目标语言。然而,现实中,AI更倾向于复制原始代码的表面结构,而非重新评估其正确性。因此,如果原始COBOL代码存在设计缺陷(如未考虑特定输入范围),AI生成的Java代码会在相同的输入条件下产生相同的输出偏差。
(参考:NVIDIA Nemotron 文档)
