導入
メインフレーム開発において、プロシージャの先頭で変数を初期化する処理は頻繁に行われます。しかし、実行時にしか確定しない値(システム日付や現在の時刻、あるいは動的に生成されるIDなど)を初期化する際、変数の宣言とは別に代入文を記述していませんか?「INITIAL CALL」を利用することで、データ宣言と同時に初期化処理を完結させ、コードの可読性を高め、初期化漏れという人為的なミスを未然に防ぐことができます。
基礎知識
PL/Iにおけるデータ宣言(DCL)では、通常「INIT」キーワードを使用して定数で初期値を指定します。しかし、複雑なシステムでは固定値だけでは不十分です。ここで登場するのが「INITIAL CALL」です。これは、プログラムの実行時に呼び出される関数の戻り値を、変数の初期値として直接割り当てる仕組みです。特にスタック上に確保されるAUTOMATIC変数に対して有効であり、プロシージャが呼び出されるたびに動的に値が設定されます。
実装/解決策
実装は非常にシンプルです。DCL文のINIT属性の中に、呼び出したい関数を記述するだけです。これにより、プロシージャ内の最初の実行可能文(Executable Statement)に到達する前に、必要な初期化が完了します。これにより、初期化のための代入文が不要となり、ロジック部分がスッキリと整理されます。
サンプルプログラム
以下に、システム日付を取得して初期化する実用的な例を示します。
/ サンプル:システム日付を用いた変数初期化 /
GET_DATE: PROCEDURE OPTIONS(MAIN);
/ GET_SYSTEM_DATEは、システム日付をYYYYMMDD形式で返す外部関数を想定 /
/ 宣言と同時に初期化を行うことで、ロジック部での記述を省略可能 /
DCL CURRENT_DAY CHAR(8) INIT(GET_SYSTEM_DATE());
/ 処理ロジック /
PUT SKIP LIST(‘本日の日付は: ‘ || CURRENT_DAY);
END GET_DATE;
/ 補足:GET_SYSTEM_DATEの簡易的な実装例 /
GET_SYSTEM_DATE: PROCEDURE RETURNS(CHAR(8));
DCL DATE_VAL CHAR(8);
/ 実際にはDATE関数やTIME関数を用いて取得する /
DATE_VAL = ‘20231027’;
RETURN(DATE_VAL);
END GET_SYSTEM_DATE;
応用・注意点
この手法を用いる上で、最も注意すべき点は「STATIC変数には使用できない」という制約です。STATIC変数はプログラムのロード時に一度だけ初期化されるものであり、コンパイル時に値が確定している必要があります。実行時に評価が必要なINITIAL CALLは、あくまで実行時に領域が確保されるAUTOMATIC変数に対してのみ有効です。
また、頻繁に呼び出されるプロシージャで、戻り値が重い処理を行う関数をINITIAL CALLに指定すると、性能上のボトルネックになる可能性があります。初期化される関数自体が軽量であることを確認した上で使用してください。コードの簡潔さとパフォーマンスのバランスを考慮することが、メインフレームエンジニアとしての腕の見せ所です。

コメント