COBOL考古(五)
为什么使用 COBOL?
本章介绍了 COBOL,特别是关于它在企业系统中的使用。
什么是 COBOL?
COBOL 如何在今天使用?
为什么我应该关心 COBOL?
什么是 COBOL?
有一种计算机编程语言是专门为业务设计的,叫做 COBOL,即通用业务定向语言。自 1959 年诞生以来,COBOL 已经在全球范围内改变和支持业务。COBOL 负责处理世界经济的高效、可靠、安全和不可见的日常运营。处理我们最关键数据的日常逻辑通常是使用 COBOL 完成的。
许多 COBOL 程序经过几十年的改进,包括业务逻辑、性能、编程范式以及与事务处理器、数据源和互联网的应用程序接口等方面的改进。
在过去的 60 年中,已经开发了数百种编程语言,期望能够改变信息技术领域。其中一些语言,如 C、C++、Java 和 JavaScript 等,确实改变了不断扩大的信息技术领域。然而,COBOL 仍然以其天生处理存储在最大服务器(例如 IBM Z 主机)中的大量关键数据的能力而与其他编程语言区分开来。
COBOL 不断更新以包括现代化和经过验证的编程范式和最佳实践,因此 COBOL 将在可预见的将来仍然是一种关键的编程语言。学习 COBOL 使您能够阅读和理解关键系统的日常操作。在大型企业中,COBOL 知识和熟练掌握是成为“全栈开发人员”的必备技能。
COBOL 如何在今天使用?
COBOL 无处不在。您可能今天已经使用了用 COBOL 编写的应用程序。例如,考虑以下统计数据:
大约 95% 的 ATM 刷卡交易使用 COBOL 代码。
COBOL 支持 80% 的面对面交易。
每天,COBOL 系统处理 3 万亿美元的商务交易。
COBOL 有多普遍?考虑以下令人震惊的事实:
每天执行的 COBOL 交易次数比 Google 搜索次数多 200 倍。
目前运行着超过 2200 亿行 COBOL 程序,相当于全球 80% 的活跃代码。
每年编写 15 亿行新的 COBOL 代码。
为什么我应该关心 COBOL?
COBOL 编程语言、COBOL 编译器优化和 COBOL 运行时性能经过 50 多年的技术进步,为世界经济的基础做出了贡献。许多大型企业的核心业务逻辑已经经历了几十年的业务改进和调优,这些业务逻辑嵌入在 COBOL 程序中。
关键是 - 无论您读到或听到有关 COBOL 的什么,都要非常怀疑。如果您有机会直接与编写或维护使用 COBOL 处理关键业务逻辑的人合作,那么您将了解核心业务的运作方式。业务经理、业务分析师和决策者来来去去。所有良好的业务决策的总和通常可以在几十年来在COBOL 程序中实施的更改中找到答案。对于“这家企业到底是如何运作的?”这个问题的答案通常可以在 COBOL 程序中找到。
将以下内容添加到您对 COBOL 的认识中。绝对是错误的看法,认为只有年龄至少为 50 岁的人才能精通 COBOL。COBOL 非常容易学习和理解。金融机构之所以喜欢 COBOL,其中一个原因是无需成为程序员就可以阅读和理解这些逻辑。这很重要,因为关键业务逻辑代码要经过审计。审计员不是程序员。但审计员负责确保业务财务报表的公平呈现。经常是 COBOL 处理导致了业务分类帐的更新和随后的财务报表。
现在让我们来看一个现实世界的教训。最近在一家知名的商业杂志中,有人带有可疑动机的评论说:“COBOL 是一种用于业务和金融的计算机语言。它于 1959 年首次设计,相当古老且缓慢。”一位经验丰富的商业技术人员知道,上述最后一句话的唯一真实部分是 COBOL 于 1959 年首次设计。
众所周知,很多银行仍在主机上运行数百万行 COBOL 代码。他们可能希望在某个时候替换它。那么他们为什么没有替换呢?大多数银行已经存在很长时间,以至于仍然感到痛苦,这是由于 ~1960 年的软件危机所致。在开发其计算机系统时,他们花费了大量的资金和时间,最终获得了一个功能齐全、经过充分测试的、稳定的 COBOL 核心系统。
与参与这些系统开发的人交流,现如今它们具有 Java 前端和添加功能或更现代界面的包装器,它们在虚拟化的复制服务器上运行应用程序,但最终一切都通过单核逻辑运行。除非必要,否则核心逻辑很少会受到影响或更改。
从软件工程的角度来看,这也是有道理的。重写总是比计划的成本更高,而且总是比计划的时间长(好吧,可能不总是,但经常如此)。永远不要更改正在运行的系统等等,除非有很好的技术和商业原因。
基础 COBOL
本章介绍 COBOL 语法的基础知识。然后演示如何在 VS Code 中查看和运行基本的 COBOL 程序。
COBOL 特性
- 企业 COBOL
- 章节目标
一个初学者 COBOL 程序员必须知道什么才能成为一个有经验的 COBOL 程序员?
- 编码规则和参考格式是什么?
- COBOL 的结构是什么?
- COBOL 保留字是什么?
- 什么是 COBOL 语句?
- 作用域终止符的含义是什么?
- 什么是 COBOL 句子?
- 什么是 COBOL 段落?
- 什么是 COBOL 部分?
- 如何在 z/OS 上运行 COBOL 程序?
COBOL 分区
- COBOL 分区结构
- COBOL 有哪四个分区?
PROCEDURE DIVISION 解释
附加信息
- 专业手册
- 了解更多关于最近的 COBOL 进展
实验
实验 - Zowe CLI 与自动化
- Zowe CLI - 交互式用法
- Zowe CLI - 编程用法
COBOL 特性
COBOL 是一种类似英语的计算机语言,使 COBOL 源代码更易于阅读、理解和维护。学习编程使用 COBOL 包括了解 COBOL 源代码规则、COBOL 保留字、COBOL 结构,以及定位和解释专业 COBOL 文档的能力。要精通阅读、编写和维护 COBOL 程序,必须理解这些 COBOL 特性。
企业级 COBOL
COBOL 是一种标准的计算机编程语言,不归属于任何特定的公司或组织。”企业级 COBOL” 是指在 IBM Z 操作系统 z/OS 中编译和执行的 COBOL 编程语言实现。以下章节中提供的细节和解释适用于企业级 COBOL。
企业级 COBOL 已经经历了几十年的发展,包括引入新功能、功能扩展、性能改进以及对各种应用程序编程接口(API)的支持等。它与现代基础架构技术兼容,原生支持 JSON、XML 和 Java®。
章节目标
本章的目标是让读者熟悉 COBOL 术语、编码规则和语法。随后的章节将更详细地介绍这些概念,并提供实际实验来练习本章介绍的内容。
一个初学 COBOL 程序员必须了解哪些内容才能成为经验丰富的 COBOL 程序员?
本节旨在为读者提供必要的基础知识,以便理解后续部分提出的问题和答案。
编码规则和参考格式是什么?
COBOL 源代码遵循一种基于列的结构,这意味着特定的列具有明确定义的用途,并且必须严格遵守规则。每行 COBOL 源代码都包含五个区域,每个区域都有起始列和结束列。
COBOL 源文本必须按照 COBOL 参考格式编写。参考格式包含图 1 中显示的各个区域,位于 72 个字符的行内。
图 1. COBOL 参考格式
COBOL 参考格式的格式如下:
序号区域(列 1 - 6)
- 空白或保留用于行序号。
指示区域(列 7)
一个多用途区域:
注释行(通常是星号符号)
连续行(通常是连字符符号)
调试行(D 或 d)
源代码清单格式(斜杠符号)
区域 A(列 8 - 11)
某些项目必须从区域 A 开始,它们包括:
级别指示符
声明
分区、部分、段落标题
段落名称
第 8 列称为 A 边距
区域 B(列 12 - 72)
某些项目必须从区域 B 开始,它们包括:
条目、句子、语句和子句
连续行
第 12 列称为 B 边距
标识区域(列 73 - 80)
编译器忽略此区域。
可以留空,或者由程序员可选择用于任何目的。
COBOL 的结构是什么?
COBOL 具有层次结构,按自上而下的顺序包括以下内容:
分区(Divisions)
部分(Sections)
段落(Paragraphs)
句子(Sentences)
语句(Statements)
COBOL 的保留字是什么?
COBOL 编程语言具有许多具有特定含义的单词,被称为保留字,这些保留字对于 COBOL 编译器具有特殊含义。这些保留字不能用作程序员选择的变量名或数据类型名。
与本书相关的一些 COBOL 保留字包括:PERFORM、MOVE、COMPUTE、IF、THEN、ELSE、EVALUATE、PICTURE 等。您可以在以下链接找到所有 COBOL 保留字的列表:
https://www.ibm.com/docs/en/cobol-zos/6.4?topic=appendixes-reserved-words
什么是 COBOL 语句?
特定的 COBOL 保留字用于根据当前条件更改执行流程。”语句”仅存在于 Procedure Division,即程序处理逻辑中。用于更改执行流程的 COBOL 保留字示例包括:
IF
Evaluate
Perform
什么是作用域终止符的含义?
作用域终止符可以是显式的或隐式的。显式的作用域终止符使用带有 “END-“ COBOL 保留字的某些 PROCEDURE DIVISION 语句的结束标记。任何总是有条件的 COBOL 动词(IF、EVALUATE)或具有条件子句(COMPUTE、PERFORM、READ)都将具有匹配的作用域终止符。隐式的作用域终止符是句点(.),它结束了所有尚未结束的先前语句的作用域。
什么是 COBOL 句子?
COBOL 中的 “句子” 是一个或多个 “语句”,后面跟有一个句点(.),句点充当作用域终止符。
什么是 COBOL 段落?
COBOL 中的 “段落” 是一个用户定义或预定义的名称,后面跟有一个句点。一个 “段落” 由零个或多个句子组成,是 “Section” 或 “Division” 的子部分,参见下面的示例 1。
示例 1. Division -> paragraph -> sentences
什么是 COBOL 部分?
一个 “Section” 是一个用户定义或预定义的名称,后面跟有一个句点,由零个或多个句子组成。一个 “Section” 是段落的集合。
如何在 z/OS 上运行 COBOL 程序?
当您在 z/OS 上处理 COBOL 时,您将会遇到 JCL 或作业控制语言。JCL 是一组告诉 z/OS 操作系统要执行的任务的语句。
要使您的 COBOL 程序在 z/OS 中可执行,您需要告诉操作系统在运行之前编译和链接编辑代码。所有这些都将使用 JCL 完成。
您的 JCL 应首先执行的是编译您编写的 COBOL 程序的操作。在此步骤中,您的程序将传递给 COBOL 编译器进行处理,以生成目标代码。接下来,编译器的输出将通过链接编辑步骤。在这里,一个绑定器将接收目标代码以及在 JCL 中指定的所有必要库和选项,以创建可执行程序。在此步骤中,您还可以告诉 JCL 包括您的 COBOL 程序将读取的附加数据集。然后,您可以运行程序。
为了简化事情,Enterprise COBOL for z/OS 提供了三个 JCL 过程来编译您的代码。在使用 JCL 过程时,我们可以提供变量部分以适应特定的用例。以下是可供您使用的过程:
- 编译过程(IGYWC)
- 编译和链接编辑过程(IGYWCL)
- 编译、链接编辑和运行过程(IGYWCLG)
由于本课程是 COBOL 课程,因此已为您提供了执行实验所需的 JCL。因此,您将在 JCL 上遇到上述列出的过程。如果您想创建一个新的 COBOL 程序,可以复制提供的 JCL 之一,然后相应地进行修改。
要了解更多关于 JCL 的信息,请访问 IBM 知识中心:
https://www.ibm.com/docs/en/zos-basic-skills?topic=collection-basic-jcl-concepts
COBOL 分区
本节介绍了 COBOL 的四个分区,并简要描述了它们的目的和特点。
COBOL 分区结构
分区被细分为节。
节被细分为段。
段被细分为句。
句由语句组成。
语句以 COBOL 保留字开头,并可以细分为“短语”。
COBOL 有哪四个分区?
标识分区(IDENTIFICATION DIVISION)
标识分区用一个名称标识程序,并可选择提供其他标识信息,例如作者姓名、程序编译日期(最后修改日期)等。
环境分区(ENVIRONMENT DIVISION)
环境分区描述了程序依赖于计算环境的方面,例如计算机配置和计算机输入输出等。
数据分区 DATA DIVISION
数据分区是数据特性的定义位置,可包括以下几个部分:
文件分区(FILE SECTION):
定义用于输入输出操作的数据。
连接分区(LINKAGE SECTION):
描述来自另一个程序的数据,用于定义内部处理的数据。
工作存储分区(WORKING-STORAGE SECTION):
为程序的生命周期分配并保留的存储空间。
本地存储分区(LOCAL-STORAGE SECTION):
每次调用程序时都会分配存储空间,并在程序结束时释放。
程序分区 PROCEDURE DIVISION
PROCEDURE 分区包含与数据操作相关的指令,并指定与其他程序的接口。
PROCEDURE DIVISION 是程序中执行实际工作的地方。语句位于 PROCEDURE DIVISION 中,它们是程序要执行的操作。要处理程序的数据,需要 PROCEDURE DIVISION。程序的 PROCEDURE DIVISION 分为不同的部分和段落,其中包含句子和语句,如下所述:
Section - 处理逻辑的逻辑子部分。一个 section 有一个标题,可以选择性地跟随一个或多个段落。一个 section 可以成为 PERFORM 语句的主题。一种类型的 section 用于声明性。声明性是一组一个或多个特殊用途的 section。特殊用途的 section 正是它们听起来的样子,为特殊目的编写的 section,可能包含诸如输入和输出描述之类的内容。它们写在 PROCEDURE DIVISION 的开头,第一个 section 前面有关键字 DECLARATIVES,最后一个 section 后面有关键字 END DECLARATIVES。
Paragraph - 是 section、procedure 或程序的一个子部分。一个段落可以成为语句的主题。
Sentence - 由一个或多个 COBOL 语句组成,以句点结尾。
Statement - 由程序执行的操作,例如将两个数字相加。
Phrase - 语句的一个小部分(即子部分),类似于英语中的形容词或介词。
Additional information
本节提供有关学习 COBOL 基础的有用资源,包括手册和视频。
随着 Enterprise COBOL 经验的提升,对专业文档的需求变得更加迫切。搜索 Enterprise COBOL 手册,包括“IBM z/OS 上的 Enterprise COBOL 文档库”,以下提供了链接。该网站的内容根据每个 COBOL 发布级别分为不同的选项卡。截至 2022 年 12 月,Enterprise COBOL 的当前版本是 V6.4。请点击 V6.4 选项卡,然后选择产品文档。
https://www.ibm.com/support/pages/enterprise-cobol-zos-documentation-library
本章中引用了三个“Enterprise COBOL for z/OS”手册,作为额外信息的来源、参考和知识水平提升的工具。它们分别是:
语言参考 - 描述 COBOL 语言,如程序结构、保留字等。
编程指南 - 描述高级主题,如 COBOL 编译器选项、程序性能优化、错误处理等。
消息和代码 - 用于更好地理解某些 COBOL 编译器消息和返回代码,以诊断问题。
了解有关 COBOL 领域最新进展的更多信息
Enterprise COBOL for z/OS V6.1 的新特性:
https://www.ibm.com/support/pages/cobol-v61-was-announced-whats-new
Enterprise COBOL for z/OS V6.2 的新特性:
https://www.ibm.com/support/pages/cobol-v62-was-announced-whats-new
Enterprise COBOL for z/OS V6.3 的新特性:
https://www.ibm.com/support/pages/cobol-v63-was-announced-whats-new
Enterprise COBOL for z/OS V6.4 的新特性:
实验
在这个实验中,您将连接到 IBM Z 系统,在 VS Code 中查看一个简单的 COBOL 世界程序,提交 JCL 来编译 COBOL 程序,并查看输出。如果您尚未配置 VS Code,请参考“安装 VS Code 和扩展”进行配置。您可以选择使用 IBM Z Open Editor 和 Zowe Explorer 扩展,如图 2a 所示,或使用 Code4z 扩展包,如图 2b 所示。
本实验假设您已安装了 VS Code,并安装了 IBM Z Open Editor 和 Zowe Explorer 扩展,如图 2a 所示,或者安装了 Code4z 扩展包,如图 2b 所示。
单击 扩展 图标。如果您安装了 IBM Z Open Editor 和 Zowe Explorer,则列表中应包括以下内容:
- IBM Z Open Editor
- Zowe Explorer
图 2a. IBM Z Open Editor 和 Zowe Explorer 的 VS Code 扩展
如果您安装了 Code4z,则列表应包括以下内容:
- COBOL 语言支持
- Zowe Explorer
- Explorer for Endevor
- HLASM 语言支持
- Mainframe 调试器
- COBOL 控制流
- Mainframe Abend 分析器
- Mainframe 数据编辑器
在这些练习中,您只需要使用 COBOL 语言支持和 Zowe Explorer 扩展。
图 2b. VS Code 扩展的 Code4z 套件。
注意: 如果您的列表同时包含 Z Open Editor 和 COBOL 语言支持,请禁用其中一个,方法是点击扩展列表中扩展旁边的 齿轮 图标,然后选择 禁用。
点击如图 3 所示的 Zowe Explorer 图标。Zowe Explorer 可以列出数据集、Unix 系统服务 (USS) 文件和作业输出。
图 3. Zowe Explorer 图标
为了连接到实验系统,请获取您的团队配置 zip 文件并解压缩它。您可以从课程的 GitHub 存储库的“Releases”部分获取团队配置 zip 文件。
图 4. 解压 ZIP 文件
打开已提取的文件夹。您将找到两个配置文件,如图 5 所示。
图 5. 团队配置文件内部
现在回到您的 VS Code 窗口,选择“Explorer”选项卡,然后按左侧栏中的“打开文件夹”按钮。
图 6. 单击打开文件夹按钮
弹出窗口会显示出来,请选择包含团队配置文件的文件夹。
图 7a. 选择团队配置文件夹
如果提示信任文件夹中的文件的作者如图 7b 所示,请选择 是,我信任作者。
图 7b. 信任文件夹中的文件的作者
您的连接应该会自动添加到数据集列表中,如图 8a 所示。
图 8a. LearnCOBOL 连接
如果连接未显示,请将鼠标悬停在“Data Sets”行的最右边,然后按 + 图标。然后,如图 8b 所示,选择 LearnCOBOL 连接。
图 8b. 手动添加 LearnCOBOL 连接
单击 LearnCOBOL 连接。
图 9. 单击 LearnCOBOL 连接
连接会提示输入用户名,如图 10 所示。
图 10. 用户名提示
请输入分配给您的用户名!请勿使用示例用户名 Z99998。 如图 11 所示,输入示例用户名。ID 由系统管理员分配。
图 11. 指定用户名
连接会提示输入密码,如图 12 所示。
图 12. 密码提示
如图 13 所示,输入分配给您的密码。
图 13. 指定密码
展开 LearnCOBOL,显示“使用搜索按钮显示数据集”。单击放大镜图标,如图 14 所示。
图 14. 放大镜图标以设置筛选器
出现“搜索数据集”的提示,如图 15 所示。
图 15. 要搜索的筛选器名称
每个用户的高级限定符与其用户名相同。因此,请将您分配的用户名作为搜索条件,如图 16 所示。请提供分配给您的用户名!请勿使用示例用户名 Z99998。
图 16. 输入的筛选器名称
出现以您的用户名开头的数据集名称列表,如图 17 所示。
图 17. 过滤后的数据集名称
展开
<用户名>.CBL
以查看 COBOL 源成员,然后选择成员 HELLO,以查看一个简单的 COBOL “Hello World!”程序,如图 18 所示。图 18.
<用户名>.CBL
展开
<用户名>.JCL
以查看 JCL 成员,然后选择成员 HELLO,该成员是用于编译和执行简单的 “Hello World!” COBOL 源代码的 JCL,如图 19 所示。图 19.
<用户名>.JCL
右键单击 JCL 成员 HELLO。会出现一个选项框。选择 Submit Job,系统将处理 HELLO JCL,如图 20 所示。提交的 JCL 作业会编译 COBOL HELLO 源代码,然后执行 COBOL HELLO 程序。
图 20. 提交作业
观察 Zowe Explorer 中的 ‘Jobs’ 部分,如图 21 所示。
图 21. JOBS 部分
再次单击 Jobs 选择右侧的 +。会出现另一个提示 “Create new”。从列表中选择 LearnCOBOL,如图 22 所示。
图 22. 选择 LearnCOBOL 连接
结果,您的用户名拥有的 JCL 作业将出现。HELLOCBL 是之前提交的 JCL 作业名称。展开 HELLOCBL 输出以查看输出的部分,如图 23 所示。
图 23. HELLOCBL 输出
选择 COBRUN:SYSPRINT(101) 以查看 COBOL 编译器输出。在 COBOL 编译中向前滚动,以找到编译为可执行模块的 COBOL 源代码,如图 24 所示。注意列 7 中的 Indicator 区域,列 8 中的 A 区域,以及列 12 中的 B 区域。此外,注意 COBOL 源代码中的句点 (.) 作用终止符。
图 24. COBOL 编译器输出
通过从 Zowe Explorer 的 LEARNCOBOL 中的 Jobs 部分选择 COBRUN:SYSOUT(104) 查看 COBOL 程序的执行,如图 25 所示。
图 25. COBOL 程序执行
请注意,每次连接到系统时,都需要打开 LearnCOBOL 文件夹,重复步骤 5 到 7。要使您的连接配置文件在计算机的任何位置都可访问,您需要将配置文件 (即
zowe.config.json
和zowe.schema.json
) 从 LearnCOBOL 文件夹移动到 Zowe 的全局位置。默认情况下,Windows 为C:\Users\%USERNAME%\.zowe
,Linux 和 macOS 为~/.zowe
。以下网址是另一份优秀的文档,描述了上述 VS Code 和 Zowe Explorer 的详细信息和示例:https://marketplace.visualstudio.com/items?itemName=Zowe.vscode-extension-for-zowe