こんにちは。メインフレームの世界へようこそ。
COBOLやJavaでシステム開発をしてきた方にとって、PL/I(ピーエル・アイ)という言語は、まるで「時代に取り残された古風な図書館」のように見えるかもしれません。でも安心してください。PL/Iは、C言語の柔軟性とCOBOLの厳格さを併せ持つ、非常にパワフルで賢い言語です。
今日は、その中でもPL/Iの心臓部とも言える「AUTOMATIC(自動)変数」と「スタック」の不思議な関係について、お話ししましょう。
—
1. プログラムの「作業机」としてのスタック
まず、PL/Iのプログラムがどのように動いているかイメージしてみましょう。
皆さんが`PROCEDURE`(手続き)を呼び出すたび、システムはメモリ上に「作業机」を一つ用意します。これがスタック領域です。この作業机は、そのプロシージャが実行されている間だけ存在し、処理が終われば綺麗に片付けられます。
この「呼び出されるたびにその場で作られ、終われば消える」という性質を持つのが、`AUTOMATIC`ストレージクラスです。実はPL/Iでは、特に指定しなくてもデフォルトで変数は`AUTOMATIC`になります。これは「いちいち宣言しなくても、必要な時に必要なだけメモリを貸してあげるよ」という言語側の親切心ですね。
—
2. 「INITIAL」属性という名の「初期設定」
次に、`INITIAL`属性についてです。例えば、こんな宣言を見かけたことはありませんか?
1
DCL COUNTER FIXED BIN(31) AUTOMATIC INITIAL(0);
ここで多くの初学者が陥る誤解があります。「この変数は、プログラムがコンパイルされた瞬間に0で初期化される」と考えてしまうことです。でも、実は違います。
PL/Iにおいて、`INITIAL`による初期化が行われるのは、「プロシージャが呼び出され、スタック上に領域が確保された、その瞬間」です。
現場で役立つ「なぜ?」のヒント
もし、何万回もループするようなプロシージャの中で、この`INITIAL`付きの変数を宣言していたらどうなるでしょう? そうです、呼び出されるたびに毎回「0」をセットする命令がCPUで実行されるわけです。
非常に微細な差ですが、基幹システムのバッチ処理などで「なぜこの処理だけ少し遅いのか?」という謎を追うとき、この初期化のオーバーヘッドが犯人であるケースが稀にあります。
—
3. 実践コードで見る挙動
では、実際のコードで確認してみましょう。
1
/ メインプロシージャの開始 /
DEMO_PROC: PROCEDURE OPTIONS(MAIN);
/ 呼び出されるたびにスタックが生成される /
CALL SUB_PROCESS;
SUB_PROCESS: PROCEDURE;
/
自動変数(AUTOMATIC)の宣言。
スタック上に領域が確保され、
制御がここを通るたびに 10 で初期化される。
/
DCL WORK_VAL FIXED BIN(31) AUTOMATIC INITIAL(10);
/ 変数の値を変更 /
WORK_VAL = WORK_VAL + 5;
PUT SKIP LIST(‘現在の値は:’, WORK_VAL);
/ ここでプロシージャを抜けると、WORK_VALの領域は消滅する /
END SUB_PROCESS;
END DEMO_PROC;
このコードから学べること
1. スタックの儚さ: `SUB_PROCESS`が終わると、`WORK_VAL`のメモリは解放されます。次にまた`SUB_PROCESS`を呼んでも、値は10から始まります。前回の「15」という結果はどこにも残っていないんです。
2. 初期化のタイミング: 「宣言した場所で初期化される」のではなく、「処理の入り口で初期化される」という感覚を掴んでください。
—
4. なぜこれが大事なのか?
メインフレームの現場では、メモリの節約とCPUの負荷軽減が常に求められます。
もし、すべての変数を`STATIC`(プログラム実行中ずっと残り続ける領域)にすると、メモリはすぐに枯渇します。逆に、むやみに`AUTOMATIC`で巨大な配列を宣言してスタックを溢れさせると、有名な「スタックオーバーフロー」を引き起こします。
「必要な時に、必要な場所で、初期化して使う」。この`AUTOMATIC`の作法は、メモリを大切に扱うための先人たちの知恵なんですよ。
—
最後に:怖がらなくて大丈夫です
PL/Iの構文は一見すると呪文のように見えるかもしれません。でも、その一つ一つには「どうすれば効率よく計算できるか」という明確な理由があります。
もし古いコードを読んでいて、「なぜここでわざわざ`INITIAL`を書いているんだ?」と疑問に思ったら、それは当時の設計者が「この変数はここで確実にリセットしておかないと、バグの温床になる」と注意を払っていた証拠です。
皆さんのシステム移行や保守作業が、この知識で少しでもスムーズになることを願っています。また何か疑問があれば、いつでも聞いてくださいね。現場の戦友として、いつでもサポートしますよ!
