PL/Iの「AUTOMATIC変数」とINITIAL属性の秘密:呼び出しごとの初期化は重いのか?
皆さん、こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLの経験がある方にとって、PL/Iは少し「古風で気難しい言語」に見えるかもしれませんね。でも大丈夫、一つひとつ紐解けば、PL/Iは非常に論理的で、かつ計算機のリソースを極限まで使いこなせる「渋い職人のための言語」なんです。
今日は、そんなPL/Iの中でも、特に初心者の方が「あれ?これって毎回動くの?」と疑問に思いがちな、AUTOMATIC変数の初期値(INITIAL属性)についてお話しします。
—
1. そもそもAUTOMATIC変数って何?
PL/Iには「ストレージ属性」という概念があります。その中でも最も標準的なのが `AUTOMATIC` です。
これは、「その手続き(PROCEDURE)が呼ばれている間だけメモリを確保し、終わったら解放する」という、いわゆるJavaのメソッド内ローカル変数や、C言語のスタック変数に近い存在です。
1
/ PROCEDUREの基本構造 /
MY_PROC: PROCEDURE OPTIONS(MAIN);
/ ここで宣言する変数はデフォルトでAUTOMATICになります /
DECLARE COUNTER FIXED BIN(31) INITIAL(0);
/ …処理… /
END MY_PROC;
この `INITIAL(0)` という記述、実は非常に便利ですが、裏側では「PROCEDUREが呼ばれるたびに、この領域に0を書き込む」という作業が発生しているんです。
—
2. 「呼び出しごとの初期化」は悪なのか?
「えっ、毎回初期化していたらパフォーマンスが悪くなるのでは?」と心配になりますよね。結論から言うと、「微々たるものですが、塵も積もれば山となる」です。
例えば、数百万件のレコードを処理するバッチプログラムで、ループの中で何度も呼び出される副手続き(SUBROUTINE)の中に、巨大な配列を `INITIAL` で初期化する宣言があったらどうなるでしょう?
コンパイラは、実行のたびにそのメモリ領域へ値をセットする命令(MVC命令など)をせっせと生成します。これが、メインフレームのCPUサイクルを無駄に消費する原因になることがあるんです。
どう最適化すればいいの?
もし、「初期値は一度設定したら、あとはその値を使い回したい」というケースであれば、`STATIC` 属性を使うのが定石です。
1
/ 比較:STATICを使った効率化 /
PROCESS_DATA: PROCEDURE;
/ STATICはプログラム実行中ずっとメモリに残り続けます /
DECLARE WORK_BUFFER CHAR(100) STATIC INITIAL(‘ ‘);
/ 一度初期化されたら、次回の呼び出し時には前回の値が残っています /
/ 毎回初期化するオーバーヘッドがありません! /
END PROCESS_DATA;
—
3. 初学者が陥りやすい「罠」
ここで一つ、実務でよく見る「冷や汗モノ」のコード例をご紹介します。
1
/ 悪い例:意図せず重い初期化をしてしまっている /
CALC_LOOP: PROCEDURE;
/ この配列の初期化は、呼び出されるたびに実行される! /
DECLARE BIG_ARRAY(10000) FIXED BIN(31) INITIAL((10000)0);
/ … 処理 … /
END CALC_LOOP;
Javaの感覚で「ローカル変数だから綺麗に初期化しなきゃ」と書くと、`BIG_ARRAY` の10,000個の要素を、呼び出しのたびにメインフレームが一生懸命クリアしてくれます。もしこれが1秒間に100回呼ばれたら?……想像するだけでCPU使用率が跳ね上がる音が聞こえてきそうですね。
解決のヒント
- 頻繁に呼ばれる手続きの中では、`INITIAL` を安易に使わない。
- 必要なときだけ `ASSIGNMENT` 文(代入)でクリアする。
- 値が不変なら `STATIC` を検討する。
—
まとめ:PL/Iと仲良くなるために
PL/Iは、プログラマに「メモリをどう扱うか」を細かく指示することを許してくれる、非常にパワフルな言語です。
- `AUTOMATIC`: 手続きのたびに生まれ変わりたい、使い捨ての変数に。
- `INITIAL`: 便利だけど、多用すると「毎回初期化」のコストがかかることを意識する。
- `STATIC`: 長生きさせたい、効率重視の変数に。
「レガシーシステムは怖い」と思われがちですが、実はコンパイラが私たちの書いたコードをどう翻訳しているか、想像しながら書くことで、非常に効率的で美しいプログラムを作ることができるんです。
次回のメインフレーム改修の際には、ぜひ `INITIAL` の裏側を覗いてみてください。「あ、ここはSTATICにした方がスマートかな?」なんて気づけるようになったら、あなたはもう立派なメインフレームアーキテクトの入り口に立っていますよ!
これからも、一緒にPL/Iの深淵を探検していきましょうね。質問があればいつでもコメントください!
