世界潮流,浩浩荡荡,顺之则昌,逆之则亡。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 组成
- ......
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 程序不需要读写文件,甚至不需要存储任何中间变量,故很多声明被省略了。我们将在下次的文章中完整的介绍一个程序。