導入
COBOLの現場で長年仕事をしていると、「1つのソースファイルには1つのプログラム」というルールが絶対だと思い込んでいる若手によく出会います。しかし、COBOLには「翻訳単位(Compilation Unit)」という概念があり、1つのファイルに複数のプログラムを詰め込むことが可能です。この仕組みを理解しておくと、共通処理のライブラリ化や、関連する小規模なプログラム群の管理が非常に効率的になります。今回は、この「翻訳単位」の基本と、実務での活用・注意点を解説します。
基礎知識
翻訳単位とは、簡単に言えば「コンパイラに1回読み込ませて処理されるソースコードの範囲」のことです。通常はソースファイル1つがそのまま翻訳単位になりますが、COBOLでは「END PROGRAM」句を使用することで、1つのファイル内に複数の独立したプログラムを記述できます。これらは一括してコンパイルされ、単一のオブジェクトモジュールとして生成されます。
実装/解決策
複数のプログラムを1つの翻訳単位に含める場合、各プログラムの開始を「PROGRAM-ID」、終了を「END PROGRAM」で明確に囲む必要があります。これにより、コンパイラはどこまでがプログラムAで、どこからがプログラムBかを正確に識別します。この手法は、メインプログラムと、そこから呼び出されるサブルーチンを同一ファイルで管理したい場合に非常に有効です。
サンプルプログラム
以下のコードは、メインプログラムから内部的に定義されたサブプログラムを呼び出す例です。
PROGRAM-ID. MAIN-PROG.
ENVIRONMENT DIVISION.
PROCEDURE DIVISION.
> メイン処理からサブプログラムを呼び出す
DISPLAY “メインプログラムを開始します。”
CALL “SUB-PROG”
DISPLAY “メインプログラムを終了します。”
STOP RUN.
END PROGRAM MAIN-PROG.
PROGRAM-ID. SUB-PROG.
ENVIRONMENT DIVISION.
PROCEDURE DIVISION.
> 独立したサブルーチンとしての処理
DISPLAY “サブプログラムが呼び出されました。”
EXIT PROGRAM.
END PROGRAM SUB-PROG.
応用・注意点
この手法を用いる際の最大の注意点は、「保守性と可読性のバランス」です。1つのファイルに何千行ものコードを詰め込むと、特定の箇所を修正したい時にどこに何があるか分からなくなる「巨大ソース」化の原因となります。
また、デバッグの観点からは、「オブジェクトモジュールのサイズ」にも注意してください。1つの翻訳単位にプログラムを詰め込みすぎると、特定のプログラムだけを再コンパイルしたい場合でも、ファイル全体をコンパイルし直す必要が生じ、ビルド時間が長引く可能性があります。
現場でのベストプラクティスとしては、「密接に関連する小規模なユーティリティ群」を1つの翻訳単位にまとめ、それ以外は独立したファイルとして管理するのが、安定したシステム運用のコツです。

コメント