【入門編】INITIAL属性による変数初期化のタイミング – PL/Iの基本構文とデータ制御実践ガイド

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は、メモリ制御を開発者が細かく指定できる、非常に強力な言語です。この「住まいのルール」さえ掴んでしまえば、どんな巨大な基幹システムでも恐れることはありません。

もし「この変数の挙動がどうしても怪しい…」ということがあれば、いつでもまた聞きに来てくださいね。現場のメインフレームは、皆さんの挑戦をいつでも待っていますよ!

タイトルとURLをコピーしました