PL/Iの「メモリの寿命」を攻略する!STATICとAUTOMATICの境界線
こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきた皆さんにとって、PL/Iのメモリ管理は少しだけ「独特」に映るかもしれません。「えっ、変数の寿命を自分で決めるの?」と戸惑うこともあるでしょう。
でも、安心してください。PL/Iのメモリ管理は、実は非常に理にかなっていて、一度理解すればこれほど制御しやすい言語はありません。今日は、PL/Iのデータ制御の基本中の基本、STATIC(静的)とAUTOMATIC(自動)の生存期間について、紐解いていきましょう。
—
1. 変数にも「寿命」がある?メモリの配置イメージ
プログラムの世界では、変数が「いつ生まれて、いつ消えるか」を知っておくことが非常に大切です。PL/Iでは、大きく分けて2つの生存期間があります。
- AUTOMATIC(自動): ブロック(PROCEDURE)に入ると生まれ、ブロックを抜けると消える「はかない命」。
- STATIC(静的): プログラムが開始されてから終了するまで、ずっとそこに居座り続ける「長寿な存在」。
これを、オフィスのデスクで例えてみましょう。
- AUTOMATICは「付箋メモ」: 作業中に机に貼りますが、作業が終わればゴミ箱に捨てますよね。一時的な計算結果や、その処理だけで必要なフラグはこれで十分です。
- STATICは「名札」: 朝出社した時に机に置き、退社するまでずっとそこにあります。次に誰かが同じ席(プログラム)に座っても、前の人が残した名札がそのまま置いてあるイメージです。
—
2. 実践!コードで見る挙動の違い
では、実際にPL/Iのコードでこの動きを確認してみましょう。`OPTIONS(MAIN)`がついた、メインのプログラム構造です。
/i
EXAMPLE: PROCEDURE OPTIONS(MAIN);
/ 自動ストレージ(宣言のみならデフォルトでAUTOMATIC) /
DCL AUTO_VAR FIXED BIN(31) INIT(0);
/ 静的ストレージ(明示的にSTATICと書く) /
DCL STAT_VAR FIXED BIN(31) STATIC INIT(0);
/ 処理の呼び出し /
CALL INCREMENT_DEMO;
CALL INCREMENT_DEMO;
INCREMENT_DEMO: PROCEDURE;
DCL AUTO_VAR FIXED BIN(31) INIT(0);
DCL STAT_VAR FIXED BIN(31) STATIC INIT(0);
AUTO_VAR = AUTO_VAR + 1; / 呼ばれるたびに0に戻る /
STAT_VAR = STAT_VAR + 1; / 前回の値を保持して増え続ける /
PUT SKIP EDIT (‘AUTO:’, AUTO_VAR, ‘ | STAT:’, STAT_VAR) (A, F(5), A, F(5));
END INCREMENT_DEMO;
END EXAMPLE;
実行結果はどうなるでしょうか?
1. 1回目の呼び出し: `AUTO: 1 | STAT: 1`
2. 2回目の呼び出し: `AUTO: 1 | STAT: 2`
お気づきでしょうか?`AUTO_VAR`は毎回`INIT(0)`で初期化されますが、`STAT_VAR`は2回目の呼び出し時にも「前の値を覚えている」ため、カウントアップが継続されるのです。
—
3. なぜ使い分ける必要があるの?
「全部STATICにしておけば、ずっと値を覚えていて便利じゃない?」と思うかもしれません。しかし、それは大きな落とし穴です。
AUTOMATICを推奨する理由
- メモリの節約: 不要になったらすぐに解放されるため、限られたメモリ資源を効率よく使えます。
- 再帰呼び出しの安全: 同じプロシージャを自分自身で呼び出す「再帰」を行う場合、STATICだと値が混ざってしまい、大惨事になります。AUTOMATICなら、呼び出すたびに独立した変数が作られるので安心です。
STATICをあえて使う場面
- 累計カウント: 上の例のように、処理回数を数えたり、前回処理した日時を覚えておいたりする際。
- 定数テーブルの保持: 毎回メモリにロードし直すと重いような、巨大な検索用テーブルなどを保持する場合。
—
4. 初学者が陥りやすい「罠」
最後に、現場でよくあるトラブルを一つ。
PL/Iでは、宣言を省略すると自動的にAUTOMATICになるというルールがあります。これが時々、意図しないバグを生みます。
「昨日までは動いていたのに、なぜか変数の値がクリアされている……!」
そんな時は、その変数が本当に「ずっと保持されるべきもの(STATIC)」なのか、確認してみてください。もし値を保持し続けたいなら、必ず `DCL XXX STATIC;` と明示的に書く癖をつけるのが、ベテランの作法です。
—
まとめ:怖がる必要はありません
PL/Iのストレージ属性は、プログラムに「責任ある役割」を与えるための便利な道具です。
- 使い捨てなら、AUTOMATIC(デフォルト)
- 記憶が必要なら、STATIC
この2つを意識するだけで、あなたの書くPL/Iコードはぐっと安定し、メインフレームの基幹システムでも胸を張って動かせるようになるはずです。
もし「これって結局、どのメモリ領域の話なの?」と深く知りたくなったら、またいつでも聞いてくださいね。レガシーシステムの裏側は、知れば知るほど面白いですよ!
