こんにちは!メインフレームの世界へようこそ。
COBOLやJavaから来た方にとって、PL/Iは少し「独特なクセ」があるように見えるかもしれません。でも安心してください。PL/Iは「科学技術計算も事務処理も、一つの言語で全部こなしてやろう!」という非常に欲張りでパワフルな言語です。
今日は、そんなPL/Iの門を叩いた皆さんが最初に躓きやすい、しかし最も重要な「ポインタとNULL」について、現場の知恵を交えて紐解いていきましょう。
—
1. PL/Iの基本の「き」:PROCEDUREとOPTIONS(MAIN)
まずは、プログラムの入り口のお話です。PL/Iでは、プログラムの開始地点を明確にするために、`PROCEDURE`というキーワードを使います。
1
MY_PROG: PROC OPTIONS(MAIN);
/ ここに処理を書きます /
PUT SKIP LIST(‘Hello, Mainframe!’);
END MY_PROG;
Javaの`public static void main`に相当するのが、この`OPTIONS(MAIN)`です。`PROC`の前の`MY_PROG:`はラベル名。メインフレームでは、このラベルが実行時のエントリーポイントとして非常に重要になります。ここまでは、なんとなくイメージできますよね?
—
2. 「ポインタ」って、何者?
さて、本題の「ポインタ」です。
COBOLにはない概念なので、ここで戸惑う方が多いのですが、難しく考える必要はありません。ポインタとは、「データの住所が書かれたメモ」だと思ってください。
データそのものが入っているのではなく、「そのデータはメモリアドレスの〇〇番地にありますよ」という情報だけを持っているんです。
なぜNULLで初期化するの?
もしあなたが、誰の住所も書かれていないメモ帳を渡されたらどうしますか?とりあえず「何も書いていない(NULL)」状態にしておかないと、適当なアドレスを指してしまい、プログラムが暴走(いわゆるS0C4アベンドというやつです)を引き起こしてしまいます。
そこで登場するのが `NULL()` ビルトイン関数です。
1
DCL P PTR; / ポインタ変数 P を宣言 /
P = NULL(); / 「どこも指していない」という安全な状態にする /
`NULL()` を代入しておくことで、「このポインタはまだ有効な場所を指していませんよ」という意思表示になります。これを怠ると、ゴミのようなアドレスを指したまま処理が進み、夜間バッチで突然エラーが起きて叩き起こされる…なんて悲劇が待っています。
—
3. 実践:NULLチェックの作法
プログラムの中でポインタを使う際は、必ず「そのポインタは本当に有効な場所を指しているか?」を確認する癖をつけましょう。
以下は、実務でよく見かける安全な書き方の例です。
1
DCL P PTR; / ポインタの宣言 /
P = NULL(); / まずはNULLで初期化(鉄則!) /
/ … 何らかのロジックでPにアドレスが代入される … /
/ ポインタがNULLかどうかを確認してからアクセスする /
IF P ^= NULL() THEN DO;
/ Pが有効なアドレスを指している時だけ実行する安全地帯 /
PUT SKIP LIST(‘データにアクセス成功!’);
END;
ELSE DO;
/ ポインタがNULLだった場合の例外処理 /
PUT SKIP LIST(‘警告:ポインタがNULLです’);
END;
ここで注目してほしいのは `^=` という演算子です。これは「等しくない(Not Equal)」を意味します。PL/Iでは、キーボードの記号を組み合わせてこうした比較を行います。最初は不思議に見えるかもしれませんが、慣れるとこの直感的な書き方が心地よくなってくるはずです。
—
4. 現場のアーキテクトからのアドバイス
PL/Iでの開発において、最も怖いのは「ポインタの放置」です。
- 宣言したポインタは必ずNULLで初期化する
- 使う直前には必ず `IF P ^= NULL()` でガードする
この2つを徹底するだけで、メインフレームの安定性は劇的に向上します。Javaの `null` チェックと同じような感覚ですが、PL/Iではハードウェアのメモリ領域に直接触れているという「重み」が少しだけ違います。
「PL/Iは古いから難しい」なんて言う人もいますが、実際はとても論理的で、書いた通りに動いてくれる誠実な言語です。怖がらずに、まずは `NULL()` を使ってポインタを安全に扱うところから始めてみてください。
もし、どうしても解決できないエラーや、「この書き方はベストプラクティスなのか?」と悩むことがあれば、またいつでも聞きに来てくださいね。皆さんのメインフレームライフを応援しています!
