COBOL 雖然是一種較為古老的程式語言,但它在大規模批次和交易處理的企業級應用中仍然扮演著重要的角色。理解 COBOL 的程式結構,對於維護現有系統或開發新的 COBOL 應用程式至關重要。COBOL 的程式結構非常嚴謹,程式碼以欄位和區段的方式組織,並區分為四大區塊:識別區、環境區、資料區和程式區。每個區塊都有其特定的功能和語法規則,例如資料區用於定義變數和資料結構,而程式區則用於撰寫程式邏輯。瞭解這些區塊的組成和作用,以及 COBOL 中特有的資料型別和變數宣告方式,有助於開發者更有效地使用 COBOL 進行程式設計。此外,COBOL 的檔案處理能力也是其重要特性之一,瞭解如何定義和操作檔案,對於處理大型資料集至關重要。
COBOL 語言概覽
COBOL 是大型主機應用程式開發的標準語言,具備處理大規模批次和交易作業等企業級應用所需的特性。
COBOL 的歷史背景
COBOL 是歷史悠久的程式語言之一,卻依然穩健並在商業運算中扮演關鍵角色。該語言的發展始於 1950 年代末期,當時眾多電腦語言相繼問世,但多數相當複雜,使得開發耗時且昂貴。
為解決此問題,美國國防部聯合 IBM、Burroughs Corporation、Honeywell 及 RCA 等電腦公司,以及學術界和客戶,共同成立了資料系統語言會議(CODASYL)委員會。CODASYL 參考了 FLOW-MATIC 語言作為 COBOL 的範本。FLOW-MATIC 由電腦先驅 Grace Hopper 開發,是第一種使用類別英語指令進行資料處理的語言,並被用於早期大型主機系統,如 UNIVAC I。
CODASYL 的主要考量包括使 COBOL 能在不同電腦上執行,並專注於企業需求,如會計和客戶報表。COBOL 至今仍專注於商務應用,無法用於建立網站或行動應用程式。
COBOL 的版本演進
COBOL 的第一個版本稱為 COBOL 60,於 1959 年發布。儘管初期存在缺陷,但隨著編譯器的發展和新功能的加入,如表格處理,COBOL 逐漸成熟。
然而,隨著 COBOL 的普及,相容性問題浮現。為此,美國國家標準協會(ANSI)於 1968 年制定了 COBOL X3.23 標準。隨後,COBOL 繼續演進,分別發布了 COBOL 85、COBOL 2002 等版本,並於 2019 年發布了最新的 COBOL V6.3。
為何使用 COBOL?
COBOL 並非通用型程式語言,其主要專注於資料處理。然而,其專業性和悠久歷史使其無處不在。根據統計,每日 COBOL 交易量遠超 Google 搜尋量,且全球超過 80% 的程式碼為 COBOL。
COBOL 的優勢包括:
- 可擴充套件性:能夠處理大量資料,並具備豐富的資料結構和存取功能。
- 穩定性:具備向後相容性,無需頻繁重寫程式碼。
- 簡單性:易於學習和使用,無需深厚的數學背景。
- 可稽核性:即使不懂 COBOL,也能理解其工作流程。
- 結構化:具備預定義的程式結構,易於理解和維護。
- 速度:作為編譯語言,能夠提升效能。
- 靈活性:標準 COBOL 語言功能全面,並具備多種擴充功能,如資料函式庫和交易系統支援。
- 數學運算:具備便捷的貨幣處理和格式化功能。
COBOL 程式結構:欄位安排
COBOL 程式具備明確的組織結構,程式碼排列在 80 個欄位中,這源自早期的打孔卡時代。如圖 4-1 所示,COBOL 程式碼的欄位安排具有特定的視覺佈局。
圖示:COBOL 程式碼的 80 欄位佈局
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title COBOL 語言程式結構詳解
package "系統架構" {
package "前端層" {
component [使用者介面] as ui
component [API 客戶端] as client
}
package "後端層" {
component [API 服務] as api
component [業務邏輯] as logic
component [資料存取] as dao
}
package "資料層" {
database [主資料庫] as db
database [快取] as cache
}
}
ui --> client : 使用者操作
client --> api : HTTP 請求
api --> logic : 處理邏輯
logic --> dao : 資料操作
dao --> db : 持久化
dao --> cache : 快取
note right of api
RESTful API
或 GraphQL
end note
@enduml此圖示展示了 COBOL 程式碼的基本欄位結構,有助於理解其組織方式。
內容解密:
此圖示清晰地呈現了 COBOL 程式碼在 80 欄位中的分佈情況:
- 欄位 1-6 用於行號標識,有助於程式碼管理和除錯。
- 欄位 7 為指標欄,用於標記註解、續行等特殊情況。
- 欄位 8-11(A區) 和 欄位 12-72(B區) 是主要的程式碼撰寫區域,用於存放 COBOL 陳述式和邏輯。
- 欄位 73-80 為識別區,通常用於註解或額外的識別資訊。
這種結構化的欄位安排是 COBOL 語言的一大特色,不僅便於閱讀和維護,也體現了其在歷史背景下的設計考量。
COBOL 程式結構解析
COBOL(Common Business Oriented Language)是一種專為商業應用設計的程式語言,其結構嚴謹且具有特定的語法規則。瞭解 COBOL 的基本結構對於撰寫有效的 COBOL 程式至關重要。
COBOL 程式欄位結構
COBOL 程式碼的欄位結構具有特定的意義,不同的欄位用於不同的目的。
欄位說明
第 1-6 欄位:在過去使用打孔卡的時代,這些欄位用於標示行號。雖然現在已不再使用,但瞭解其歷史背景有助於理解 COBOL 的演變。
第 7 欄位:此欄位有多種用途。若在此欄位輸入星號(
*),則該行被視為註解,用於檔案說明程式碼。例如,在序列行 000012 中,可以看到註解的使用。此外,連字號(-)可用於表示續行,增強程式碼的可讀性。範例如下:'123ad53535d3506968223dcs9494029dd3393' - '8301sd0309139c3030eq303'這種寫法適用於字串或數值,且有助於提高程式碼的可讀性。
第 8-11 欄位(A margin 或 Area A):此區域用於撰寫主要的程式碼標頭,包括 division、section、段落名稱以及層級編號(01 和 77)。例如,在圖 4-1 中,
IDENTIFICATION DIVISION和PROCEDURE DIVISION就位於 Area A。第 12-72 欄位(B margin 或 Area B):大部分的程式碼將寫在此區域。
第 73-80 欄位:在現代 COBOL 開發中,這些欄位已不再使用。
COBOL 程式結構:Divisions
COBOL 程式按照特定的順序組織成四個主要的 divisions,每個 division 以句點(.)結束。它們的順序如下:
IDENTIFICATION DIVISION:提供程式的基本資訊,如程式名稱。ENVIRONMENT DIVISION:描述程式的執行環境,包括檔案存取的設定。DATA DIVISION:定義程式中使用的資料結構。PROCEDURE DIVISION:包含程式的邏輯和運算指令。
每個 division 可以包含 sections、paragraphs 和 sentences,並且除了 PROCEDURE DIVISION 外,其他 divisions 中的這些元素都以句點結束。
IDENTIFICATION DIVISION
這是 COBOL 程式中最簡單的 division,通常至少包含兩行:
IDENTIFICATION DIVISION.
PROGRAM-ID. CUSTRP.
PROGRAM-ID 是必要的,因為它提供了程式的名稱,用於編譯過程。名稱最長可達 30 個字元,但通常根據主機環境的不同有特定的命名規則。
ENVIRONMENT DIVISION
此 division 用於設定檔案存取和其他環境相關的設定。它包含兩個主要的 sections:
CONFIGURATION SECTION:提供關於電腦系統和特定設定的資訊,例如貨幣符號的設定。ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM ENTERPRISE Z/OS. OBJECT-COMPUTER. VAX-6400. SPECIAL-NAMES. CURRENCY IS DOLLARS.INPUT-OUTPUT SECTION:定義程式如何存取檔案。ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO CUSTOMERMAST ORGANIZATION IS SEQUENTIAL.這裡,
CUSTOMER-FILE是程式內部使用的檔案名稱,而CUSTOMERMAST是主機檔案系統中的實際檔案名稱。這種對應關係使得檔案名稱的變更可以透過 JCL(Job Control Language)中的 DD 陳述式來處理,而無需修改原始碼。
DATA DIVISION
在 COBOL 程式開發中,資料結構的定義佔據了重要的部分,這是在 DATA DIVISION 中完成的。它包含三個主要的 sections:
WORKING-STORAGE SECTION:用於定義變數或欄位,以儲存資料。FILE SECTION:與檔案相關的資料結構定義。LINKAGE SECTION:用於定義與外部程式介面時的資料傳遞結構。
WORKING-STORAGE SECTION
在此 section 中,開發者定義變數或欄位,以儲存程式執行過程中所需的資料。COBOL 中的變數通常被稱為欄位。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CUSTOMER-NAME PIC X(30).
01 CUSTOMER-ID PIC 9(5).
在上述範例中,定義了兩個欄位:CUSTOMER-NAME 和 CUSTOMER-ID,分別用於儲存客戶姓名和客戶 ID。
內容解密:
DATA DIVISION是用來定義 COBOL 程式中的資料結構。WORKING-STORAGE SECTION用於定義變數或欄位,供程式使用。- 正確定義資料結構對於 COBOL 程式的正確執行至關重要。
COBOL 資料結構與變數宣告詳解
COBOL 語言中的變數宣告與現代程式語言有顯著不同。COBOL 的變數全域皆可存取,這與現代語言中的區域變數概念有所區別。瞭解 COBOL 的資料結構與變數宣告對於開發穩健的 COBOL 程式至關重要。
基本變數宣告範例
WORKING-STORAGE SECTION.
01 INVOICE-NUMBER PIC 99 PACKED-DECIMAL VALUE 0.
內容解密:
- 層級編號(Level Number):
01表示變數的層級,範圍從01到49,用於定義資料的階層結構。 - 欄位名稱(Field Name):
INVOICE-NUMBER是變數名稱,最多可達 30 個字元。 - PIC 子句(PIC Clause):
PIC 99表示該變數可儲存兩位數字,PIC是Picture的縮寫,用於定義資料的格式。 - USAGE 子句:
PACKED-DECIMAL指定資料儲存方式為壓縮十進位制,適合數學運算。 - VALUE 子句:
VALUE 0設定變數的初始值為0。
資料群組(Data Group)
在商業應用中,資料通常會被分組管理,例如客戶記錄包含客戶編號、姓名、地址等。COBOL 允許使用層級編號來定義資料群組:
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CUSTOMER-RECORD.
05 CUSTOMER-NUMBER PIC 9(5).
05 CUSTOMER-NAME PIC X(20).
05 CUSTOMER-ADDRESS PIC X(50).
內容解密:
CUSTOMER-RECORD是一個群組描述,沒有PIC子句。- 群組內的變數如
CUSTOMER-NUMBER、CUSTOMER-NAME和CUSTOMER-ADDRESS分別定義了不同的資料格式和長度。 - 可對整個群組進行操作,如將所有欄位設為空白:
MOVE SPACES TO CUSTOMER-RECORD。 - 也可對群組內的個別欄位進行指定,如:
MOVE 111 TO CUSTOMER-NUMBER。
PIC 子句詳解
PIC 子句用於定義欄位的資料型別和長度,常見的型別包括:
- 數值型(Numeric):如
PIC 9(2)表示可儲存兩位數字。 - 數值編輯型(Numeric Edited):用於格式化數字,如
++99/99/99++或++$999.99++。 - 字母數字型(Alphanumeric):如
PIC X(3)可儲存任意三個字元。 - 字母型(Alphabetic):如
PIC A(10)僅允許字母。
使用 PIC 子句時需注意不同型別的應用場景,例如處理日期、貨幣或電話號碼時需選擇合適的型別和格式。
USAGE 子句的重要性
USAGE 子句指定資料的儲存方式,常見的有:
DISPLAY:預設值,適合列印輸出。PACKED-DECIMAL:適合數學運算,效能較佳。BINARY(如COMP-4):用於索引資料,但不建議用於數學運算以避免捨入誤差。
在商業應用中,為了精確處理金額等資料,通常推薦使用 PACKED-DECIMAL。
COBOL 程式結構:區段解析
COBOL(Common Business Oriented Language)是一種專為商業應用設計的程式語言,其程式結構嚴謹且獨特。以下將探討 COBOL 的程式結構,特別是在資料定義、條件設定以及程式邏輯組織方面的特性。
資料定義與層級結構
在 COBOL 中,資料定義是透過 DATA DIVISION 來實作的。其中,層級結構(Level Numbers)用於組織資料,例如 01、05、10 等層級號碼代表不同的資料群組或元素。
簡單範例
01 CUSTOMER-RECORD.
05 CUSTOMER-NUMBER PIC 9(5).
05 CUSTOMER-NAME.
10 FIRST-NAME PIC X(10).
10 LAST-NAME PIC X(10).
05 CUSTOMER-ADDRESS PIC X(50).
在這個範例中,CUSTOMER-RECORD 是一個群組專案,包含客戶編號、客戶姓名(進一步分為姓和名)以及客戶地址。
特殊層級號碼:88 層級
COBOL 中的 88 層級號碼用於定義條件名稱,使得條件判斷更加直觀和易於維護。例如:
01 CUSTOMER-CODE PIC X.
88 FREE-VERSION VALUE 'F'.
88 PREMIUM-VERSION VALUE 'P'.
88 ENTERPRISE-VERSION VALUE 'E'.
內容解密:
88層級用於定義條件名稱,例如FREE-VERSION、PREMIUM-VERSION和ENTERPRISE-VERSION,這些條件名稱對應特定的值。- 當使用
SET PREMIUM-VERSION TO TRUE時,CUSTOMER-CODE被設為'P'。 - 在條件判斷中,可以直接使用這些條件名稱,如
IF PREMIUM-VERSION,簡化了程式碼。
FILE SECTION 與檔案處理
FILE SECTION 用於定義檔案結構,例如:
FILE SECTION.
FD CUSTMAST.
01 CUSTOMER-MASTER.
05 CUST-NUM PIC 9(2).
05 CUST-FNAME PIC X(20).
05 CUST-LNAME PIC X(20).
內容解密:
FD是檔案描述(File Description)的縮寫,用於定義檔案名稱和結構。CUSTMAST是檔案的內部名稱,與ENVIRONMENT DIVISION中的檔案設定相對應。CUSTOMER-MASTER是檔案記錄的結構定義。
常數與 REDEFINES 指令
COBOL 沒有傳統意義上的常數,但提供了圖形常數(Figurative Constants),如 ZERO、SPACE 等。此外,REDEFINES 指令允許對同一記憶體區域進行不同的資料定義,例如:
01 PHONE-NUMBER PIC 9(10).
01 PHONE-NUMBER-X REDEFINES PHONE-NUMBER.
05 AREA-CODE PIC 9(3).
05 TELEPHONE-PREFIX PIC 9(3).
05 LINE-NUMBER PIC 9(4).
內容解密:
REDEFINES用於對同一資料項進行不同的定義。- 在這個範例中,
PHONE-NUMBER-X對PHONE-NUMBER進行重新定義,將其分為區號、字首和線路號碼。
PROCEDURE DIVISION 與程式邏輯
PROCEDURE DIVISION 是 COBOL 程式的執行部分,用於實作程式邏輯。良好的程式結構應該將邏輯分解為子程式或程式,以提高可讀性和可維護性。
範例
IDENTIFICATION DIVISION.
PROGRAM-ID. PRINTNAME.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 USER-NAME PIC X(15).
PROCEDURE DIVISION.
ACCEPT USER-NAME
DISPLAY 'Hello, ' USER-NAME
STOP RUN.
內容解密:
PROCEDURE DIVISION是程式的執行部分。- 在這個範例中,程式接受使用者輸入的姓名,並顯示問候訊息。
STOP RUN.用於終止程式執行。