主页 / 文章 / 大型主机现代化改造的奇闻异事 查看原文 21/05 — 2025 65.93 cm 3.9 min

大型主机现代化改造的奇闻异事

在上一个工作场所,我编写了从大型机语言(COBOL、JCL、BASIC 等)到 Java 的转译器(或者如果你喜欢,也可以直接称之为 编译器)(使用 Rust!)。

遗留代码充满了惊喜。 在我(不)幸接触到的约 20 万行 COBOL 代码中,我看到了许多精彩的技巧,用于规避系统的局限性。 大型主机也充满了历史。

以 10 为基数的数字

这是我查看 COBOL 代码时注意到的第一件事,COBOL 中的数据定义(即“变量”)声明如下:

         ,-- name        
         |     ,- type   
        __|___   __|_   
      01 HEIGHT PIC 9(3).
      --    ---    
      |     |
      |      `- picture clause (keyword)
      `- level number       

该语句声明了一个名为 HEIGHT 的变量,类型为 9(3),它是 999 的简写,表示“3 位数”。 该变量的可能值为 0999

国际化

下面是 COBOL 中的另一个数据定义,声明了 3 个变量:

01 FOO-PERSON.
 05 FOO-NAME PIC X(5).
 05 FOO-HEIGHT PIC 9(3).

这意味着:

COBOL 有一个有趣的结构叫做 "REDEFINES":

01 FOO-PERSON.
 05 FOO-NAME PIC X(5).
 05 FOO-HEIGHT PIC 9(3).
01 FOO-PERSONNE REDEFINES FOO-PERSON.
 05 FOO-NOM PIC X(5).
 05 FOO-TAILLE PIC 9(3).

FOO-PERSONFOO-PERSONNE 指的是同一块内存区域。

我帮助改造了一个代码库,显然曾经由一家西班牙咨询公司参与开发,他们决定用西班牙语重新定义所有数据定义。

字符串解析

这是另一个有趣的事情:

    01 FOO-PERSON.
     05 FOO-NAME PIC X(5).
     05 FOO-HEIGHT PIC 9(3).
    .
    .
    .
    MOVE "PETER" TO FOO-NAME.
    MOVE 175 TO FOO-HEIGHT.
  *> display the entire memory region
    DISPLAY FOO-PERSON.
  *> PETER175
  *> subscripting the first 7 bytes...
    DISPLAY FOO-PERSON (1:7)
  *> PETER17

因此,数据定义只是描述区域的名称。 这使得一种巧妙的字符串解析方法成为可能:

    01 DATE.
     05 DD   PIC 9(2).
     05 FILLER PIC X.
     05 MMM  PIC A(3).
     05 FILLER PIC X.
     05 YYYY  PIC 9(4).
    .
    .
    .
    MOVE "03 MAR 2025" TO DATE.
    DISPLAY "DAY: "  DD.   *> DAY: 03
    DISPLAY "MONTH: " MMM.   *> MONTH: MAR
    DISPLAY "YEAR: " YYYY.  *> YEAR: 2025
  *> also works:
    MOVE "03-MAR-2025" TO DATE.

提前退出

我会在一些地方看到这种用法;后来我意识到这是一种触发批处理作业异常结束的方式(可能会触发外部作业控制系统中的错误处理例程):

    01 CONSTANT-ZERO S9(9)V9 VALUE 0.
    01 ABEND     S9(9)V9.
      .
      .
      .
    COMPUTE ABEND = CONSTANT-ZERO / CONSTANT-ZERO.

所有的数字

我还没有找到对此的解释,但我曾经找到一个文件,其中定义了前 800 个自然数作为字符串常量:

     01 TC0001 X(5) "00001".
     01 TC0002 X(5) "00002".
     01 TC0003 X(5) "00003".
     .
     .
    *> .... 800 lines later ....
     .
     .
     01 TC0800 X(5) "00800".

该文件肯定不是生成的,而且我无法想象大型机上的文本编辑器有多么先进。

dd - 磁盘毁灭者

JCL 子系统中的 DD 语句代表 "data definition"(数据定义),主要用于描述批处理作业使用的文件和 IO 流。 UNIX 上的 dd 命令 1 就是以这个语句命名的!

  1. 维基百科 - dd (Unix)↩︎

你好。 订阅 我是 Akshay,程序员,像素艺术家和编程语言爱好者。 我目前正在构建 tangled.sh - 一个去中心化的代码协作平台。 请通过 oppili@libera.chat 与我联系。 主页 / 文章 / 大型主机现代化改造的奇闻异事 查看原文