【入門編】AUTOMATIC変数の初期値設定とINITIAL属性 – PL/Iの基本構文とデータ制御実践ガイド

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の深淵を探検していきましょうね。質問があればいつでもコメントください!

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