1. 導入:なぜ今さら「ピリオド」なのか?
COBOLのプログラムを読み解く際、最もバグを生みやすいポイントの一つが「ピリオド(.)」の位置です。現代のプログラム言語では括弧やインデントで制御範囲を明確にしますが、COBOL、特に古い規格のコードでは、このピリオド一つがプログラムの論理構造を決定づけます。「なぜかIF文が意図した通りに動かない」「ELSEが予期せぬ場所で実行される」といったトラブルの多くは、このSENTENCE(文)の範囲指定ミスに起因しています。
2. 基礎知識:SENTENCE(文)とは何か
COBOLにおけるSENTENCEとは、1つ以上の「ステートメント(命令)」を組み合わせ、最後にピリオドを打つことで完結するひとまとまりの単位を指します。
重要なのは、COBOL 85以前の環境では、このピリオドが「IF」や「EVALUATE」などの条件文の終了を宣言する唯一の境界線であったという点です。つまり、ピリオドを打った瞬間に、その条件ブロックがすべて終了したと見なされます。この仕組みを理解していないと、論理の迷宮に迷い込むことになります。
3. 実装と解決策:明示的スコープ終了子を使おう
かつては「IF文の終わりには必ずピリオド」というルールでしたが、現代のCOBOLでは「END-IF」「END-PERFORM」といった明示的スコープ終了子を使用するのが鉄則です。これにより、ピリオドの位置による意図せぬ動作を防ぎ、可読性を劇的に向上させることができます。
4. サンプルプログラム
以下に、古い記述方法と、現代の推奨される記述方法の比較を示します。
000100 PROCEDURE DIVISION.
000200 — 古い書き方 (ピリオドの位置で動作が変わってしまう危険な例) —
000300 IF A = 1
000400 MOVE 10 TO B
000500 . > ここにピリオドがあると、IFの範囲はここまでで終了
000600 DISPLAY B.
000700
000800 — 推奨される書き方 (明示的スコープ終了子を使用) —
000900 IF A = 1
001000 MOVE 10 TO B
001100 END-IF. > END-IFを使うことで、ピリオドの誤配置リスクを回避
001200 DISPLAY B.
5. 応用・注意点:現場で陥りやすい罠
現場で保守を行う際、特に注意すべきは「既存コードの修正」です。古いプログラムに機能追加をする際、安易にピリオドを追加したり削除したりすると、既存のIF文やPERFORM文の構造が崩壊し、プログラム全体に影響が及びます。
また、コピー&ペーストでコードを移動させる際、末尾のピリオドを忘れるとコンパイルエラーになるだけでなく、意図せず後続の文が先行するIF文の配下に組み込まれてしまうことがあります。
「ピリオドは文の終わり」という基本を常に意識し、可能であれば明示的スコープ終了子(END-IF等)へのリファクタリングを検討してみてください。これが、堅牢なCOBOLプログラムを維持する秘訣です。

コメント