PL/Iの「NULL」は怖くない!ポインタと仲良くなるための基礎講座
こんにちは!メインフレームの世界へようこそ。
これまでJavaで`null`と戦ってきた方や、COBOLの固定長の世界で暮らしてきた方にとって、PL/Iのポインタと`NULL`関数は、最初少しだけ「異世界」のように感じるかもしれません。
でも、安心してください。PL/Iのポインタは、メモリという名の広大な地図の上で「どこを指しているか」を管理するだけの、とても正直なツールなんです。今日は、この「NULL」という安全装置について、現場の知見を交えて紐解いていきましょう。
—
そもそも「ポインタ」って何?
PL/Iにおいてポインタ(`POINTER`属性)は、変数の値そのものではなく、「そのデータがメモリ上のどこに置かれているか」という住所を保持するものです。
Javaの参照型に慣れていると「メモリ管理はVMがやってくれるもの」という感覚があるかもしれませんが、PL/Iの世界では、住所を自分で管理する責任があります。ここで、住所が空っぽだったり、デタラメな場所を指していたりすると、伝説の`S0C4`(保護違反)というエラーが発生し、深夜の運用担当者が飛び起きることになります。
そんな惨事を防ぐために、「今はどこも指していないよ」と明示するのが`NULL`の役割なんです。
—
NULLビルトイン関数と初期化の鉄則
PL/Iのコードを書く際、ポインタを宣言しただけでは、その中身は「不定(何が入っているかわからない)」という非常に危険な状態になります。
コード例:安全なポインタの作法
/i
/ プログラムの入り口は OPTIONS(MAIN) で宣言します /
MY_PROGRAM: PROCEDURE OPTIONS(MAIN);
/ ポインタ変数の宣言 /
DCL P_CUSTOMER_DATA POINTER;
/ 1. 必ずNULLで初期化する癖をつけましょう /
P_CUSTOMER_DATA = NULL();
/ 2. まだ有効なアドレスを持っていないことを判定する /
IF P_CUSTOMER_DATA = NULL() THEN DO;
PUT SKIP LIST(‘まだデータはロードされていません。初期化を続行します。’);
END;
/ 3. 本来ならここでALLOCATEなどでメモリを確保し、アドレスを代入します /
/ 確保する前のポインタを不用意に使うと異常終了します /
END MY_PROGRAM;
なぜNULLを使うのか?
ポインタを宣言した直後は、メモリ上にゴミデータが入っていることがあります。もし初期化せずにそのポインタを使って「その住所にあるデータを取ってこい!」と命令したらどうなるでしょう?
コンピュータは一生懸命、ゴミデータが示す「存在しない地獄の住所」へアクセスしようとして、力尽きて倒れてしまいます(これがシステム異常終了の正体です)。`NULL()`を代入しておくことは、「ここにはまだ何もないから、アクセスしちゃダメだよ」という通行止め看板を立てる行為なんですね。
—
現場で役立つ「NULL」の勘所
1. 「NULL=0」ではない
他の言語ではNULLを0として扱うこともありますが、PL/Iのポインタにおける`NULL()`は、あくまで「無効なアドレス」を指す専用の関数です。`NULL()`と比較することで、プログラムの安全性を格段に高めることができます。
2. メモリ解放後の「後始末」
メインフレームのバッチ処理では、動的にメモリを確保(`ALLOCATE`)して使い、終わったら解放(`FREE`)することがよくあります。
/i
FREE CUSTOMER_STRUCT; / メモリを解放 /
P_CUSTOMER_DATA = NULL(); / 解放した後も重要! /
解放した直後に`NULL()`を代入しておくことで、誤ってそのポインタを再利用しようとした時に、すぐにエラーを検知できるようになります。これを「ぶら下がりポインタ」の防止策と呼び、現場では非常に重要視されています。
—
最後に:怖がらずに、一歩ずつ
PL/Iは古くからある言語ですが、その仕様は現代の言語にも通じる「メモリ管理の哲学」に満ちています。
- ポインタは住所。
- `NULL()`は「通行止め」の看板。
- 宣言したら必ず初期化する。
この3つさえ守れば、PL/Iのポインタはあなたの強力な味方になってくれます。もしコンパイルでエラーが出ても、あるいは実行時に`S0C4`で泣きそうになっても、それは「ポインタがどこを指しているか」を落ち着いて確認すれば必ず解決できます。
メインフレームの基幹システムを支えるコードを書くのは、とても誇らしい仕事です。これからも、一つずつ一緒に紐解いていきましょうね!
—
執筆後記:昔、ポインタの初期化を忘れて本番機を止めた若手時代の自分に、このブログを読ませてあげたい……と心から思います。皆さんはぜひ、安全なコードで素敵なエンジニアライフを!
