软件工程师手册/语言字典/COBOL
COBOL是一种计算机编程语言,其名称是“COmmon Business-Oriented Language”的首字母缩写。它广泛应用于金融服务行业,通常用于基于大型机的应用程序。自1960年代以来,它被广泛使用。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语言中的联合体有些类似。
面向对象的扩展适用于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
对于键排序文件,支持START
、READ
、WRITE
、REWRITE
和DELETE
。
不适用于COBOL。
递归通常不支持,但可以通过迭代模拟。
通过系统 API(如 malloc)动态分配的内存应使用相应的“free”调用释放。
使用 CLASS 的 COBOL 程序可能需要调用“finalize”方法来释放对象。例如
invoke myObject "finalize" returning myObject
如果 COBOL 应用程序在虚拟机(如 Java 虚拟机或微软的 CLR)下执行,则标准的垃圾回收规则适用。
否则..
COBOL 程序员通常不知道或不在乎什么是垃圾回收。他们很少需要分配内存或在之后清理它。
COBOL 源文件可能包含(但不一定)copybook,类似于 C 语言中的 .h 文件。编译后的程序通常使用动态加载的 COBOL 运行时库服务例程。COBOL 源文件本身包含四个部分:IDENTIFICATION DIVISION
、ENVIRONMENT DIVISION
、DATA DIVISION
和 PROCEDURE DIVISION
。
<请包含从其他语言切换到此语言的简便技巧。>
- COBOL 常见问题解答(以 .DOC 格式)
- GnuCOBOL 常见问题解答和操作方法
- GnuCOBOL 手册和指南
- COBOL 用户组 (COBUG)(网站已下线,2013 年的存档)
- cob-rte
- svalgard
- swbell 页面
- dissert
- csis.ul.ie 页面
- infogoal 页面
- COBOL 博客
<列出可能有所帮助的其他书籍和文章。请包括参考资料适合什么级别的读者。(初级/中级/高级)>
- Cobos 项目 开源 Cobol / 大型机 / CICS / DB2 集成开发环境(在 Eclipse 中)