【入門編】POINTER型変数とADDRビルトイン関数の内部表現 – PL/Iの基本構文とデータ制御実践ガイド

「ポインタって何?」から始めるPL/I:アドレスの迷宮を攻略するガイド

皆さん、こんにちは。メインフレームの世界へようこそ。

普段JavaやCOBOLを触っている皆さんにとって、PL/Iのコードを初めて見た時の「何この記号の羅列?」という感覚、よくわかります。特に「ポインタ」という概念は、他のモダンな言語では隠蔽されていることが多いので、急に突きつけられると腰が引けてしまいますよね。

でも、安心してください。PL/Iのポインタは、実は「データの住所録」のような、非常にシンプルで直感的なものなんです。今日は、IBMメインフレームの心臓部で働くPL/Iの「ポインタ」と「ADDR関数」について、優しく紐解いていきましょう。

そもそも、PL/Iのポインタは何を指しているの?

Javaのような言語では、オブジェクトの参照はランタイムが管理してくれますよね。しかし、PL/Iの世界では、私たちはもっと「メモリの番地」という物理的な場所に近いところで仕事をします。

PL/Iにおける`POINTER`型変数は、「メモリ上のどこにデータがあるかを示す番地(アドレス)」を保持するための入れ物です。

31ビットと64ビットの「住所の長さ」

メインフレームの歴史を知る上で欠かせないのが「アドレッシングモード」です。

  • 31ビット(従来の主流): 約2GBのメモリ範囲を指せます。ポインタのサイズは4バイトです。
  • 64ビット(現代の主流): 膨大なメモリ空間を指せます。ポインタのサイズは8バイトです。

「なぜそんなことを気にするの?」と思うかもしれませんが、古いプログラムを改修する際、この「4バイトだと思っていたら8バイトだった!」というズレが、メモリ破壊という恐ろしいバグを招くことがあります。まずは「ポインタは住所を覚えるための特殊な変数だ」とイメージしてください。

ADDR関数:データの「住所」を覗き見る魔法

`ADDR`(アドレス)ビルトイン関数は、ある変数が「メモリ上のどこに座っているか」を即座に教えてくれる魔法の道具です。

例えば、`A`という変数があったとき、`ADDR(A)`と書けば、その瞬間に`A`が眠っているメモリの番地が返ってきます。これをポインタ変数に代入することで、後からその番地を辿ってデータにアクセスできるわけです。

実際にコードで見てみよう

百聞は一見に如かず。PL/Iの基本構造である`PROCEDURE`の中で、ポインタをどのように扱うか見てみましょう。

1
EXAMPLE: PROCEDURE OPTIONS(MAIN);

/ 文字列データを定義 /
DCL MY_DATA CHAR(10) INIT(‘PL/I_WORLD’);

/ ポインタ変数を定義。これが「住所録」になります /
DCL PTR_TO_DATA POINTER;

/ BASED属性を使って、「このポインタが指す先のデータ構造」を定義 /
/ これがPL/Iのポインタ操作のキモです /
DCL DATA_MAP CHAR(10) BASED(PTR_TO_DATA);

/ 1. ADDR関数でMY_DATAの住所を取得し、ポインタに代入 /
PTR_TO_DATA = ADDR(MY_DATA);

/ 2. ポインタ経由でデータを参照(間接参照) /
/ DATA_MAPの中身は、ポインタが指しているMY_DATAと同じになる /
PUT SKIP LIST(‘ポインタが指す先の内容は: ‘ || DATA_MAP);

END EXAMPLE;

このコードのポイント

1. BASED属性: これが初学者が一番戸惑うポイントかもしれません。`BASED(PTR_TO_DATA)`と書くことで、「この変数は特定の場所にあるわけではなく、PTR_TO_DATAが指す場所を自分の住所として振る舞うよ」という宣言になります。
2. 間接参照: ポインタに住所を入れた後、`DATA_MAP`に触れると、コンパイラは自動的に「ああ、このデータはポインタさんが持っている住所にあるやつね」と判断して値を読み書きしてくれます。

初学者の皆さんへ:怖がらなくて大丈夫です

PL/Iのポインタ操作は、一見すると「低レイヤーすぎて難しい」と感じるかもしれません。しかし、これは「コンピュータがメモリをどう扱っているか」を理解する最高の近道です。

  • 「ポインタ」は、メモリの住所を書くための手帳。
  • 「ADDR関数」は、手帳に住所を書き込むためのペン。
  • 「BASED属性」は、手帳に書かれた住所を家として扱うための設計図。

このように捉えれば、決して怖いものではありません。基幹システムの現場で「ポインタを使って効率的に巨大なデータを処理する」場面に出くわしたとき、この基礎知識がきっと皆さんの強力な武器になるはずです。

もし現場で「ポインタのオフセットがずれている!」なんてエラーに出会ったら、まずは深呼吸して「今、このポインタは正しい住所を指しているかな?」と確認してみてください。それがトラブル解決への第一歩です。

それでは、また次回の記事でお会いしましょう。メインフレームでの開発を楽しんでくださいね!

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