PL/Iの世界へようこそ!「CONTROLLED属性」でメモリを自在に操る魔法
こんにちは。メインフレームの世界へようこそ。
これまでJavaのガベージコレクションや、COBOLの固定長データ領域に慣れ親しんできた方にとって、PL/Iのメモリ管理は少しだけ「自由すぎて戸惑う」かもしれません。
でも、安心してください。PL/Iは「開発者の意図を最大限に尊重する」という非常に紳士的な言語です。今回は、その象徴ともいえるCONTROLLED属性による動的メモリ管理について、現場の知恵を交えて紐解いていきましょう。
—
1. そもそも「予約語がない」という不思議
まずPL/Iを触って驚くのが、「予約語(キーワード)という概念がない」ことではないでしょうか。
例えば、`IF`や`THEN`、あるいは今回扱う`ALLOCATE`という言葉であっても、PL/Iでは変数名として使えてしまいます。
/i
/ 極端な例ですが、これも文法的には通ります /
DCL ALLOCATE FIXED BIN(15);
ALLOCATE = 10;
一見すると「なんて危険な言語なんだ!」と思うかもしれませんが、これは「言語仕様としてルールで縛りすぎない」というPL/Iの哲学の表れです。もちろん、実務では可読性を考えてそんな命名はしませんよね(笑)。コンパイラは文脈から「あ、ここで言うALLOCATEは変数じゃなくてコマンドだな」と判断してくれます。この「空気の読めるコンパイラ」こそが、PL/Iの頼もしいところです。
—
2. CONTROLLED属性:メモリ管理の「貸し借り」
Javaなら`new`、C言語なら`malloc`を使う場面で、PL/Iが誇るのが`CONTROLLED`属性です。
この属性をつけた変数は、プログラム側から「今からこのメモリ領域を確保するよ(ALLOCATE)」「もう用済みだから返却するよ(FREE)」と、きめ細かく制御できます。
なぜ「スタック」と違うのか?
一般的な自動変数(AUTOMATIC属性:何も指定しないとこれになります)は、関数(プロシージャ)の呼び出しとともにメモリが確保され、終了とともに消滅します。いわゆる「スタック」の動きですね。
一方、`CONTROLLED`はヒープ領域に近い動きをします。呼び出し側が明示的に指示を出さない限り、その領域は生き続けます。大量のデータを扱うバッチ処理で、必要な時だけメモリを確保して、終わればすぐ解放する。この「メモリの兵糧攻め」を防ぐテクニックが、メインフレームの限られたリソースを有効活用する鍵になります。
—
3. 実践!ALLOCATEとFREEのコード例
では、実際にどのように書くのか見てみましょう。
/i
/ CONTROLLED属性を宣言:メモリを自分で管理する宣言です /
DCL MY_DATA CHAR(100) CONTROLLED;
/ メモリを確保 /
ALLOCATE MY_DATA;
/ 確保した領域に値を代入 /
MY_DATA = ‘ここに処理対象のレコードデータを格納します’;
/ …ここで何らかの重い処理を実行… /
/ 用が済んだらメモリを解放(ここを忘れるとメインフレームでもメモリリークします!) /
FREE MY_DATA;
ここで大切なポイントを一つ。`ALLOCATE`を呼ぶたびに、実はスタックのようにデータが積み重なっていく(プッシュされる)という性質があります。
- 1回目の`ALLOCATE`で領域Aを確保。
- 2回目の`ALLOCATE`を呼ぶと、領域Aの上に領域Bが乗る(Aは一時的に隠れる)。
- `FREE`を呼ぶと、直近のBが消え、再びAが使えるようになる。
この「スタック構造」と「ヒープ的な動的確保」を併せ持っているのがPL/Iの面白いところです。
—
4. 現場で役立つトラブルシューティングのヒント
最後に、現場でよくある失敗談を一つだけ共有しますね。
「`FREE`する前の`ALLOCATE`」
もしループの中で`ALLOCATE`を繰り返すと、無限にメモリを食いつぶします。特にメインフレームの夜間バッチでこれをやると、JCLが異常終了(System ABEND)を起こし、運用担当の方に夜中に電話をかける羽目になります……。
- アドバイス: `ALLOCATE`と`FREE`は必ずセットで管理しましょう。もし複雑なロジックで制御が難しい場合は、`ALLOCATION`という組み込み関数を使って、「今、何個メモリが確保されているか?」を確認する癖をつけると安心です。
最後に:怖がらなくて大丈夫です
PL/Iの構文は、最初は少し古風に見えるかもしれません。しかし、一つひとつの命令には「なぜそうするのか」という合理的な理由があります。
今回紹介した`CONTROLLED`属性も、メモリを「自分で管理する」という強力な武器です。まずは小さなプログラムで`ALLOCATE`と`FREE`を試し、その挙動を肌で感じてみてください。
メインフレームの荒波を越えるための力強い相棒として、PL/Iは必ず応えてくれます。また何か不明点があれば、いつでも聞きに来てくださいね!
