PL/Iの「初期化」でハマらないために!静的変数と自動変数の意外な落とし穴
こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLの経験がある方なら、「変数を宣言して初期値をセットする」という操作は日常茶飯事ですよね。しかし、PL/Iの門を叩くと、「あれ?思っていたタイミングで初期値が入らないぞ?」という、ちょっとしたミステリーに遭遇することがあります。
今日は、PL/Iのシステムアーキテクトとして、この「初期化のタイミング」という深淵を、現場の知見を交えて紐解いていきましょう。怖がる必要はありません。一つずつ整理すれば、PL/Iは非常に論理的で美しい言語ですからね。
—
1. そもそもPL/Iの変数はどこに住んでいる?
PL/Iの変数には「ストレージ属性」という、いわば「住まい」があります。この住まいによって、初期化のルールが劇的に変わるんです。
- STATIC(静的変数): プログラムがロードされた瞬間に家を建て、プログラム終了までずっとそこに住み続けます。
- AUTOMATIC(自動変数): プログラム(PROCEDURE)が呼び出された時に家を建て、終了とともに家を即座に解体します。
ここがポイントです。「家を建てるタイミング」が違うということは、「初期化(INITIAL属性)を行うタイミング」も全く異なるということなんです。
—
2. 実践コードで見る「初期化」の違い
以下のコードを見てください。現場でよくある「うっかり」を防ぐための例です。
/i
TEST_PGM: PROCEDURE OPTIONS(MAIN);
/ STATICはプログラム開始時に1回だけ初期化される /
DCL STATIC_CNT FIXED BIN(31) STATIC INIT(0);
/ AUTOMATICは呼び出される度に毎回初期化される /
DCL AUTO_CNT FIXED BIN(31) AUTO INIT(0);
/ 処理開始 /
STATIC_CNT = STATIC_CNT + 1;
AUTO_CNT = AUTO_CNT + 1;
PUT SKIP LIST (‘STATICは:’, STATIC_CNT); / 実行するたびに増え続ける /
PUT SKIP LIST (‘AUTOは:’, AUTO_CNT); / いつも1のまま /
END TEST_PGM;
なぜこうなるのか?
- STATIC変数のINITIAL: プログラムがメモリにロードされた「一度きり」しか実行されません。だから、何度も呼び出されるサブルーチン内だと、前回の値を引き継いでカウントアップし続ける「カウンタ」のような使い方ができます。
- AUTOMATIC変数のINITIAL: PROCEDUREが呼ばれるたびに「はい、リセット!」と初期値が書き込まれます。変数のスコープ(生存期間)がそのプロシージャ内だけで完結しているため、非常に安全ですが、値を保持し続けたい用途には向きません。
—
3. 「ALLOCATE」という特異点
もし、皆さんが `CONTROLLED` 属性を使ってメモリを動的に確保する `ALLOCATE` 文を使うなら、話はさらにスリリングになります。
`ALLOCATE` を実行した瞬間、その変数のためのメモリが確保され、その瞬間にINITIAL属性による初期化が走ります。プログラムの開始時ではないのです。
「動的にメモリを確保する」という行為は、いわば「その場での建築」です。建った瞬間に家具(初期値)を搬入するイメージを持つと分かりやすいでしょう。
—
4. 現場からのアドバイス:ここだけは注意!
初心者の皆さんがよくやってしまうのが、「INITIAL属性は、代入文の代わりになる」という誤解です。
PL/Iにおいて、`INITIAL` はあくまで「家を建てる時の初期設定」であって、「代入(ASSIGNMENT)」ではありません。計算の途中で変数をリセットしたいなら、迷わず代入文(`VAR = 0;`)を書いてください。
また、`PROCEDURE` の開始時に初期化される `AUTOMATIC` 変数は、複雑な処理を繰り返すバッチプログラムでは「毎回ゼロクリアされる」という性質を逆手に取って、ワークエリアとして活用するのが鉄則です。
—
まとめ:PL/Iと仲良くなるために
- STATIC は「長老」。一度セットしたら最後まで値を覚えている。
- AUTOMATIC は「旅人」。呼ばれるたびにまっさらな状態で現れる。
- INITIAL は「家の初期装備」。代入の代わりに使うものではない。
いかがでしたか?PL/Iは、メモリ制御を開発者が細かく指定できる、非常に強力な言語です。この「住まいのルール」さえ掴んでしまえば、どんな巨大な基幹システムでも恐れることはありません。
もし「この変数の挙動がどうしても怪しい…」ということがあれば、いつでもまた聞きに来てくださいね。現場のメインフレームは、皆さんの挑戦をいつでも待っていますよ!
