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。

Example 1. Division -> paragraph -> sentences

示例 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 过程时,我们可以提供变量部分以适应特定的用例。以下是可供您使用的过程:

  1. 编译过程(IGYWC)
  2. 编译和链接编辑过程(IGYWCL)
  3. 编译、链接编辑和运行过程(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”手册,作为额外信息的来源、参考和知识水平提升的工具。它们分别是:

  1. 语言参考 - 描述 COBOL 语言,如程序结构、保留字等。

    https://publibfp.dhe.ibm.com/epubs/pdf/igy6lr40.pdf

  2. 编程指南 - 描述高级主题,如 COBOL 编译器选项、程序性能优化、错误处理等。

    https://publibfp.dhe.ibm.com/epubs/pdf/igy6pg40.pdf

  3. 消息和代码 - 用于更好地理解某些 COBOL 编译器消息和返回代码,以诊断问题。

    https://publibfp.dhe.ibm.com/epubs/pdf/c2746482.pdf

了解有关 COBOL 领域最新进展的更多信息

实验

在这个实验中,您将连接到 IBM Z 系统,在 VS Code 中查看一个简单的 COBOL 世界程序,提交 JCL 来编译 COBOL 程序,并查看输出。如果您尚未配置 VS Code,请参考“安装 VS Code 和扩展”进行配置。您可以选择使用 IBM Z Open Editor 和 Zowe Explorer 扩展,如图 2a 所示,或使用 Code4z 扩展包,如图 2b 所示。

  1. 本实验假设您已安装了 VS Code,并安装了 IBM Z Open Editor 和 Zowe Explorer 扩展,如图 2a 所示,或者安装了 Code4z 扩展包,如图 2b 所示。

    单击 扩展 图标。如果您安装了 IBM Z Open Editor 和 Zowe Explorer,则列表中应包括以下内容:

    1. IBM Z Open Editor
    2. Zowe Explorer

图 2a. IBM Z Open Editor 和 Zowe Explorer 的 VS Code 扩展

如果您安装了 Code4z,则列表应包括以下内容:

  1. COBOL 语言支持
  2. Zowe Explorer
  3. Explorer for Endevor
  4. HLASM 语言支持
  5. Mainframe 调试器
  6. COBOL 控制流
  7. Mainframe Abend 分析器
  8. Mainframe 数据编辑器

在这些练习中,您只需要使用 COBOL 语言支持和 Zowe Explorer 扩展。

图 2b. VS Code 扩展的 Code4z 套件。

注意: 如果您的列表同时包含 Z Open Editor 和 COBOL 语言支持,请禁用其中一个,方法是点击扩展列表中扩展旁边的 齿轮 图标,然后选择 禁用

  1. 点击如图 3 所示的 Zowe Explorer 图标。Zowe Explorer 可以列出数据集、Unix 系统服务 (USS) 文件和作业输出。

图 3. Zowe Explorer 图标

  1. 为了连接到实验系统,请获取您的团队配置 zip 文件并解压缩它。您可以从课程的 GitHub 存储库的“Releases”部分获取团队配置 zip 文件。

    图 4. 解压 ZIP 文件

  2. 打开已提取的文件夹。您将找到两个配置文件,如图 5 所示。

    图 5. 团队配置文件内部

  3. 现在回到您的 VS Code 窗口,选择“Explorer”选项卡,然后按左侧栏中的“打开文件夹”按钮。

    图 6. 单击打开文件夹按钮

  4. 弹出窗口会显示出来,请选择包含团队配置文件的文件夹。

    图 7a. 选择团队配置文件夹

    如果提示信任文件夹中的文件的作者如图 7b 所示,请选择 是,我信任作者

    图 7b. 信任文件夹中的文件的作者

  5. 您的连接应该会自动添加到数据集列表中,如图 8a 所示。

    图 8a. LearnCOBOL 连接

    如果连接未显示,请将鼠标悬停在“Data Sets”行的最右边,然后按 + 图标。然后,如图 8b 所示,选择 LearnCOBOL 连接。

    图 8b. 手动添加 LearnCOBOL 连接

  6. 单击 LearnCOBOL 连接。

    图 9. 单击 LearnCOBOL 连接

  7. 连接会提示输入用户名,如图 10 所示。

    图 10. 用户名提示

  8. 请输入分配给您的用户名!请勿使用示例用户名 Z99998。 如图 11 所示,输入示例用户名。ID 由系统管理员分配。

    图 11. 指定用户名

  9. 连接会提示输入密码,如图 12 所示。

    图 12. 密码提示

  10. 如图 13 所示,输入分配给您的密码。

    图 13. 指定密码

  11. 展开 LearnCOBOL,显示“使用搜索按钮显示数据集”。单击放大镜图标,如图 14 所示。

    图 14. 放大镜图标以设置筛选器

  12. 出现“搜索数据集”的提示,如图 15 所示。

    图 15. 要搜索的筛选器名称

  13. 每个用户的高级限定符与其用户名相同。因此,请将您分配的用户名作为搜索条件,如图 16 所示。请提供分配给您的用户名!请勿使用示例用户名 Z99998。

    图 16. 输入的筛选器名称

  14. 出现以您的用户名开头的数据集名称列表,如图 17 所示。

    图 17. 过滤后的数据集名称

  15. 展开 <用户名>.CBL 以查看 COBOL 源成员,然后选择成员 HELLO,以查看一个简单的 COBOL “Hello World!”程序,如图 18 所示。

    图 18. <用户名>.CBL

  16. 展开 <用户名>.JCL 以查看 JCL 成员,然后选择成员 HELLO,该成员是用于编译和执行简单的 “Hello World!” COBOL 源代码的 JCL,如图 19 所示。

    图 19. <用户名>.JCL

  17. 右键单击 JCL 成员 HELLO。会出现一个选项框。选择 Submit Job,系统将处理 HELLO JCL,如图 20 所示。提交的 JCL 作业会编译 COBOL HELLO 源代码,然后执行 COBOL HELLO 程序。

    图 20. 提交作业

  18. 观察 Zowe Explorer 中的 ‘Jobs’ 部分,如图 21 所示。

    图 21. JOBS 部分

  19. 再次单击 Jobs 选择右侧的 +。会出现另一个提示 “Create new”。从列表中选择 LearnCOBOL,如图 22 所示。

    图 22. 选择 LearnCOBOL 连接

  20. 结果,您的用户名拥有的 JCL 作业将出现。HELLOCBL 是之前提交的 JCL 作业名称。展开 HELLOCBL 输出以查看输出的部分,如图 23 所示。

    图 23. HELLOCBL 输出

  21. 选择 COBRUN:SYSPRINT(101) 以查看 COBOL 编译器输出。在 COBOL 编译中向前滚动,以找到编译为可执行模块的 COBOL 源代码,如图 24 所示。注意列 7 中的 Indicator 区域,列 8 中的 A 区域,以及列 12 中的 B 区域。此外,注意 COBOL 源代码中的句点 (.) 作用终止符。

    图 24. COBOL 编译器输出

  22. 通过从 Zowe Explorer 的 LEARNCOBOL 中的 Jobs 部分选择 COBRUN:SYSOUT(104) 查看 COBOL 程序的执行,如图 25 所示。

    图 25. COBOL 程序执行

  23. 请注意,每次连接到系统时,都需要打开 LearnCOBOL 文件夹,重复步骤 5 到 7。要使您的连接配置文件在计算机的任何位置都可访问,您需要将配置文件 (即 zowe.config.jsonzowe.schema.json) 从 LearnCOBOL 文件夹移动到 Zowe 的全局位置。默认情况下,Windows 为 C:\Users\%USERNAME%\.zowe,Linux 和 macOS 为 ~/.zowe

  24. 以下网址是另一份优秀的文档,描述了上述 VS Code 和 Zowe Explorer 的详细信息和示例:https://marketplace.visualstudio.com/items?itemName=Zowe.vscode-extension-for-zowe