こんにちは。メインフレームの世界へようこそ。
COBOLやJavaで育った方にとって、PL/Iという言語は少し「古めかしく、かつ奇妙な魔法」のように見えるかもしれません。特に、メモリを自分で管理する「CONTROLLEDストレージ」という概念に出会うと、「えっ、今どき手動でメモリ確保?」と身構えてしまう方も多いでしょう。
でも、安心してください。実はこれ、現代のプログラミングでいうところの「スタック操作」や「世代管理」を、もっと直感的に、そして強力に行うための古の知恵なんです。今回は、PL/Iの真骨頂である「CONTROLLED(制御)ストレージ」について、紐解いていきましょう。
—
1. PL/Iの基本のキ:PROCEDUREとメインプログラム
まず、PL/Iのプログラムは`PROCEDURE`という単位で構成されます。Javaでいうクラスやメソッド、COBOLでいうプログラムそのものですね。
/i
MYPROG: PROCEDURE OPTIONS(MAIN);
/ ここがプログラムの入り口です /
PUT SKIP LIST(‘Hello, Mainframe!’);
END MYPROG;
`OPTIONS(MAIN)`は、OSに対して「ここから処理を開始してください」と伝えるための合言葉。これがあることで、OSのジョブ制御から呼び出せるようになります。シンプルですよね。
—
2. 「CONTROLLEDストレージ」って結局なに?
さて、本題です。通常、変数を宣言するとメモリ上のどこかに領域が確保されますが、`CONTROLLED`属性をつけると、「必要な時に自分でメモリを確保し、不要になったら自分で解放する」という特権が与えられます。
これの何が嬉しいのか? 一言で言えば「世代管理(スタック制御)」です。
世代管理のイメージ
例えば、同じ名前の変数 `MY_DATA` を使いながら、過去の値を消さずに新しい値をその上に「積み上げる(PUSH)」ことができるんです。まるで本棚に本を重ねていくような感覚です。
/i
/ CONTROLLED属性をつけた変数の宣言 /
DCL MY_DATA CHAR(10) CONTROLLED;
/ 1つ目の世代を作成 /
ALLOCATE MY_DATA;
MY_DATA = ‘FIRST’;
/ 2つ目の世代を作成(元の値は隠れるが、消えずに残る) /
ALLOCATE MY_DATA;
MY_DATA = ‘SECOND’;
/ この状態でMY_DATAを参照すると、一番上の’SECOND’が見える /
PUT SKIP LIST(MY_DATA);
/ 解放すると、1つ下の’FIRST’が再び現れる /
FREE MY_DATA;
PUT SKIP LIST(MY_DATA);
なぜこんなことが必要なの?
基幹システムのバッチ処理では、「複雑な計算の中間結果をスタックのように積んでおき、エラーが起きたら一段戻る」といった処理が求められることがあります。`CONTROLLED`を使えば、メモリ領域をわざわざ配列で管理してインデックスを操作するような面倒なことをせずとも、PL/Iがスタック管理を自動でやってくれるのです。
—
3. 実務で役立つ「スタック制御」のコツ
実務の現場では、この機能は「再帰呼び出し」や「動的なデータ構造」を扱う際によく遭遇します。特に、データ量や深さが実行時にしか分からないような業務要件において、`CONTROLLED`は非常に強力な武器になります。
注意点:FREEを忘れない!
`ALLOCATE`したら必ず`FREE`する。これはC言語の `malloc/free` と同じ鉄則です。もし`FREE`を忘れると、メモリリーク(領域の食いつぶし)が発生し、メインフレームといえど「ストレージ不足」で異常終了してしまいます。
現場のデバッグでは、`ALLOCATION`状態を調べるために `ALLOCATION(MY_DATA)` という組み込み関数をよく使います。
/i
IF ALLOCATION(MY_DATA) > 0 THEN DO;
/ 確保されている世代数をチェック /
PUT SKIP LIST(‘現在のスタック深さ:’ || ALLOCATION(MY_DATA));
END;
—
最後に:怖がる必要はありません
PL/Iの`CONTROLLED`属性は、一見すると「低レイヤーの制御」のように見えますが、使いこなせれば、メモリ管理の苦労を言語側に肩代わりさせられる非常に便利なツールです。
「世代が重なる」という概念は、最初こそ戸惑うかもしれませんが、「古い情報をわざわざ書き換えず、新しい層を乗せる」というイメージさえ持てれば、これほどスマートな管理手法はありません。
もし現場のコードで `CONTROLLED` や `ALLOCATE` を見つけたら、「これは先人がメモリを効率よく使い、かつ安全にスタック管理をしようとした知恵なんだな」と、温かい目で見てあげてください。
これからも、メインフレームの深淵を一緒に探求していきましょう。何か具体的なエラーコードや、難解なソースコードで困ったことがあれば、いつでも相談してくださいね。
