用 GPL 工具实现 COBOL 到 Java 自动移植

  • Dio Synodinos
  • 宋玮

2009 年 7 月 7 日

话题:Java语言 & 开发文化 & 方法

Publicitas 有限公司运作NACA 项目期间,4 百万行的 COBOL 代码被自动转换(移植)成 Java 代码。该公司宣布因此每年节约的现金有 3 百万欧元之多,并决定以 GPL 许可协议发布该项目工具

Didier Durand 和 Pierre-Jean Ditscheid 上周在 Jazoon09 大会上做了一个有关于此的演讲,这一讲稿可以从这里在线访问。

Pierre 描述了这一“代码转换编译器”的架构

  • 运用若干层 cache 来最大限度提升这一老应用程序新 Java 版本的性能。通过这些 catch,转换成 Java 代码的事务处理和批处理比原先在大机上运行的 Cobol 程序性能更优。
  • 通过对所有程序可变结构(COBOL 的 COMMAREA)进行预分配来进一步提升性能,并且将运行过程中垃圾回收对系统的性能影响降至最低。
  • 采用 Java 强大的面向对象架构,使编译器所做的所有控制效果最大化。例如,每个老 COBOL 程序变成了一个 Java 类,该类的存在性是在编译时检查的而非在运行时检查。当应用程序如我们这个有 4 百万行代码、并且你想在一个像我们这样的持续集成架构中追踪每种类型错误时,这就非常有用了。
  • 与 Eclipse IDE 紧密集成,给开发者提供更高的开发效率:我们甚至开发了一个插件,以方便在 Eclipse 中调式并编辑老 COBOL 程序。
  • 老 COBOL 程序和新转换的 Java 类之间逐行对应。普通开发者不会迷失:他们获得的 Java 应用程序与原始 COBOL 版本的结构非常相似。
  • 对 IBM JVM 和 SUN JVM 都提供支持,以便进行存储过程转换。
  • 支持大机系统和 Linux 之间完全不同的字符集和编码模式(EBCDIC)。支持数据排序的所有可能性。
  • 在 Java 里能够完全管理多层级 COBOL 数据结构,不依赖于 Java 所使用的 UTF 编码(每字符 2 字节)。
  • 对应用程序的透明封装框架(JVM、Apache Tomcat 等等)
  • 等等……

Didier 还强调了这个项目的关键方面:

  • 经济动因是核心驱动力:从一个价值数百万(瑞士法郎或欧元)的大机环境移植到极为便宜且灵活的基于 Intel 的服务器(Linux)。可观的成本节约(我们的案例是每年 3 百万欧元)使得项目远在其结束之前就可快速自我融资(auto-financing)。对于我们这样的公司来说,开源的主要优点就是价格非常低廉。
  • 人们的技术迁移:我们认为我们的项目会获得成功,因为我们很早就向人们说明了他们最终将会找到一个有意思的新工作。正是这一点推动他们全力以赴投入项目!
  • iso 功能性是必备的:以这种方式迁移避免了对最终目标的成月讨论。但最主要的是它允许 100% 的自动迁移,这是代码转换过程中的一个关键的质量因素。
  • 不要大改,而要采取很多可逆步骤:全部迁移包含有成千上万新步骤,如果你试图大跃进,则可能永远也无法成功。朝着目标持续增长的过程是更好的方式。其好处是:当出现问题时,小步骤所产生的本地问题也更小。用这种方式,你的用户更容易接受!我们的经验就是如此……

工具可从这里下载其发行物包括

目前我们交付的工具 (v1.0) 是 zip 包形式:

  • Doc:一套解释工具及类库细节的文档。你们对这一文档、及其错误的有关反馈等等将有助于我们对其做出改进。
  • NacaTrans(GPL 许可——大约 83000 行代码及 690 个 Java 类):我们的代码转换器使我们可以 100% 自动把 4 百万行用 COBOL 编写的 PUB 2000 应用程序代码转换成 Java 程序代码。这完全建立在编译器技术之上。NacaTrans 分析初始 COBOL 程序的结构(假定 100% 正确),把它们变成中间的 xml 结构,然后产生最终 Java 代码。所产生的 Java 代码调用了大量函数并使用了运行时类库 NacaRT(该类库以来于 JLib)的许多类。这些新的 Java 源代码经过非常仔细的设计:每行 Cobol 有意对应了一行 Java。其目标是使代码看起来尽量像原始的 COBOL 代码,以便于原始开发者 / 掌握了原始 Java 程序结构的维护者进行维护。我们无法保证 Cobol 语法的所有变种都得到支持。但是我们的 4 百万行代码及在其他外部应用上的测试证明了当前 NacaTrans 的覆盖面已经非常高了。我们希望你能把我们不支持的有效构造反馈回来,以帮助我们提高这一覆盖面。
  • NacaRT 和 Jlib(LGPL 许可——大约 153000 行代码及 890 个 Java 类):这是两个运行时类库,为应用程序提供了所有运行时事务服务。它们模仿了类似 IBM CICS 的经典事务监视器的所有功能。同时,它们还支持所有 COBOL 构造(例如,拥有多种数据表现的 COMMARÈA 结构,特殊数据格式如 COMP-X 的管理等等。
  • NacaRTTest(GPL 许可):这是一个测试套件,让我们可以在一套参考 COBOL 构造上来测试代码转换器的对应输出。这是我们校验部分代码转换算法的方式。对于 NACA 的新用户来说,这里是最佳起点:当其运行在你的底层架构上时,你会对你安装的这个包相当有信心。

由于 COBOL 有 50 多年的遗留资产以及大约2500 亿行 Cobol 代码,看起来类似的工具还有相当大的市场。

查看英文原文:COBOL to Java Automatic Migration with GPL'ed Tools

Java语言 & 开发文化 & 方法