1. 導入:なぜ「ステートメント」の理解が重要なのか
COBOLの世界へようこそ。プログラミングを始めたばかりの方がまず覚えるのが、MOVEやADDといった命令です。これらを「ステートメント」と呼びます。かつてのCOBOLでは、このステートメントの区切りである「ピリオド(.)」の使い方を誤ると、意図しない場所で処理が終了してしまうという厄介なバグが多発しました。現代のCOBOLでは、これを防ぐ「明示的範囲終了指定子」を使うのが常識です。今回は、安全で読みやすいコードを書くためのステートメントの作法を解説します。
2. 基礎知識:ステートメントとピリオドの正体
COBOLにおいて、ステートメントは「命令の最小単位」です。例えば「AにBを足す」という命令は一つのステートメントです。
昔のCOBOLでは、ステートメントの終わりを示すのに「ピリオド」を使用していました。しかし、このピリオドは「その階層の処理をすべて終了させる」という強力な効果があるため、IF文の中に別のIF文を入れるような「入れ子(ネスト)構造」において、ピリオドの位置を間違えるとプログラムが暴走する原因になっていました。
3. 実装と解決策:明示的範囲終了指定子の活用
COBOL 85以降では、「END-IF」「END-PERFORM」といった「明示的範囲終了指定子(スコープターミネーター)」が導入されました。これを使うと、ピリオドに頼らず、どこで命令が終わるのかを明確に記述できます。これにより、入れ子構造を安全に記述でき、ソースコードの可読性も劇的に向上します。
4. サンプルプログラム:安全な記述法
以下は、明示的範囲終了指定子を使用した実用的なサンプルです。そのままコピー&ペーストして確認してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. STATEMENT-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9(3) VALUE 100.
01 WS-B PIC 9(3) VALUE 200.
PROCEDURE DIVISION.
> 演算を行い、エラー時の処理を記述する
ADD WS-A TO WS-B
ON SIZE ERROR
DISPLAY “エラー:数値がオーバーフローしました”
NOT ON SIZE ERROR
DISPLAY “正常終了:計算結果を更新しました”
END-ADD.
> 条件分岐の例
IF WS-A < WS-B THEN
DISPLAY "AはBより小さいです"
IF WS-A > 0 THEN
DISPLAY “かつ、Aは正の数です”
END-IF
END-IF.
STOP RUN.
5. 応用・注意点:現場での鉄則
現場で長く愛されるプログラムを書くための注意点を2つお伝えします。
1. ピリオドはプログラムの「最後」だけに打つ
原則として、 PROCEDURE DIVISION 内でのピリオドは、段落(Paragraph)の終わりやプログラムの最後だけに打ちましょう。処理の途中でピリオドを打つ癖を止めると、意図しない範囲終了を防げます。
2. コードのインデントを揃える
END-IF などの終了指定子を使う際は、対応する IF や PERFORM とインデント(字下げ)を揃えてください。どこからどこまでが一つの処理なのかが一目でわかるようになり、修正時のミスが激減します。
「ピリオドに頼らず、明示的に終わらせる」。これが、ベテランのCOBOL技術者が守っている、最もシンプルで効果的な防衛策です。ぜひ、今日からのコーディングに取り入れてみてください。

コメント