こんにちは!メインフレームの世界へようこそ。
COBOLやJavaから来た方にとって、PL/Iは「なんだか古臭い呪文みたいだ」と感じるかもしれませんね。でも安心してください。PL/Iは非常に論理的で、実は現代のプログラミング言語の「原型」とも言えるような、非常に懐の深い言語なんです。
今回は、PL/Iのデータ管理の心臓部である「AUTOMATIC」と「STATIC」という、メモリの住み分けについてお話しします。ここを理解すれば、もうPL/Iでメモリ管理に怯えることはありませんよ。
—
1. そもそも「変数の居場所」ってどこ?
PL/Iの世界では、変数を宣言するときに「お前はどこに住むんだい?」という属性を指定します。これがストレージクラスです。
一番よく使うのが `AUTOMATIC` と `STATIC` です。イメージしやすくするために、こんな例えを使ってみましょう。
- AUTOMATIC(自動変数): 「使い捨てのメモ帳」です。関数(PROCEDURE)が呼ばれるたびに新しいメモ帳が渡され、関数が終わるとゴミ箱へ捨てられます。
- STATIC(静的変数): 「会社の共有掲示板」です。プログラムが起動している間中、ずっと同じ場所にあり続け、誰が書き換えてもその内容は維持されます。
—
2. AUTOMATIC属性:スタック上の「おひとりさま」
PL/Iでは、明示的に指定しない限り、変数は基本的に `AUTOMATIC` になります。
1
MY_PROC: PROCEDURE;
/ この変数はAUTOMATIC。PROCEDUREに入るたびに生成され、抜けると消える /
DCL COUNTER FIXED BIN(31) AUTOMATIC INIT(0);
COUNTER = COUNTER + 1;
PUT SKIP LIST(‘現在の値は:’, COUNTER);
END MY_PROC;
このコードを3回呼び出すとどうなるでしょう?答えは毎回 `1` です。
呼び出しのたびに「新品のCOUNTER」がスタック領域に用意され、処理が終われば綺麗さっぱり消去されるからです。これが安全で管理しやすい理由ですね。
—
3. STATIC属性:プログラムの「古参兵」
一方で `STATIC` は、プログラムが動いている限り、その場所から一歩も動きません。
1
MY_PROC: PROCEDURE;
/ STATICはプログラム開始時に一度だけ生成され、終了まで消えない /
DCL STATIC_COUNTER FIXED BIN(31) STATIC INIT(0);
STATIC_COUNTER = STATIC_COUNTER + 1;
PUT SKIP LIST(‘累計回数:’, STATIC_COUNTER);
END MY_PROC;
これを3回呼び出すと、結果は `1, 2, 3` と増えていきます。
「累計」をカウントしたい時や、重いデータを一度だけ読み込んで使い回したい時には非常に便利です。ただ、メインフレームのバッチ処理では「前の実行時の値が残っていてバグになった!」なんていう古典的なミスが起きやすい場所でもあるので、少し注意が必要ですね。
—
4. 再帰呼び出し(Recursion)で起きる「事件」
さて、ここが一番面白いところです。PL/Iは再帰呼び出し(自分自身を呼び出すこと)が非常に得意な言語です。
もしあなたが `STATIC` を再帰処理の中で使ったらどうなるでしょうか?
自分自身を呼び出すたびに、同じ「共有掲示板」を全員で奪い合うことになります。これはカオスですよね。
- AUTOMATICなら: 再帰のたびに「自分専用のメモ帳」がスタックに積み上がるので、他の再帰階層と干渉しません。
- STATICなら: 全ての階層が同じ変数を参照するため、値がめちゃくちゃに書き換わります。
再帰を行うプログラムを書くときは、必ず `AUTOMATIC` を活用してください。これがPL/Iのメモリ管理の「鉄則」です。
—
まとめ:怖がる必要はありません
PL/Iのコードを初めて見たとき、`DCL`(宣言)の多さに圧倒されるかもしれません。でも、一つずつ紐解けば、それは「コンピュータに対して、このデータをどこにどう配置してほしいか」を丁寧に伝えているだけなんです。
- 基本は `AUTOMATIC`(関数が終われば消える、安全第一!)
- どうしても値を保持したい時だけ `STATIC`(会社の掲示板、管理は慎重に!)
この使い分けさえ押さえておけば、メインフレームの巨大なプログラムだって怖くありません。もしコードを読んでいて「これどっちだっけ?」と迷ったら、いつでもこの「メモ帳 vs 掲示板」の例えを思い出してくださいね。
皆さんのメインフレーム・ライフが、少しでも快適で楽しいものになりますように!また次のステップでお会いしましょう。
