PL/Iの「CONTROLLEDストレージ」でメモリを自在に操る:スタック管理の秘密
こんにちは。メインフレームの深淵へようこそ。
普段、Javaでガベージコレクションに頼り切りだったり、COBOLの固定長データ領域に慣れ親しんでいると、PL/Iの「ストレージ属性」という概念は、最初少しだけとっつきにくく感じるかもしれません。
でも大丈夫です。PL/Iのメモリ管理は、言ってみれば「自分専用の整理棚(スタック)」を自由に増減させるようなものなんです。今回は、その中でも特に強力で、少しだけクセのある「CONTROLLED(制御付き)」ストレージについて、現場の知見を交えて紐解いていきましょう。
—
そもそも「CONTROLLED」って何?
通常の変数は、プログラムが始まれば領域が確保され、終われば解放されますよね。これを「自動(AUTOMATIC)ストレージ」と呼びます。
しかし、基幹システムのバッチ処理では、「今この瞬間にだけ、巨大なワークエリアが必要なんだけど、処理が終わったらメモリを返してほしい」という場面が多々あります。ここで登場するのが `CONTROLLED` です。
`CONTROLLED` を指定した変数は、プログラマであるあなたが `ALLOCATE`(確保)と `FREE`(解放)を明示的に指示しない限り、メモリ上に物理的な実体を持ってくれません。 まるで、必要な時だけ呼び出す「魔法の箱」のような存在です。
—
スタック構造としての「世代管理」
`CONTROLLED` の最大の特徴は、「スタック(積み上げ)」構造になっていることです。
同じ名前の変数を繰り返し `ALLOCATE` すると、古いデータは消えるのではなく、その「下」に隠されます。これをPL/Iでは「世代(Generation)」と呼びます。
直感的なイメージ
1. `ALLOCATE A;` → 1個目の箱を置く(世代1)
2. `ALLOCATE A;` → 2個目の箱を1個目の上に置く(世代2)
3. この状態で `A` を参照すると、常に一番上の箱(最新の世代)が見えます。
4. `FREE A;` をすると、一番上の箱が取り除かれ、隠れていた世代1の箱が再び現れます。
便利でしょう? この仕組みを使えば、再帰呼び出しや、複雑なデータ構造の階層管理が驚くほどスマートに書けるんです。
—
実践コード:ALLOCATEとFREEの作法
では、実際のコードで動きを見てみましょう。PL/Iらしい大文字ベースの記述です。
/i
DEMO_PROC: PROCEDURE OPTIONS(MAIN);
/ CONTROLLED属性を宣言。まだメモリ領域は確保されていません /
DCL MY_BUFFER CHAR(100) CONTROLLED;
/ 1回目の確保(世代1) /
ALLOCATE MY_BUFFER;
MY_BUFFER = ‘第一世代のデータ’;
PUT SKIP LIST(‘現在値: ‘ || MY_BUFFER);
/ 2回目の確保(世代2:世代1の上に積み上がる) /
ALLOCATE MY_BUFFER;
MY_BUFFER = ‘第二世代のデータ’;
PUT SKIP LIST(‘現在値: ‘ || MY_BUFFER);
/ 解放(世代2が消え、世代1が復活する) /
FREE MY_BUFFER;
PUT SKIP LIST(‘解放後の値: ‘ || MY_BUFFER);
/ 最後の解放 /
FREE MY_BUFFER;
END DEMO_PROC;
—
現場で役立つ「気をつけるべきポイント」
この機能を使いこなす上で、ベテランとして一つだけ忠告させてください。
1. 「ALLOCATEの数」と「FREEの数」を合わせる
`ALLOCATE` した回数分だけ `FREE` しないと、メモリリーク(領域の食い潰し)が発生します。特にループ処理の中で `ALLOCATE` を書く場合は、必ず対になる `FREE` がパスを通るように設計してください。
2. 「ALLOCATION」状態の確認
PL/Iには `ALLOCATION(変数名)` という便利な関数があります。これを使うと、「今、その変数は確保されているか?」を整数値(確保されていれば1以上)で返してくれます。デバッグ時に「あれ?今何個積み上がってるんだっけ?」と迷ったら、迷わずこれを使ってください。
3. なぜ今、これを使うのか?
最近の言語ではリスト構造やポインタを駆使しますが、メインフレームの世界では、「限られたメモリリソースをいかに効率よく再利用するか」という命題が常にあります。大きな配列を毎回静的に確保するのではなく、必要な時に必要な分だけ `CONTROLLED` で確保する。この手法は、高負荷な基幹系バッチを安定して走らせるための、古くからの「賢者の知恵」なのです。
—
最後に:怖がる必要はありません
PL/Iのキーワードは、一見すると独特で威圧感があるかもしれません。しかし、一つひとつの属性には「どうすればシステムを効率的に動かせるか」という、設計者の深い意図が込められています。
`CONTROLLED` は、メモリを支配する強力なツールです。まずは小さなプログラムで `ALLOCATE` と `FREE` を繰り返し、スタックが入れ替わる様子をトレースしてみてください。その挙動が理解できた時、あなたはもう、メインフレームのメモリ管理を自在に操るアーキテクトの第一歩を踏み出したと言えるでしょう。
また何か不明点があれば、いつでも聞いてくださいね。一緒にメインフレームの世界を楽しみましょう!
