大型主机现代化改造的奇闻异事
主页 / 文章 / 大型主机现代化改造的奇闻异事 查看原文 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 位数”。 该变量的可能值为 0
到 999
!
国际化
下面是 COBOL 中的另一个数据定义,声明了 3 个变量:
01 FOO-PERSON.
05 FOO-NAME PIC X(5).
05 FOO-HEIGHT PIC 9(3).
这意味着:
FOO-PERSON
:一个由两个其他变量组成的“组”变量FOO-NAME
:一个包含 5 个字符的字母数字类型FOO-HEIGHT
:一个包含 3 位数字的数字类型(记住,是以 10 为基数,而不是以 2 为基数)
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-PERSON
和 FOO-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 就是以这个语句命名的!
你好。 订阅 我是 Akshay,程序员,像素艺术家和编程语言爱好者。 我目前正在构建 tangled.sh - 一个去中心化的代码协作平台。 请通过 oppili@libera.chat 与我联系。 主页 / 文章 / 大型主机现代化改造的奇闻异事 查看原文