🖥️ COBOL
Common Business-Oriented Language(1959年生まれ)。金融・保険・官公庁など基幹業務システムで現在も広く使われるレガシー言語。
📌 プログラム4大分割
| DIVISION | 役割 |
|---|---|
IDENTIFICATION DIVISION | プログラム名・作成者などのメタ情報 |
ENVIRONMENT DIVISION | 外部ファイルとの割り当て(SELECT文) |
DATA DIVISION | 変数・ファイルレコードの定義(PIC句) |
PROCEDURE DIVISION | 処理ロジック(動詞を使って記述) |
📌 データ定義(PIC句)
| PIC句 | 意味 | 例 |
|---|---|---|
PIC 9(5) | 数字5桁 | 12345 |
PIC X(10) | 英数字10桁 | HELLO |
PIC S9(7)V99 | 符号付き数字7桁+小数2桁 | -1234567.89 |
PIC 9(5) COMP-3 | パック10進数(内部形式) | 高速演算用 |
PIC 9(5) COMP | バイナリ数値 | 2バイト/4バイト |
📌 主要動詞
COBOLの動詞(命令)は機能別に以下のカテゴリに分類される。
📋 データ操作・転送
| 動詞 | 用途・備考 |
|---|---|
MOVE A TO B | 変数AをBへコピー。型が違っても自動変換(桁あふれに注意) |
MOVE CORRESPONDING A TO B | 同名のフィールドを一括コピー(グループ項目間) |
INITIALIZE WS-REC | 数字項目→0、文字項目→スペースで初期化 |
SET IDX TO 1 | 添字・インデックス値をセット |
SET FLAG-ON TO TRUE | 条件名(88レベル)の値をセット |
🔢 算術演算
| 動詞 | 用途・備考 |
|---|---|
ADD A TO B | B = B + A |
ADD A B GIVING C | C = A + B(Bを変更しない) |
SUBTRACT A FROM B | B = B − A |
SUBTRACT A FROM B GIVING C | C = B − A |
MULTIPLY A BY B | B = B × A |
MULTIPLY A BY B GIVING C | C = A × B |
DIVIDE A INTO B | B = B ÷ A |
DIVIDE A BY B GIVING C REMAINDER D | 商と余りを同時取得 |
COMPUTE C = A + B * (D - E) | 数式で記述。演算子:+ − * / **(べき乗) |
ON SIZE ERROR … | 桁あふれ発生時の例外処理(算術動詞と組み合わせ) |
⚙️ 手続き・制御
| 動詞 | 用途・備考 |
|---|---|
PERFORM PARA-NAME | 段落を1回呼び出す |
PERFORM PARA-NAME THRU PARA-END | PARA-NAMEからPARA-ENDまでの段落群を実行 |
PERFORM PARA-NAME N TIMES | N回繰り返す |
PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10 | カウンタ制御ループ。UNTIL条件が真になると終了 |
PERFORM UNTIL EOF = 'Y' | 条件制御ループ(while相当) |
IF cond … ELSE … END-IF | 条件分岐。ネスト可。END-IFを忘れずに |
EVALUATE TRUE / WHEN cond | 多分岐(switch相当)。WHEN OTHER で default |
GO TO PARA-NAME | 無条件ジャンプ。現代COBOLでは極力使わない |
CALL 'SUBPROG' USING WS-VAR | 外部サブプログラム呼び出し。BY REFERENCE / BY VALUE 指定可 |
EXIT PROGRAM | サブプログラムから呼び出し元へ戻る |
STOP RUN | プログラム終了(メインプログラム用) |
CONTINUE | 何もしない(IF/ELSE の空ブランチに使う) |
📂 ファイル・入出力
| 動詞 | 用途・備考 |
|---|---|
OPEN INPUT file | 読み込み用オープン |
OPEN OUTPUT file | 書き込み用(上書き)オープン |
OPEN I-O file | 読み書き両用オープン(索引ファイルで多用) |
OPEN EXTEND file | 追記オープン |
READ file AT END … | 1レコード読み込み。EOF時にAT END句実行 |
READ file KEY = field INVALID KEY … | 索引ファイルのキー検索。未発見時にINVALID KEY句 |
WRITE record | レコード書き込み(OUTPUT/EXTEND時) |
REWRITE record | 現在レコードを上書き更新(I-O時) |
DELETE file RECORD | 現在レコードを削除(索引ファイル) |
START file KEY >= field | 索引ファイルの読み取り開始位置を設定 |
CLOSE file | ファイルクローズ(必ず実行) |
DISPLAY 'text' variable | コンソール出力 |
ACCEPT variable FROM DATE | システム日付(YYYYMMDD)取得。TIME / DAY-OF-WEEK も可 |
🔤 文字列操作
| 動詞 | 用途・備考 |
|---|---|
STRING s1 s2 DELIMITED BY SIZE INTO res | 複数文字列を連結してresへ格納 |
UNSTRING src DELIMITED BY ',' INTO f1 f2 | デリミタで分割して各変数へ格納 |
INSPECT str TALLYING cnt FOR ALL 'X' | 文字列中の文字数をカウント |
INSPECT str REPLACING ALL 'A' BY 'B' | 文字列置換 |
💡 プログラム構造サンプル
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC X(20) VALUE 'COBOL'.
01 WS-COUNTER PIC 9(3) VALUE 0.
PROCEDURE DIVISION.
MAIN-PARA.
PERFORM VARYING WS-COUNTER
FROM 1 BY 1
UNTIL WS-COUNTER > 5
DISPLAY 'Count: ' WS-COUNTER
END-PERFORM.
STOP RUN.
💡 ファイル処理
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO 'INPUT.DAT'
ORGANIZATION IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-REC.
05 IN-CODE PIC X(5).
05 IN-NAME PIC X(20).
PROCEDURE DIVISION.
OPEN INPUT IN-FILE.
READ IN-FILE AT END MOVE 'Y' TO EOF-FLG.
CLOSE IN-FILE.