導入
COBOL開発において、プログラム間で処理を連携させる際、最も一般的なのは「静的呼び出し」です。しかし、大規模システムや複雑な業務要件に対応する際、常に特定のプログラムしか呼べない静的呼び出しでは柔軟性に欠けることがあります。そこで登場するのが「動的呼び出し(Dynamic Call)」です。これは、プログラム名を固定せず、変数(データ項目)を介して呼び出す手法です。この技術を使えば、実行時に処理を切り替えるプラグインのような仕組みを構築でき、リリース後の保守性や拡張性が飛躍的に向上します。
基礎知識
まず、「静的呼び出し」と「動的呼び出し」の違いを理解しましょう。静的呼び出しはコンパイル(またはリンク)時に呼び出し先が確定します。一方、動的呼び出しは、実行時にデータ項目の内容を評価し、その名前のプログラムをメモリへロードして実行します。
動的呼び出しのメリットは、呼び出し元のプログラムを再コンパイルすることなく、呼び出される側のプログラム(サブプログラム)を入れ替えられる点にあります。例えば、税率計算モジュールを「消費税8%用」から「10%用」へ差し替える際、動的呼び出しであればメインプログラムを修正せずに対応が可能です。
実装/解決策
動的呼び出しを実装する手順は非常にシンプルです。
1. プログラム名を格納するデータ項目(PIC X(8)など)を定義する。
2. その項目に、呼び出したいプログラム名をMOVEする。
3. CALL命令の対象に、そのデータ項目を指定する。
たったこれだけで、プログラムは指定された名前のロードモジュールを検索し、制御を移します。
サンプルプログラム
以下に、実行時に呼び出し先を切り替えるサンプルコードを示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.
WORKING-STORAGE SECTION.
- 呼び出すプログラム名を保持する領域
01 WS-PROG-NAME PIC X(8).
PROCEDURE DIVISION.
- 状況に応じて呼び出すプログラム名を変数にセット
MOVE “TAXCALC1” TO WS-PROG-NAME.
- 動的呼び出しの実行
- ここでWS-PROG-NAMEの中身が評価され、TAXCALC1が呼ばれる
CALL WS-PROG-NAME.
- 別のプログラムを呼び出す場合も簡単
MOVE “TAXCALC2” TO WS-PROG-NAME.
CALL WS-PROG-NAME.
GOBACK.
応用・注意点
現場で活用する上で、必ず覚えておいてほしい注意点が3つあります。
1. キャンセル処理の重要性: 動的呼び出しでは、一度ロードされたプログラムがメモリに残ることがあります。完全に終了させたい場合は「CANCEL 命令」を明示的に発行してください。これを怠ると、古いメモリ状態が残るバグの原因になります。
2. 存在チェック: 存在しないプログラム名を指定すると、システム異常終了(ABEND)となります。実行前にロード可能か確認する仕組みを入れるか、エラーハンドリングを慎重に行いましょう。
3. パフォーマンスへの意識: 静的呼び出しに比べ、動的呼び出しはプログラムの検索やロードが発生するため、わずかながらオーバーヘッドが生じます。超高速処理が求められるループ内での多用は避け、必要な局面で効果的に利用するのがベテランの知恵です。

コメント