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

PL/Iの世界へようこそ:AUTOMATICとSTATIC、その「命の長さ」をマスターする

メインフレームの世界に飛び込んだ皆さん、ようこそ!COBOLの堅実さや、Javaのオブジェクト指向に慣れていると、PL/Iという言語は少し「古風な魔法」のように見えるかもしれません。

でも、安心してください。PL/Iは非常に論理的で、かつてのエンジニアたちが「いかに効率よく、かつ安全にメモリを使うか」を突き詰めた結果生まれた、非常に理にかなった言語なんです。

今日は、その中でも特に重要で、かつバグの温床になりがちな「メモリの寿命(ストレージ属性)」について、じっくり紐解いていきましょう。

1. メモリの「寿命」を知る:AUTOMATIC vs STATIC

PL/Iにおいて、変数を宣言する際、私たちはその変数が「いつ生まれて、いつ死ぬのか」を制御できます。それが `AUTOMATIC` と `STATIC` です。

AUTOMATIC:使い捨ての「メモ帳」

`AUTOMATIC` は、プロシージャ(関数)が呼ばれた瞬間に生まれ、処理が終わると跡形もなく消え去ります。

  • イメージ: 事務机の上の「作業用メモ用紙」。仕事が終わればシュレッダーにかけますよね?
  • 特徴: 再入可能(Reentrant)。複数のタスクが同時に同じプログラムを動かしても、それぞれが自分専用のメモ帳を持つので、お互いに干渉しません。

STATIC:ずっと残る「金庫」

`STATIC` は、プログラムがロードされた瞬間に生まれ、プログラムが終了するまで決して消えません。

  • イメージ: 部屋の壁に固定された「共有の金庫」。誰がいつ来ても同じ中身が入っています。
  • 特徴: 値が保持されます。ただし、複数タスクで同時にアクセスすると、前のタスクの書き込みが次のタスクに影響を与えるため、注意が必要です。

2. 実践コードで見てみよう

言葉だけだと少し硬いので、実際のコード例を見てみましょう。PL/Iのメインフレーム開発では、これらは `DCL` (DECLARE) 文で指定します。

/i
MY_PROG: PROC OPTIONS(MAIN);

/ AUTOMATICはデフォルトなので省略可能ですが、あえて書くこともあります /
DCL COUNTER_AUTO FIXED BIN(31) AUTOMATIC INIT(0);

/ STATICは値が消えません。プログラム実行中ずっと生き続けます /
DCL COUNTER_STATIC FIXED BIN(31) STATIC INIT(0);

/ 処理のたびに呼び出される内部手続き /
INCREMENT_TEST: PROC;
COUNTER_AUTO = COUNTER_AUTO + 1;
COUNTER_STATIC = COUNTER_STATIC + 1;

PUT SKIP LIST (‘AUTOの値: ‘ || COUNTER_AUTO);
PUT SKIP LIST (‘STATICの値: ‘ || COUNTER_STATIC);
END INCREMENT_TEST;

/ 2回呼び出してみる /
CALL INCREMENT_TEST; / 1回目 /
CALL INCREMENT_TEST; / 2回目 /

END MY_PROG;

実行結果の予測

  • AUTO: `1` → `1` (毎回初期化されるため、増えません)
  • STATIC: `1` → `2` (前回の結果が保持されているため、積み上がります)

この「STATICは値が残る」という特性は、便利な反面、「前回の処理のゴミが残っていて計算が合わない」というバグの代表格になります。特にマイグレーション時に「あれ?なぜか値がおかしい」と思ったら、まず `STATIC` の存在を疑うのがベテランの流儀です。

3. なぜ「再入可能(Reentrancy)」が重要なのか?

メインフレームの世界では、一つのプログラムを大勢のユーザーやバッチが同時に使います。もし、あるユーザーが計算途中の `STATIC` 変数を書き換えている最中に、別のユーザーの処理が割り込んだらどうなるでしょう?

そう、計算結果がめちゃくちゃになりますよね。これを防ぐために、現代のオンライン処理(CICSなど)では、原則として `AUTOMATIC` を使うのが鉄則です。

  • AUTOMATIC: 各タスクがスタック領域に自分専用の領域を確保するので、マルチタスク環境でも安全(再入可能)。
  • STATIC: 全体で共有するため、読み取り専用の定数データや、累積値など「意図した共有」以外ではなるべく避けるのが吉です。

最後に:怖がらなくて大丈夫です

PL/Iのストレージ属性は、メモリ管理という「コンピュータの深淵」に少しだけ触れるインターフェースです。

  • 「使い終わったら忘れていいよ」なら AUTOMATIC
  • 「プログラムが終わるまでずっと覚えていてね」なら STATIC

この2つを使い分けるだけで、皆さんの書くコードはぐっと堅牢で、メインフレームの過酷なバッチ処理にも耐えうるものになります。もしコードを読んでいて `DCL` 文にこのキーワードを見つけたら、「ああ、この変数はこういう性格なんだな」と優しく声をかけてあげてくださいね。

また何か分からないことがあれば、いつでも聞いてください。一緒にメインフレームの深い森を歩いていきましょう!

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