1. 導入: なぜPROGRAM-POINTERが必要なのか
大規模な基幹システムを保守していると、「実行時に条件に応じて呼び出すプログラムを切り替えたい」というニーズに遭遇することがあります。通常、CALL文で直接プログラム名を指定すると固定的なリンクになりますが、PROGRAM-POINTERを利用すれば、プログラムの実行アドレスを動的に制御可能です。これにより、複雑なIFやEVALUATEによる分岐を減らし、関数テーブルのような柔軟なディスパッチ処理を実現できます。
2. 基礎知識: ポインタとエントリポイント
COBOLにおけるポインタとは、メモリ上の特定の場所(アドレス)を指し示すための変数です。通常、COBOLプログラムはコンパイル時に呼び出し先が確定しますが、SET … TO ENTRY文を使うことで、実行時に指定したサブプログラムの開始アドレス(エントリポイント)を取得し、ポインタ変数に格納できます。このポインタ変数を使ってCALLを行うことで、プログラム名が実行時まで未定の状態でも連携が可能になります。
3. 実装/解決策: 動的呼び出しの手順
実装は非常にシンプルです。まず、データ部(WORKING-STORAGE SECTION)でUSAGE IS PROGRAM-POINTER句を指定した変数を定義します。次に、SET文でターゲットとなるプログラム名を指定してアドレスを格納し、最後にそのポインタ変数をCALL文の引数に渡します。
4. サンプルプログラム
以下のコードは、実行時に選択されたサブプログラムを動的に呼び出す例です。
IDENTIFICATION DIVISION. PROGRAM-ID. DYNAMIC-CALL-SAMPLE. DATA DIVISION. WORKING-STORAGE SECTION.
- プログラムアドレスを格納するポインタ変数の定義
- 呼び出したいプログラム名を動的に決定(例としてサブプログラムA)
- プログラム名に対応するエントリポイントをポインタに格納
- ポインタを介してサブプログラムを呼び出し
- 別のプログラムを呼び出す場合も同様にSETし直す
5. 応用・注意点: 現場でのトラブルを避けるために
実務で活用する際は、以下の2点に注意してください。
1. 呼び出し先の存在確認
存在しないプログラム名をSETしようとすると、実行時エラーになる場合があります。環境によってはENTRYの解決が遅延バインディングされるため、呼び出し前にプログラムが存在するかどうかを事前にチェックする仕組みを設けることが安全です。
2. CANCEL文との併用
動的にロードされたサブプログラムは、メモリ上に常駐する場合があります。もし特定のタイミングでメモリを解放したい場合は、CALLの後に適切にCANCEL文を発行することを忘れないでください。これを怠ると、意図しない古い状態のプログラムが呼び出されるリスクがあります。
この技術を習得すれば、プラグイン方式のような拡張性の高いシステム設計が可能になります。ぜひ、複雑な分岐処理の整理に活用してください。

コメント