关键要点
- 自动化代码迁移可以生成符合目标语言习惯的可维护代码,而不仅仅是笨拙的逐行翻译
- 分步流水线方法允许将迁移分解为可验证的阶段
- 迁移管道可以根据组织的具体目标、需求和偏好进行定制,而非遵循一刀切的过程
- 设计迁移在概念上类似于构建编译器:这是一个系统化的工程过程,而非仅限于内行人士的黑魔法
- 使用LionWeb等开放规范表示管道的中间状态,可以在每个处理阶段使用现有工具进行检查、调试和验证
语言迁移的重要性:遗留系统约束、技能短缺和现代化目标
当系统在RPG、COBOL、Visual Basic 6或SAS等遗留技术中实现时,组织面临几个障碍:
- 具备所需技能的开发人员变得稀缺
- 与现代语言相比,生态系统有限
- 与当代平台的集成变得越来越困难
- 开发范式过时,不适合开发大型系统
- 工具和环境的生产力低于现代语言可用的工具
构建迁移管道
迁移本质上很复杂,任何通过单一整体工具处理它们的尝试都会迅速导致过度复杂。更可持续和有效的方法是将过程设计为连续、可验证阶段的管道,每个阶段都有明确的责任,并且可以独立理解。
为什么采用管道方法?
- 隔离和测试:管道的每个阶段都可以单独验证
- 可重用性:通用管道组件可以在不同迁移中重复使用
- 定制化:解决方案可以根据每个组织的需求进行调整
- 并行开发:不同团队可以并行处理不同的阶段
- 渐进式交付:管道允许增量测试和验证部分迁移
LionWeb的作用
在迁移管道中,每个步骤——解析、语义增强、分析、代码生成——都会产生系统的新状态。使用语言中立、开放的格式来表达这些状态是有利的,这样许多工具都可以生成和使用。
LionWeb是一个开源计划,旨在为抽象语法树(AST)定义标准表示。使用LionWeb作为交换格式带来几个优势:
- 语言中立表示
- 工具和作者之间的互操作性
- 检查和调试中间快照
核心管道阶段
管道的目的是从遗留系统中包含的原始信息开始,逐步完善理解,并逐渐转向足够完整的目标系统模型以生成高质量代码。
解析
第一步是解析,即为每个源文件生成AST。遗留系统很少由单一语言或文件类型组成。例如,RPG代码库可能包括:
- 用于业务逻辑的RPG源文件
- 定义数据结构的DDS文件
- 编排程序执行的CL脚本
- 偶尔甚至包括COBOL片段或汇编例程
语义增强
下一步是语义增强,它结合了符号解析和类型推断。语义增强还应处理遗留系统中常见的跨语言和跨文件链接。
分析
在增强之后,可以分析模型以检测特定模式和结构。确切的分析取决于源语言:
- RPG中的Goto分析
- RPG数据结构中的覆盖分析
- 模式识别
转换
通过丰富和带注释的模型,管道应用转换规则以生成目标语言中的AST。
精炼
可选地,目标AST经过精炼以使代码符合习惯:
- 添加必要的导入
- 重新排序成员
- 规范化命名约定
- 进行自动增量重构
代码生成
最后,精炼后的AST被传递给代码生成器,代码生成器将它们序列化为实际的源文件。
最佳实践和最终考虑
管道方法提供了几个实际优势,使大规模迁移更加可靠和可管理。
隔离测试每个阶段
管道的主要好处之一是每个阶段可以独立测试:
- 解析步骤可以针对文件语料库进行测试
- 语义增强可以通过检查符号解析统计信息或验证引用和类型是否一致链接来测试
- 分析过程可以分别验证
监控进度
由于迁移运行时间较长,进度跟踪至关重要。每个阶段产生可测量的统计数据,可以显示在仪表板中:
- 解析:成功解析的文件百分比,无法识别的构造数量
- 语义增强:已解析符号的百分比,未解析引用计数
- 分析:分类为循环、中断或继续的GOTO比例
- 转换:支持的构造和代码习惯用法数量
构建模块化管道
另一个优势是模块化。通过标准化中间表示,可以独立开发不同的组件并组合:
- 基于ANTLR、Tree-sitter或其他框架的解析器可以适应发射LionWeb
- 分析模块或符号解析器可以在项目之间共享
- 不同目标语言的代码生成器可以交换或扩展
未来方向和开放挑战
虽然这种方法在实践中已经运行良好,但有些领域需要更多研究来改进现有技术:
- 测试生成:特别是使用高级规范来捕获业务行为并使验证更加稳健
- 自动习惯用法识别:提高检测源代码中高级语言习惯用法的能力
- 精炼和检查工具:扩展对快照可视化、调试和协作验证的支持
最后,重要的是要强调不应依赖什么。多年来,许多迁移项目因两种方法而失败:
- 手动重写,消耗巨大预算并经常因自身复杂性而崩溃
- “一刀切"的工具,承诺神奇的按钮式迁移,但隐藏了无法验证的不透明过程
管道方法提供了几个有价值的品质:它是系统化的、可验证的和模块化的。本质上,它将迁移变成了一个工程过程,而不是一场赌博。