メインフレームの世界へようこそ。JavaやCOBOLという素晴らしい言語を知っている皆さんが、なぜか今、PL/Iという「古豪」の扉を叩こうとしている……その知的好奇心に、一人のアーキテクトとして心からの敬意を表します。
PL/Iは、1960年代に生まれた「何でもできる万能選手」です。一見すると古臭い構文に見えるかもしれませんが、実はメモリの深淵を覗き込む力においては、現代の高級言語よりもはるかに直感的で、そして容赦がない言語です。
今日は、そんなPL/Iの心臓部とも言える「ポインタ」と「ADDR関数」の秘密について、少しだけ紐解いてみましょう。
—
1. ポインタは「メモリの番地」という名の地図
Javaでオブジェクトを扱うとき、私たちは「参照」という言葉を使いますよね。PL/Iにおけるポインタも基本的には同じ「メモリ上の場所を指し示すもの」です。
しかし、PL/Iのポインタはもっと露骨です。「この変数がある場所は、メモリのここですよ」という純粋なメモリアドレスそのものを保持します。
/i
/ ポインタ変数の宣言 /
DCL P POINTER;
これだけで、`P`という変数は「誰かの住処(アドレス)」を覚える準備が整いました。
2. ADDR関数:住所を教えてくれる魔法の杖
ある変数がメモリのどこにあるのかを知りたいとき、`ADDR`ビルトイン関数を使います。これは、まさに「その変数の住所を教えて!」とシステムに問いかける関数です。
ここで初学者がつまずきやすいのが、「31ビットか、64ビットか」という問題です。
現代のメインフレーム(z/OS)では、メモリ空間を広く使うために64ビットアドレッシングが主流ですが、レガシーな資産では31ビットが混在しています。
- 31ビット: 昔ながらの「2GBまでの広大なメモリ」を管理する方式。
- 64ビット: さらに広大な宇宙を管理する方式。
実は、PL/Iのコンパイラは、コンパイルオプション(`ADDR64`など)によって、`ADDR`が返す値の大きさを自動的に調整してくれます。あまり難しく考えすぎず、「今はシステムが適切なサイズの住所を教えてくれているんだな」と捉えてください。
—
3. 「基底付き変数」でデータにアクセスする
ポインタを手に入れただけでは、中身(データ)は見えません。ここで「基底付き変数(Based Variable)」というPL/I特有の仕組みが登場します。
イメージしてください。「ポインタ」は住所が書かれたメモ、「基底付き変数」はその住所にある「家の中身」を定義した間取り図です。
/i
/ 基底付き変数の宣言:まだ場所は決まっていない「間取り図」 /
DCL MY_DATA CHAR(10) BASED(P);
/ PにADDR関数で住所を教える /
DCL TARGET CHAR(10) INIT(‘HELLO PL/I’);
P = ADDR(TARGET);
/ これでMY_DATAを通してTARGETの中身が見えるようになる /
PUT SKIP LIST(MY_DATA);
このコードでは、`MY_DATA`という変数は`P`というポインタを頼りに、「住所はどこ?あ、ここか。じゃあそこにある10バイトを読んでやるよ」と振る舞います。
なぜこんな面倒なことをするのか?
COBOLにはない、PL/Iの最大の強みは「動的なメモリ操作」です。例えば、読み込んだレコードのレイアウトが状況によって変わる場合、この「間取り図(基底付き変数)」をパズルのように付け替えるだけで、同じメモリ領域を全く別のデータ構造として解釈できるのです。これが、複雑な基幹システムを支えるPL/Iの真骨頂です。
—
4. 現場からのアドバイス:怖がらずにポインタと遊ぼう
「ポインタを間違えて、変な場所を指したらどうしよう……」という恐怖感があるかもしれません。確かにPL/Iは、メモリの保護をすり抜けて破壊的なこともできてしまう言語です。
ですが、現代のz/OS環境は非常に優秀です。もし不正なアドレスにアクセスしようとすれば、即座に「ABEND(異常終了)」という形でシステムが止めてくれます。これは、開発者をいじめているのではなく、「それ以上進むとシステム全体が壊れるから、ここで止めてあげるね」という親切な警告なのです。
まとめ
1. POINTER型はメモリの住所を保持する入れ物。
2. ADDR関数は、その変数が今どこにいるかを教えてくれる。
3. BASED変数は、その住所にあるデータをどう解釈するかを定義する間取り図。
最初は少し不思議な感覚かもしれませんが、この「メモリを直接操る感覚」が身につくと、JavaやCOBOLだけでは見えなかった「プログラムの裏側の景色」が見えてきます。
皆さんのメインフレーム移行プロジェクトが、少しでも楽しい探求の旅になりますように。また何か分からないことがあれば、いつでも聞いてくださいね。一緒に紐解いていきましょう!
