COBOL

本條目存在以下問題，請協助改善本條目或在討論頁針對議題發表看法。

此條目可参照外語維基百科相應條目来扩充。
若您熟悉来源语言和主题，请协助参考外语维基百科扩充条目。请勿直接提交机械翻译，也不要翻译不可靠、低品质内容。依版权协议，译文需在编辑摘要注明来源，或于讨论页顶部标记`{{Translated page}}`标签。

|

此條目需要編修，以確保文法、用詞、语气、格式、標點等使用恰当。 (2024年3月20日)
請按照校對指引，幫助编辑這個條目。（幫助、討論）

|

COBOL编程范型| 过程式编程, 指令式編程, 面向对象程序设计

|

設計者| Howard Bromberg, Norman Discount, Vernon Reeves, 珍·薩姆梅特（英语：Jean E. Sammet）, William Selden, Gertrude Tierney
實作者| 美國數據系統語言協會（英语：CODASYL），美國國家標準協會，國際標準化組織
发行时间| 1959年，​65年前​（1959）
当前版本|

* 2019[1]

型態系統| 強弱型別，類型系統
文件扩展名| `.cbl`, `.cob`, `.cpy`
主要實作產品
GnuCOBOL, IBM COBOL（英语：IBM COBOL）, Micro Focus Visual COBOL
衍生副語言
ACUCOBOL-GT, COBOL-IT, COBOL/2, DEC COBOL-10, DEC VAX COBOL, DOSVS COBOL, 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, isCOBOL, Micro Focus COBOL, Microsoft COBOL, Realia COBOL, Ryan McFarland RM/COBOL, Ryan McFarland RM/COBOL-85, Tandem (NonStop) COBOL85, Tandem (NonStop) SCOBOL, UNIVAC COBOL, Unisys MCP COBOL74, Unisys MCP COBOL85, Unix COBOL X/Open, Visual COBOL, Wang VS COBOL

* 維基教科書中有關COBOL的文本

COBOL（/ˈkoʊbɒl/），其名稱來自於通用商業語言[2]（英語：Common Business Oriented Language）又譯為面向常規業務型語言/常規商業信息處理語言）的縮寫，是最早的高階程式語言、最早實施標準化的計算機語言之一。屬於編譯語言。

## 历史

[编辑]

1959年5月，美國國防部委託葛麗絲·霍普博士領導一個委員會，制定了COBOL語言的標準[3]，並於1961年由美國數據系統語言協會（英语：CODASYL）公布。正式發布於1960年4月，稱為Cobol－60，現在最新的版本是Cobol－2002。COBOL最早是以葛麗絲·霍普開發的FLOW-MATIC（英语：FLOW-MATIC）語言為範本。值得注意的是，葛麗絲·霍普並不是發明COBOL的六人組成員之一。1959 年，在紐約曼哈頓的雪梨荷兰酒店（英语：The Sherry-Netherland），珍·薩姆梅特（英语：Jean E. Sammet）和其他5位程序員閉關兩週，幾乎是無晝夜地開發，完成了 COBOL 的大部分設計。[4]

1963年，美國國家標準學會进行了标准化，但是ANSI标准很少被遵循；因此，COBOL程序只是部分可移植的。

## 重要性

[编辑]

此章節的中立性有争议。
加上此模板的編輯者需在討論頁說明此章節中立性有爭議的原因，以便讓各編輯者討論和改善。

|

此章節需要提供更多來源，否則內容可能無法查證。 (2010年12月19日)

|

经过40多年的不断修改、丰富完善和标准化，COBOL已发展为多种版本的庞大语言，在财会工作、统计报表、计划编制、情报检索、人事管理等数据管理及商业数据处理领域，都有着广泛的应用。

COBOL主要是应用于金融和会计行业等非常重要的商业数据处理领域，即使 COBOL 多年來被視為過時的語言，但是目前大多數的金融業核心系統仍多半使用COBOL，除了舊有系統太龐大修改不易外，COBOL 平台的穩定性也是它生命一直超過預期延續的重要原因。

在2019新型冠狀病毒疫情影响下，美国政府因為需處理大量失業給付，使得COBOL编写的老旧系统頻繁出现故障，需要同样上年纪、甚至已退休的老年COBOL程序员来協助维护，所以COBOL的创始团队在网上公开教程和学习资源，让年轻程序员学习COBOL来协助这些程序员维护系統，同时也紧急招募COBOL程序员来协助维护。[5]

## 特点

[编辑]

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（英语：Job Control Language）来提交，并很有可能使用打孔卡阅读器和80列打孔卡。下面列出的具有空`DATA DIVISION`的代码，曾使用GNU/Linux和运行MVS（英语：MVS） 3.8J的System/370（英语：IBM System/370） Hercules模拟器测试过。这段写于2015年的JCL，是从Hercules教程和Jay Moseley保管的样例派生而来[6]。为了保持那个时代的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的单一一行输出。

## 参考文献

[编辑]

1. ^ http://www.iso.org/iso/home/store/catalogue_ics/catalogue_detail_ics.htm?csnumber=51416.
2. ^ 國家教育研究院 學術名詞COBOL.  [2017-06-08]. （原始内容存档于2017-08-05）.
3. ^ Early Meetings of the Conference on Data Systems Languages. IEEE Annals of the History of Computing. 1985, 7 (4): 316–325. S2CID 35625728. doi:10.1109/MAHC.1985.10047.
4. ^ 又走了一位大牛！COBOL 語言的聯合設計者離世.  [2017-06-08]. （原始内容存档于2017-06-21）.
5. ^ 大型主機疫情期用量飆高，美數個州急徵COBOL人才. iThome.  [2020-04-15]. （原始内容存档于2020-04-17） （中文（繁體））.
6. ^ Moseley, Jay. COBOL Compiler from MVT. 17 January 2015  [19 July 2015]. （原始内容存档于2015-07-22）.

* 查
* 论
* 编

程序设计语言

范型|

| 过程式|

* FORTRAN
* COBOL
* JOVIAL
* ALGOL 60
* JOSS（英语：JOSS）
* BASIC
* PL/I
* MUMPS（英语：MUMPS）
* ALGOL 68
* Forth
* Pascal
* Turbo Pascal
* C
* Modula-2
* Ada 83
* occam
* Oberon
* Go
* Zig

|

面向对象|

* Simula 67
* Smalltalk
* Objective-C
* Eiffel
* Object Pascal
* Delphi
* Self
* Visual Basic
* Gambas
* Ada 95
* Java
* C#
* Vala

多范型|

* C++
* Modula-3
* Dylan
* Python
* Lua
* JavaScript
* Ruby
* D
* Factor
* Scala
* F#
* F*
* Haxe
* Nim
* Rust
* Dart
* Julia
* Swift

函数式|

* LISP
* Scheme
* Common Lisp
* Clojure
* Logo
* APL/J
* ML
* Standard ML
* OCaml
* Erlang
* Elixir
* Haskell
* Curry
* SAC
* Agda
* Idris
* jq（英语：jq (programming language)）
* Cuneiform

逻辑式|

* Prolog
* Datalog
* Mercury
* AnsProlog

脚本语言|

| 动态语言|

* SNOBOL
* Icon
* REXX
* Perl
* Raku
* Tcl/Tk
* CLOS
* newLISP
* Python
* Lua
* Ruby
* PHP
* Hack
* CFML（英语：ColdFusion Markup Language）
* REBOL
* Julia

|

Shell语言|

* Unix shell
* sh/ash
* csh/tcsh
* ksh
* bash
* zsh
* rc（英语：rc (Unix shell)）
* sed
* AWK
* PowerShell

ECMA-262|

* ECMAScript
* JavaScript
* TypeScript
* CoffeeScript/LiveScript（英语：LiveScript (programming language)）
* Elm
* PureScript
* Reason

特定平台|

| .NET|

* C#
* C++/CLI
* F#
* PowerShell
* VB.NET
* Small Basic

|

JVM|

* Java
* AspectJ（英语：AspectJ）
* Scala
* Clojure
* Groovy
* Kotlin

特定领域|

| 科学计算|

* Speakeasy（英语：Speakeasy (computational environment)）
* IDL
* GDL
* Maxima
* Maple
* MATLAB
* Octave
* Scilab
* Wolfram
* R
* Yorick（英语：Yorick (programming language)）
* SageMath
* Julia

|

GPU计算|

* Cg/HLSL
* GLSL
* Brook（英语：BrookGPU）
* OpenCL
* SYCL
* CUDA/PTX（英语：Parallel Thread Execution）
* Futhark
* SPIR-V（英语：Standard Portable Intermediate Representation）

数据查询|

* SQL
* PL/SQL
* T-SQL
* SQL/PSM（英语：SQL/PSM）
* xBase（英语：xBase）
* XPath
* XQuery（英语：XQuery）
* GraphQL

可视化|

* Simulink
* LabVIEW
* Orange（英语：Orange (software)）
* KNIME（英语：KNIME）
* Scratch
* Snap!
* Power Fx

传媒设计|

* SuperCollider
* Pure Data
* Processing
* ChucK

` `|

| 其它|

* 汇编语言
* APT（英语：APT (programming language)）
* GPSS（英语：GPSS）
* dc
* yacc
* make
* PostScript
* XSLT
* LLVM IR
* WebAssembly

|

* 目录
* 列表
* 历史
* 比较（英语：Comparison of programming languages）
* 时间线（英语：Timeline of programming languages）

| 规范控制数据库：各地 |

* 法国
* BnF data
* 德国
* 以色列
* 美国

|

*[查]: 查看该模板
*[论]: 讨论该模板
*[编]: 编辑该模板