COBOL

COBOL（ˈ），其名稱來自於英語Common Business Oriented Language的縮寫，可譯為通用商業語言或面向常規業務型語言/常規商業資訊處理語言，它屬於編譯語言，是最早的高階程式語言之一，也是最早實施標準化的電腦語言之一。COBOL主要應用於商業數據處理領域，此間大量的資料通常以檔案的形式儲存在磁碟上，它提供強大的檔案處理功能，對各種類型的數據進行收集、存儲、傳送、分類、排序、計算及列印報表、輸出圖像。

## 歷史

1959年5月，美國國防部委託葛麗絲·霍普博士領導一個委員會，制定了COBOL語言的標準。Q14232和其他5位程序員，在紐約曼哈頓的Q2414200封閉兩週，開發完成了COBOL的大部分設計。COBOL最早是以葛麗絲·霍普開發的語言為範本。

COBOL於1961年由Q1023961公布。正式發布於1960年4月，稱為COBOL－60，現在最新的版本是COBOL－2023。1963年，美國國家標準學會進行了標準化，但是ANSI標準很少被遵循，故而COBOL程序只是部分可移植的。

## 遺留

經過多年來的不斷修改、豐富完善和標準化，COBOL已發展為多種版本的龐大語言。COBOL在財會工作、統計報表、計劃編制、情報檢索、人事管理等數據管理及商業數據處理領域，都曾有著廣泛的應用。COBOL多年來被視為過時的語言，但是目前仍有使用COBOL的金融業核心系統在運行中，除了舊有系統太龐大修改不易外，COBOL平台的穩定性也是它生命一直超過預期延續的重要原因。

在2019新型冠狀病毒疫情影響下，美國政府因為需處理大量失業救助，使得COBOL編寫的老舊系統頻繁出現故障，需要同樣上年紀、甚至已退休的老年COBOL程式設計師來協助維護，所以COBOL的創始團隊在網上公開教程和學習資源，讓年輕程式設計師學習COBOL來協助這些程式設計師維護系統，同時也緊急招募COBOL程式設計師來協助維護。

## 特點

COBOL是一種面向數據處理的、面向文件的、面向過程（POL）的高級編程語言，是一種功能很強而又極為冗長的語言。COBOL語法與英文很接近，即使是不懂編程的人也能看懂代碼。僅提供了加、減、乘、除及乘方這五種簡單的算術運算，因而不適於進行科學計算。COBOL適合於具有循環處理周期的環境（例如列印工資支票）以及數據操縱量相當大的環境。

## 程序結構

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寫為：

```cobol
       IDENTIFICATION DIVISION.
       PROGRAM-ID. hello-world.
       PROCEDURE DIVISION.
           DISPLAY "Hello, world!"
           .
```

現在著名的Hello, World!程序例子，於1978年在《C程式語言》書中最初問世的那個時代，在主機上類似的COBOL程序可以通過作業控制語言來提交，並很有可能使用打孔卡閱讀器和80列打孔卡。下面列出的具有空`DATA DIVISION`的代碼，曾使用GNU/Linux和運行MVS 3.8J的IBM System/370 Hercules模擬器測試過。這段寫於2015年的JCL，是從Hercules教程和Jay Moseley保管的樣例派生而來。為了保持那個時代的COBOL程序，HELLO, WORLD用全部大寫字母顯示。

```cobolfree
//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控制台顯示：

```text
    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的單一一行輸出。

## 基本資料

- 域：COBOL 60報告（1960年4月）
- 編程范型：過程式, 指令式, 面向對象
- 發行時間：1959年
- 設計者：Howard Bromberg、Norman Discount、Vernon Reeves、Q14232、William Selden、Gertrude Tierney
- 實作者：Q1023961，美國國家標準協會，國際標準化組織
- 類型系統：弱型別，靜態
- 軟體實現：GnuCOBOL, , Micro Focus Visual COBOL
- dialects：COBOL/2, DEC COBOL-10, DEC PDP-11 COBOL, DEC PDP-11 COBOL-85, DEC VAX COBOL, DOSVS COBOL, Envyr ICOBOL, Fujitsu COBOL, Hitachi COBOL2002, HP3000 COBOL/II, IBM COBOL SAA, IBM COBOL/400, IBM COBOL/II, IBM Enterprise COBOL, IBM ILE COBOL, IBM OS/VS COBOL, ICL COBOL (VME), Micro Focus ACUCOBOL-GT, Micro Focus COBOL-IT, Micro Focus RM/COBOL, Micro Focus Visual COBOL, Microsoft COBOL, Raincode COBOL, Realia COBOL, Ryan McFarland RM/COBOL, Ryan McFarland RM/COBOL-85, Tandem (NonStop) COBOL, Tandem (NonStop) SCOBOL, UNIVAC COBOL, Unisys MCP COBOL74, Unisys MCP COBOL85, X/Open COBOL, Veryant isCOBOL, Wang VS COBOL, WATBOL
- 受影響於：起初：AIMACO、COMTRAN、FACT語言、FLOW-MATIC、COBOL 2002：C++、Eiffel、Smalltalk
- 施影響於：CobolScript、EGL語言、PL/I、商務程式語言
- 文件擴展名：`.cbl`, `.cob`, `.cpy`