跳转到内容

软件工程师手册/语言词典/COBOL

来自维基教科书,开放的书籍,开放的世界

COBOL 是一种计算机编程语言,其名称是 "COmmon Business-Oriented Language" 的缩写。它广泛应用于金融服务行业,通常用于大型机上的应用程序。从 20 世纪 60 年代开始广泛使用。COBOL 是为商业应用程序而设计的,因此它在实现时就包含了定点算术支持。这是 COBOL 的优势之一,因为它允许在没有舍入误差的情况下完整、准确地计算财务值。

COBOL 是一种完整的过程式语言。

执行入口点

[编辑 | 编辑源代码]

COBOL 程序分为四个部分,所有四个部分都必须以以下顺序出现在每个程序中:标识;环境;数据和过程。每个部分包含若干个必选和可选段落

标识部分包含有关程序的信息,包括其名称、作者、编译日期等。它必须包含PROGRAM-ID段落,该段落以唯一名称命名程序。所有其他段落都是可选的。

环境部分描述程序执行的环境。例如,它包括输入和输出文件以及目标执行平台的详细信息。该部分包含两个节:配置节输入输出节

数据部分包含文件节,它完整地描述每个输入和输出文件的记录布局,以及工作存储节,其中声明了变量。它还包含连接节,该节描述了将在相互调用的程序之间传递的数据。

过程部分包含可执行程序指令。执行入口点是该部分中的第一条语句。

通用语法

[编辑 | 编辑源代码]

很难概述 COBOL 的通用语法,因为该语言有 500 多个保留字。此外,语法(与其他早期语言(包括 FORTRAN)一样)不是设计为遵循正式语法;出于这个原因,COBOL 和 FORTRAN 解析器很少使用自动代码生成器来实现。

以下是一些示例赋值语句

 MOVE A TO B.
 COMPUTE GROSS-PAY = HOURS-WORKED * HOURLY-RATE.
 MULTIPLY HOURLY-RATE BY HOURS-WORKED GIVING GROSS-PAY.
 SET MY-INDEX UP BY 1.

 SET ADDRESS OF MY-LINKAGE-SECTION-ITEM TO MY-POINTER.
 READ TRANSACTION-FILE INTO TRANSACTION-RECORD-WS.

虽然许多站点仍然使用全大写字符,但现代 COBOL 编译器不区分大小写。以下两个语句完全相同

 MOVE MY-NUMBER TO YOUR-NUMBER.
 Move my-number to Your-Number.

对于引号括起来的文字(字符串),会保留字符大小写。

通常,指定注释的唯一方法是在指示器区域(第 7 列)中放置一个星号。整行都是注释。块注释必须在每行的第 7 列都有 *。在 2002 年的标准中,允许部分行作为注释

 MOVE A TO B.   *> THIS IS A COMMENT ON THE SAME LINE AS A STATEMENT

变量声明

[编辑 | 编辑源代码]

有几种称为特殊寄存器的类型的变量不需要定义,但通常所有变量都必须在 COBOL 中定义,与解释型 BASIC 不同。

COBOL 有多种数据类型,但最常见的是数值类型(带有用于内部格式的说明符)、数值编辑数据、字母数字数据和记录(类似于 C 中的结构体)

 01  TRANSACTION-RECORD.
    05  RECORD-NUMBER            PICTURE S9(7) COMP-3 VALUE ZERO.
    05  RECORD-DESCRIPTION       PICTURE X(30) VALUE SPACES.
    05  EDITED-AMOUNT            PIC $$$$,$$$,$$$.99-.
    05  FILLER                   PIC X(60) VALUE SPACES.

简单的示例,声明一个整数,可能看起来像这样

 77  I    pic s9(4)  usage is binary.

COBOL 还支持重新定义,这与 C 中的联合 somewhat 类似。

方法声明/实现

[编辑 | 编辑源代码]

COBOL 提供面向对象扩展,但绝大多数 COBOL 程序员没有使用它们,也认为没有必要。

但是,如果 COBOL 程序员想要创建一个类,这很容易做到。例如,这是一个HelloWorld类,带有一个instanceMethod

 IDENTIFICATION DIVISION.
 CLASS-ID. HelloWorld.
 ENVIRONMENT DIVISION.
 CONFIGURATION SECTION.
 REPOSITORY.
 
 IDENTIFICATION DIVISION.
 OBJECT.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 
 IDENTIFICATION DIVISION.
 METHOD-ID. instanceMethod.
 DATA DIVISION.
 LINKAGE SECTION.
 PROCEDURE DIVISION.
     DISPLAY "Hello World"
     GOBACK.
 END METHOD instanceMethod.
 
 END OBJECT.
 END CLASS HelloWorld.

作用域

[编辑 | 编辑源代码]

COBOL 程序工作存储节中包含的所有数据都是全局的。某些数据项可以定义为外部的,对加载模块中的其他程序可见。COBOL 子程序中的数据项对于子程序是全局的,但由于调用方无法看到它们,因此是局部的。通常,数据是通过引用从 COBOL 主程序传递到子程序的。还存在 "按内容" 或 "按值" 的替代方法,但它们通常只用于调用用 C 或其他通常不使用按引用调用的语言编写的子程序。

某些供应商提供扩展,例如线程本地存储节和本地存储节。这些扩展允许将数据的作用域限定为线程本地或程序临时数据。

条件语句

[编辑 | 编辑源代码]

有很多这样的语句。以下是一些示例

 If my-number is numeric
    continue
 else
    display 'data field "my-number" is not numeric'
 end-if

 evaluate record-type
 when 'a'
    perform process-record-type-a
 when 'b'
    perform process-record-type-b
 when 'c'
    continue
 when 'd'
 when 'e'
    perform process-record-type-d-or-e
 when other
    perform process-invalid-record-type
 end-evaluate

 READ TRANSACTION-FILE INTO MY-TRAN-REC-WS
 AT END
    SET ALL-RECORDS-PROCESSED TO TRUE
 NOT AT END
    ADD +1 TO TRAN-REC-COUNT
    PERFORM PROCESS-1-TRANSACTION
 END-READ

循环语句

[编辑 | 编辑源代码]

也有好几种。

 Perform 6 times
    add +1 to loop-count
 end-perform

 Perform process-1-billing-record
    until all-records-processed

 Perform clear-1-table-entry
    varying tbl-index from +1 by +1
    until tbl-index is greater than max-table-entries

 Search table-entry varying tbl-index
 at end
    set entry-not-found to true
 when table-key equal customer-id
    move tbl-customer-name to print-customer-name
 end-search

输出语句

[编辑 | 编辑源代码]

以下是一些示例。

 DISPLAY "Hello, World!"
 display 'hello, world!' with no advancing

 Write billing-record from transaction-record-ws

对于键控顺序文件,支持STARTREADWRITEREWRITEDELETE

容器

[edit | edit source]

不适用于 COBOL。

算法

[edit | edit source]

递归通常不受支持,但可以通过迭代模拟。

垃圾回收

[edit | edit source]

通过系统 API(如 malloc)动态分配的内存应使用适当的“free”调用释放。

使用 CLASS 的 COBOL 程序可能需要调用“finalize”方法来释放对象。例如

 invoke myObject "finalize" returning myObject

如果 COBOL 应用程序在虚拟机(如 Java 虚拟机或 Microsoft 的 CLR)下执行,则适用标准的垃圾回收规则。

否则..

COBOL 程序员通常不知道或不关心什么是垃圾回收。他们很少需要分配内存或在之后清理内存。

物理结构

[edit | edit source]

COBOL 源文件可能(但不一定)包含类似于 C 中 .h 文件的 copybook。已编译的程序通常使用动态加载的服务例程的 COBOL 运行时库。COBOL 源文件本身包含四个部分:IDENTIFICATION DIVISIONENVIRONMENT DIVISIONDATA DIVISIONPROCEDURE DIVISION

提示

[edit | edit source]

<请包括从其他语言切换到这种语言更容易的提示。>

网页参考

[edit | edit source]

书籍和文章

[edit | edit source]

<列出可能对您有帮助的额外书籍和文章。请包括参考资料适合什么级别的读者。(初学者/中级/高级)>

返回标题页

工具

[edit | edit source]
  • Cobos 项目 开源 Cobol / 主机 / CICS / DB2 集成开发环境(在 Eclipse 中)
华夏公益教科书