【入門編】POINTER型とADDRビルトイン関数による動的メモリ操作 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの世界へようこそ!ポインタと動的メモリ確保の「魔法」を紐解く

こんにちは!メインフレームの世界へようこそ。JavaやCOBOLの経験がある方にとって、PL/Iは少し不思議で、時に「何でもあり」に見える言語かもしれませんね。

「PL/Iには予約語がない」という話を聞いて驚いたことはありませんか?実は、PL/Iにおいて`IF`や`THEN`といったキーワードは、あくまで「文脈上の優先順位」が高いだけで、変数名として使おうと思えば使えてしまいます。コンパイラが「文脈」を読んで判断してくれるからこそできる芸当なのですが、これは初心者泣かせでもあります。

今回は、そんなPL/Iの懐の深さを象徴する機能の一つ、「ポインタ(POINTER)」と「Based変数」による動的メモリ操作についてお話しします。

「Based変数」を「入居者」としてイメージしてみる

Javaのようにオブジェクトを`new`する感覚とは少し違います。PL/Iの動的メモリ操作を理解するコツは、「メモリ上の場所(住所)」と「そこにあるデータ構造(型)」を切り離して考えることです。

まず、Based変数を理解しましょう。これは、「どこにあるか分からないけれど、誰かが教えてくれれば、そこにデータ構造を当てはめて読み書きするよ」という「型枠」のような存在です。

例えるなら、「Based変数は『間取り図(定義)』であり、ポインタは『その部屋の鍵(住所)』」です。

実践:動的にメモリを確保して構造体を操作する

では、実際にコードを見てみましょう。ここでは、トランザクションのログを動的に確保するようなイメージで書いてみます。

1
/ 構造体テンプレート:Based属性を付けることで「実体を持たない型枠」になる /
DCL 1 LOG_RECORD BASED(P_LOG),
2 TRAN_ID CHAR(4), / トランザクションID /
2 AMOUNT FIXED BIN(31); / 金額 /

DCL P_LOG POINTER; / ポインタ変数(住所を保持する) /

/ 1. ストレージの確保(ALLOCATE文) /
/ P_LOGという「鍵」を使って、メモリを確保し、その住所をP_LOGに入れる /
ALLOCATE LOG_RECORD;

/ 2. 値の代入 /
/ P_LOGが指し示す場所を、LOG_RECORDという「型枠」を通して操作する /
P_LOG->TRAN_ID = ‘A001’;
P_LOG->AMOUNT = 5000;

/ 3. 別の場所を指すことも可能(ADDRビルトイン関数) /
/ 例えば、既存のワークエリアの先頭アドレスをポインタに代入する場合 /
/ P_LOG = ADDR(WORK_AREA); /

/ 4. 使い終わったら必ず解放(FREE文) /
/ メモリリークはメインフレームでも厳禁です /
FREE LOG_RECORD;

ここがポイント!初学者がハマりやすい罠

1. 矢印「->」の役割

`P_LOG->TRAN_ID` の `->` は、「ポインタが指し示す先のデータを、この構造体として解釈せよ」という指示です。これがないと、プログラムは「どこのメモリを書き換えればいいの?」と迷子になってしまいます。

2. ADDRビルトイン関数の凄み

`ADDR`関数は、変数の「メモリ上の物理的な番地」を教えてくれます。Javaではメモリのアドレスを直接扱うことはほぼありませんが、PL/Iでは「この領域を別の型として再定義したい」といった際に、この住所をポインタに渡すことで、強引かつ柔軟なデータ変換が可能になります。これが、古い基幹システムのデータ変換ロジックで重宝される理由です。

3. 「Based」の正体

`DCL VAR BASED(P)` と宣言した時点で、その変数`VAR`は静的なメモリ領域を占有しません。`P`に有効なアドレスが入っていない状態で`VAR`にアクセスすると、システムは「アドレス0(NULL)」周辺を叩こうとして、容赦なくABEND(異常終了)という名の洗礼を与えてきます。これは怖がらず、「住所(ポインタ)をセットしてからアクセスする」という鉄則を守れば大丈夫です。

最後に:PL/Iのポインタは「信頼」の上に成り立つ

Javaの参照型と違い、PL/Iのポインタは「その住所に何があるか」をコンパイラに教え込むことで機能します。これは非常に強力な反面、プログラマの責任も重くなります。

しかし、この「型」と「場所」を分離して考える柔軟性は、何十年も前の膨大なデータを、現代のシステムにマッピングし直すような移行現場では、まさに魔法のような威力を発揮します。

「予約語がない」という自由さの中で、ポインタという「強力な武器」を使いこなすPL/I。最初は少し勇気がいるかもしれませんが、一度コツを掴めば、これほどエンジニアの意図を汲み取ってくれる言語も珍しいですよ。

また次回、さらにディープなPL/Iの世界でお会いしましょう。何か不明な点があれば、いつでも遠慮なく聞いてくださいね。一緒に紐解いていきましょう!

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