【入門編】STATIC属性と自動ストレージ(AUTOMATIC)の生存期間 – PL/Iの基本構文とデータ制御実践ガイド

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コードはぐっと安定し、メインフレームの基幹システムでも胸を張って動かせるようになるはずです。

もし「これって結局、どのメモリ領域の話なの?」と深く知りたくなったら、またいつでも聞いてくださいね。レガシーシステムの裏側は、知れば知るほど面白いですよ!

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