【COBOL】
COBOL（l），其名称来自于通用商业语言（Common Business Oriented Language，又译为面向常规业务型语言/常规商业信息处理语言）的缩写，是最早的高阶程式语言、以及是世界上最早实施标准化的计算机语言之一。属于编译语言。
== 历史 ==
1959年5月，美国国防部委托葛丽丝·霍普（Grace Murray Hopper）博士领导一个委员会，制定了COBOL语言的标准，并于1961年由美国数据系统语言协会公布。正式发布于1960年4月，称为Cobol－60，现在最新的版本是Cobol－2002。COBOL最早是以葛丽丝·霍普开发的FLOW-MATIC语言为范本。值得注意的是，葛丽丝·霍普并不是发明COBOL的六人组成员之一。1959 年，在纽约曼哈顿的雪梨荷兰酒店，Jean E. Sammet 和其他 5 位程序员闭关两周，几乎是无昼夜地开发，完成了 COBOL 的大部分设计。
1963年，美国国家标准学会进行了标准化，但是ANSI标准很少被遵循；因此，COBOL程序只是部分可移植的。
== 重要性 ==
经过40多年的不断修改、丰富完善和标准化，COBOL已发展为多种版本的庞大语言，在财会工作、统计报表、计划编制、情报检索、人事管理等数据管理及商业数据处理领域，都有着广泛的应用。
COBOL主要是应用于金融和会计行业等非常重要的商业数据处理领域，即使 COBOL 多年来被视为过时的语言，但是目前大多数的金融业核心系统仍多半使用COBOL，除了旧有系统太庞大修改不易外，COBOL 平台的稳定性也是它生命一直超过预期延续的重要原因。
在2019新型冠状病毒疫情影响下，美国政府因为需处理大量失业给付，使得COBOL编写的老旧系统频繁出现故障，需要同样上年纪、甚至已退休的老年COBOL程序员来协助维护，所以COBOL的创始团队在网上公开教程和学习资源，让年轻程序员学习COBOL来协助这些程序员维护系统，同时也紧急招募COBOL程序员来协助维护。
== 特点 ==
COBOL是一种面向数据处理的、面向文件的、面向过程（POL）的高级编程语言，是一种功能很强而又极为冗长的语言。
COBOL适合于具有循环处理周期的环境（例如打印工资支票）以及数据操纵量相当大的环境。COBOL主要应用于商业数据处理领域，对各种类型的数据进行收集、存储、传送、分类、排序、计算及打印报表、输出图像是它的强项。
COBOL语法与英文很接近，即使不懂电脑的人也能看懂程序。
强大的文件处理功能，大量的数据通常以文件的形式存储在磁盘上。
仅提供了加、减、乘、除及乘方这五种简单的算术运算，因而不适于进行科学计算。
未来的COBOL将支持XML等Web时代的新技术。
== 程序结构 ==
COBOL程序由4部（DIVISION）组成：IDENTIFICATION DIVISION.（标识部）、ENVIRONMENT DIVISION.（环境部）、DATA DIVISION.（数据部）、
PROCEDURE DIVISION.（过程部），而每个部又由若干节（SECTION）组成。
=== IDENTIFICATION DIVISION. ===
「PROGRAM-ID」（程序识别ID）、「AUTHOR」（作者名）、「DATE-WRITTEN」（编写日期），这些并不直接影响程序的执行，而是程序的注释
信息。程序注释可以采用任何语言书写，COBOL编译器可以接受。
=== ENVIRONMENT DIVISION. ===
用于记载程序可以被运行的计算机环境。“ENVIRONMENT DIVISION.”部包括“CONFIGURATION SECTION”环境节和“INPUT-OUTPUT SECTION”输入输出节。
=== DATA DIVISION. ===
用于定义和声明程序所要使用的变量及其他数据。程序要使用的全部变量和数据必须在这里定义。“DATA DIVISION.”部主要包含“FILE SECTION.”和“WORKING-STORAGE SECTION.”节。
如果程序要通过参数接收数据，那么使用“LINKAGE SECTION”来声明。
==== COBOL的数据种类 ====
COBOL程序的数据，主要有以下3种：
* 变量（Variables）
* 常量（Literals）
* 表意常量（FigurativeConstants）：使用有特定意思的多个词组合成一个常量的代名词。好处是便于编码人员识别。比如：HIGH-VALUES、LOW-VALUES等可以表达一定意思的名称作为常量代名词。
==== COBOL变量类型 ====
COBOL的基本变量类型，有以下三种：
* 数值型（Numeric）
* 英文字符型（AlphaNumeric）
* 英文字符串型（Alphabetic）
=== PROCEDURE DIVISION ===
用于容纳程序的实际处理代码。需要传入参数时，采用“PROCEDURE DIVISION USING引数名，参数名...”的方式。
因为前3个DIVISION都是注释，却又必须，只到第4个DIVISION「PROCEDURE DIVISION」才真正涉及程序代码，这样的繁琐规定使得COBOL被批评为太过冗长。但是，基于这样的4个DIVISION的明确记述等的严格形式，COBOL也被公认是可读性强的语言。另外，COBOL的保留字数量庞大，字数过长的保留字太多是COBOL的特征之一。
==Hello world例子代码==
Hello world用COBOL写为：
IDENTIFICATION DIVISION.
PROGRAM-ID. hello-world.
PROCEDURE DIVISION.
DISPLAY "Hello, world!"
.
现在著名的Hello, World!程序例子，于1978年在《C编程语言》书中最初问世的那个时代，在主机上类似的COBOL程序可以通过JCL来提交，并很有可能使用打孔卡阅读器和80列打孔卡。下面列出的具有空DATA DIVISION的代码，曾使用GNU/Linux和运行MVS 3.8J的System/370 Hercules模拟器测试过。这段写于2015年的JCL，是从Hercules教程和Jay Moseley保管的样例派生而来。为了保持那个时代的COBOL程序，HELLO, WORLD用全部大写字母显示。
//COBUCLG  JOB (001),'COBOL BASE TEST',                                 00010000
//             CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1)                        00020000
//BASETEST EXEC COBUCLG                                                 00030000
//COB.SYSIN DD *                                                        00040000
00000* VALIDATION OF BASE COBOL INSTALL                                00050000
01000 IDENTIFICATION DIVISION.                                         00060000
01100 PROGRAM-ID. 'HELLO'.                                             00070000
02000 ENVIRONMENT DIVISION.                                            00080000
02100 CONFIGURATION SECTION.                                           00090000
02110 SOURCE-COMPUTER.  GNULINUX.                                      00100000
02120 OBJECT-COMPUTER.  HERCULES.                                      00110000
02200 SPECIAL-NAMES.                                                   00120000
02210     CONSOLE IS CONSL.                                            00130000
03000 DATA DIVISION.                                                   00140000
04000 PROCEDURE DIVISION.                                              00150000
04100 00-MAIN.                                                         00160000
04110     DISPLAY 'HELLO, WORLD' UPON CONSL.                           00170000
04900     STOP RUN.                                                    00180000
//LKED.SYSLIB DD DSNAME=SYS1.COBLIB,DISP=SHR                            00190000
//            DD DSNAME=SYS1.LINKLIB,DISP=SHR                           00200000
//GO.SYSPRINT DD SYSOUT=A                                               00210000
//                                                                      00220000
在提交了这段JCL之后，MVS控制台显示：
19.52.48 JOB    3  $HASP100 COBUCLG  ON READER1     COBOL BASE TEST
19.52.48 JOB    3  IEF677I WARNING MESSAGE(S) FOR JOB COBUCLG  ISSUED
19.52.48 JOB    3  $HASP373 COBUCLG  STARTED - INIT 1 - CLASS A - SYS BSP1
19.52.48 JOB    3  IEC130I SYSPUNCH DD STATEMENT MISSING
19.52.48 JOB    3  IEC130I SYSLIB   DD STATEMENT MISSING
19.52.48 JOB    3  IEC130I SYSPUNCH DD STATEMENT MISSING
19.52.48 JOB    3  IEFACTRT - Stepname  Procstep  Program   Retcode
19.52.48 JOB    3  COBUCLG    BASETEST  COB       IKFCBL00  RC= 0000
19.52.48 JOB    3  COBUCLG    BASETEST  LKED      IEWL      RC= 0000
19.52.48 JOB    3  +HELLO, WORLD
19.52.48 JOB    3  COBUCLG    BASETEST  GO        PGM=*.DD  RC= 0000
19.52.48 JOB    3  $HASP395 COBUCLG  ENDED
为了效果对上述列出的第10行加以高亮，这个高亮不是实际的控制台输出。
有关的编译器列表生成了超过四页的技术细节和作业运行信息，针对这14行COBOL的单一一行输出。
== 参考文献 ==