回到三十年前（一）COBOL

世界潮流，浩浩荡荡，顺之则昌，逆之则亡。2023 年的前几个月在 LLM 的加持下仿佛 “天上一天，地下一年” 。然而这种飞速的发展不由得令人无限焦虑，于是我决定写一系列文章来缓解自己的焦虑，让自己回到三十年前，去感受 “慢生活” 的悠闲。

才不是因为总有人找我用奇奇怪怪的语言写奇奇怪怪的东西呢。

COBOL 是什么

COBOL 的全称是 Common Business Oriented Language 即常规商业信息处理语言，COBOL 往往用于金融行业和会计行业等商业数据的处理。从今天（2023 年）来看，COBOL 语言或许已经走在消亡的道路上，但仍旧有许多的金融核心系统仍在使用 COBOL。这里面主要有两个原因，一个是 COBOL 本身稳定性较强，另一个便是更改旧有系统的代价太高（也就是说，在很多场景下使用其他语言重构这些系统并不划算）。
这个系列文章的 COBOL 部分将简要的介绍 COBOL 的基础，做一个简易的 COBOL 教程。（当然，我并不赞成花过多的时间研究 COBOL，毕竟这门语言的最终归宿是成为赛博化石。）

迈出第一步

提到 COBOL 就不得不提到 IBM 和大型机。COBOL 语言是在大型机上运行的，但是如果我们没有大型机就无法运行 COBOL 吗？实际上并不，我们现在有各种方法可以模拟大型机，让我们的程序在个人电脑运行。如果你真的打算尝试一下 COBOL，可以参考下下面的教程配置：

https://www.geeksforgeeks.org/how-to-install-cobol-on-macos/

https://ibm.github.io/zopeneditor-about/Docs/interact_zos_zowe_explorer.html#setting-up-and-using-profiles-in-zowe-explorer

https://www.youtube.com/watch?v=RdMAEdGvtLA&t=478s

Hello COBOL

每一个编程语言都要有 hello world，那么 COBOL 当让也不例外。但是由于 COBOL 的特殊性，我们要先了解下对于一个完整的 COBOL 程序的结构是如何的。

这幅图从上到下是包含关系，也就是说：

program 由多个 DIVISION 组成

DIVISION 由多个 SECTIONS 组成

......

Copy
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. HELLO.
000300 ENVIRONMENT DIVISION.
000400 DATA DIVISION.
000500 PROCEDURE DIVISION.
000600 DISPLAY 'HELLO WORLD'
000700 STOP RUN.

从这段简短的程序我们便可以感受到，COBOL 的语法和如今我们接触的程序不太一样，反而具有很强的汇编既视感。从这门语言的诞生时间来看，这并不让人意外。我们接下来要分解下这段程序的结构。我们首先看单独的行：

COBOL 程序的格式要求比较严格，对于每行可以分解成五个部分：

1 ～ 6 列 是序列区，用于标识行数序号

第 7 列 是标志区，如果该位置为 * 则表示这行是注释，- 表示延续，/ 表示换页

8 ～ 11 列 所有 COBOL 部，节，段和一些特殊条目必须从 A 区开始。

12 ～ 72 列 所有 COBOL 语句必须从区域 B 开始。

73 ～ 80 列 可以根据程序员的需要使用，在这里添加修改码等标识。

IDENTIFICATION DIVISION. 声明标识部
ENVIRONMENT DIVISION. 声明环境部
DATA DIVISION. 声明数据部
PROCEDURE DIVISION. 声明过程部

一个 COBOL 程序必须要有标识部，但可以没有环境部和数据部。
我们来分析程序中除了部段声明的部分。
其中 PROGRAM-ID xxxxx. 表明该程序的 ID（可以理解成为程序的标识符）。
DISPLAY 如同 python 的 print，将后续的内容打印出来。
STOP RUN. 表示程序的结束。

对于 hello world 程序，我们可能还无法将之与前文的 COBOL 程序结构对应起来。这是因为该 COBOL 程序不需要读写文件，甚至不需要存储任何中间变量，故很多声明被省略了。我们将在下次的文章中完整的介绍一个程序。