【入門編】CONTROLLED属性による明示的なメモリ管理 – PL/Iの基本構文とデータ制御実践ガイド

【PL/I入門】メモリを「自分の手」で操る!CONTROLLED属性による動的メモリ管理の極意

こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLの世界からやってきた皆さんにとって、PL/Iのコードを初めて見たときの感想は「何だか不思議な記号が多いな……」といったところかもしれませんね。でも、安心してください。PL/Iは実は非常に論理的で、プログラマの意図をダイレクトにハードウェアへ伝えることができる、非常に「頼りになる」言語なんです。

今日は、そんなPL/Iの強力な武器の一つ、「CONTROLLED属性」を使ったメモリ管理について、肩の力を抜いて一緒に見ていきましょう。

メモリ管理の「自動」と「手動」の違い

Javaを使っていると、メモリの確保や解放はGC(ガベージコレクション)が勝手にやってくれますよね。COBOLの場合は、`WORKING-STORAGE`で宣言した領域がプログラムの開始から終了までずっと生き残る「静的」なスタイルが主流です。

しかし、PL/Iの`CONTROLLED`属性は違います。「必要なときに、必要な分だけ確保し、不要になったら自分で捨てる」。まるで自分の机の上を自分で整理整頓するような、プログラマによる明示的なメモリ管理ができるのです。

CONTROLLED属性の基本:3つの魔法のキーワード

このメモリ管理には、以下の3つのキーワードが登場します。

1. `DECLARE … CONTROLLED`: 「この変数は自分で管理するよ!」という宣言。
2. `ALLOCATE`: 「メモリを確保して!」と命令する。
3. `FREE`: 「もう使わないから捨てていいよ!」と命令する。

これだけです。簡単ですよね?

実践コード:実際にメモリを確保してみよう

では、百聞は一見に如かず。実際にリスト構造のようなデータを扱う場面を想定して、コードを見てみましょう。

1
/ プログラムのメイン構造 /
DYNAMIC_DEMO: PROCEDURE OPTIONS(MAIN);

/ 1. CONTROLLED属性で変数を宣言(まだメモリは確保されていない) /
DECLARE MY_BUFFER CHARACTER(100) CONTROLLED;

/ 2. メモリを動的に確保 /
ALLOCATE MY_BUFFER;

/ これでようやく、MY_BUFFERがメモリ上に誕生しました! /
MY_BUFFER = ‘Hello, Mainframe World!’;
PUT SKIP LIST(‘確保した内容: ‘ || MY_BUFFER);

/ 3. 使い終わったら解放してメモリを掃除 /
FREE MY_BUFFER;

/ さらにもう一度確保することも可能 /
ALLOCATE MY_BUFFER;
MY_BUFFER = ‘二回目の確保です。’;
PUT SKIP LIST(‘確保した内容: ‘ || MY_BUFFER);
FREE MY_BUFFER;

END DYNAMIC_DEMO;

このコードのポイント

  • スタックのような振る舞い:実は`CONTROLLED`属性の変数は、同じ名前で何度も`ALLOCATE`すると、古いメモリが隠れて新しいメモリが上に乗る「スタック構造」になります。`FREE`すると一つ前の古いデータがひょっこり現れるんです。この仕様、最初は驚くかもしれませんが、慣れると非常に強力ですよ。
  • メモリリークに注意:`ALLOCATE`した数と`FREE`した数が合わないと、プログラムが終了するまでメモリを食いつぶし続けます。基幹システムのバッチ処理でこれをやると、「メモリ不足(S80A異常終了など)」の原因になるので、必ず「確保したら解放する」のペアを意識してくださいね。

なぜ今、CONTROLLED属性を使うのか?

「現代的な言語なら自動でいいじゃない」と思うかもしれません。しかし、メインフレームの世界では、「限られたメモリリソースを、いかに効率よく使い回すか」が性能の鍵を握ります。

数万件のレコードを処理する際、全員分の領域を静的に確保するとメモリが足りなくなりますが、`CONTROLLED`を使って「今処理している1件分だけ」を確保し、終わったらすぐ捨てる。このサイクルを繰り返すことで、巨大なデータも安全に処理できるのです。

最後に:怖がらなくて大丈夫です

PL/Iのメモリ管理は、一見すると「低レイヤーすぎて難しい」と感じるかもしれません。しかし、これは「コンピュータに直接指示を出している」という、エンジニアとしての醍醐味そのものです。

もしエラーが出ても、それは「メモリの使い方が間違っているよ」と、システムが優しく(時には厳しく)教えてくれているだけです。一つずつ、`ALLOCATE`と`FREE`を丁寧に書いていけば、必ず意のままに操れるようになりますよ。

次回の記事では、`CONTROLLED`属性の裏技とも言える「ポインタ」との組み合わせ方について解説しますね。またお会いしましょう!

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