PL/Iの「NULL」は二つの顔を持つ?―SYSNULLとNULLの使い分けを現場視点で解説
こんにちは!メインフレームの世界へようこそ。
Javaでバリバリ開発してきた方や、COBOLの堅実なロジックに慣れている方にとって、PL/I(ピーエルワン)という言語は、時折「魔法のような、それでいてちょっと気難しい隣人」のように感じられるかもしれません。
今日は、PL/Iのデータ制御における最初の難関、「NULL」と「SYSNULL」の違いについてお話しします。これ、実はCICSやDB2などのミドルウェアと連携する際に、システムがクラッシュするか正常に動くかを分ける「運命の分かれ道」なんです。
怖がる必要はありません。一つずつ紐解いていきましょう。
—
1. なぜ「NULL」が二つあるのか?
まずは結論から。PL/Iにおいて「何もないこと」を表現する手段は一つではありません。
- NULL: 言語仕様上の「論理的な空(ポインタの未設定)」
- SYSNULL: 内部的には「全ビットが0(または1)」という、機械語に近い「物理的な空」
「どちらも同じ『空っぽ』じゃないの?」と思いますよね。実は、これが罠なんです。
イメージで理解する「NULL」と「SYSNULL」
- NULL: 銀行の窓口で「今、担当者が席を外しています(状態としての空)」という看板。
- SYSNULL: 銀行の貸金庫を開けたら、中身が「物理的に何もない(ビット列として0)」という状態。
PL/Iのポインタ変数は、プログラム内で「どのメモリを指しているか」を管理します。`NULL`は、そのポインタが「まだ誰も指していない」ことを宣言するものですが、DB2やCICSのような、別のプログラム(別のOS機能)に値を渡すとき、相手側は「0番地」という特定のメモリ番地を「何もない」と解釈します。
ここでの食い違いが、思わぬABEND(異常終了)を引き起こす原因になるのです。
—
2. 実践的な書き分け:いつ、どちらを使うべきか?
現場での鉄則はシンプルです。
1. プログラム内だけで完結する比較(IF文など): `NULL` を使ってください。
2. DB2やCICS、外部APIとの連携: `SYSNULL` を使ってください。
特にDB2のインジケータ変数(NULL値を判定するための変数)には、必ず`SYSNULL`を使いましょう。
コードで見てみましょう
1
/ PL/Iの基本構造:メインプロシージャの例 /
SAMPLE_PROG: PROCEDURE OPTIONS(MAIN);
/ ポインタ変数の宣言 /
DCL P_DATA POINTER;
/ DB2連携のためのインジケータ変数(SHORTは2バイト整数) /
DCL DB2_IND_VAR BIN FIXED(15);
/ 1. プログラム内部での判定 /
/ 自分たちのコード内で使うなら、標準のNULLで十分です /
P_DATA = NULL();
IF P_DATA = NULL() THEN
PUT SKIP LIST(‘ポインタはどこも指していません’);
/ 2. DB2連携時の注意 /
/ DB2の世界ではNULLは「ゼロ」と約束されているため、SYSNULLを使います /
DB2_IND_VAR = SYSNULL();
/ ここで誤ってNULL()を代入すると、環境によっては予期せぬ値が入り、
DB2側で「そんなインジケータ値は許容しない!」と怒られることがあります /
RETURN;
END SAMPLE_PROG;
—
3. なぜ「SYSNULL」を使う必要があるのか?
ここがメインフレーム・エンジニアとしての「深掘りポイント」です。
昔のPL/I規格では、`NULL`の内部表現が必ずしも0番地であると定義されていませんでした。コンパイラのオプションやプラットフォームによっては、`NULL`が「0x00000000」以外の値になることもあったのです。
しかし、DB2やCICSの世界(IBMの共通基盤)では、「NULL=全ビットが0」というルールが鉄則です。
`SYSNULL`というキーワードは、その環境において「外部連携で『空』を意味する値」を確実に取得するための、いわば「変換アダプタ」のような存在なのです。
先輩からのアドバイス
「とりあえず`NULL`で動くからいいや」と開発していると、ある日、最適化オプションを変えた途端にポインタ判定でバグが出たり、DB2のマイグレーションで値の不整合が起きたりします。
- 「私的」な空には `NULL`
- 「公的(外部連携)」な空には `SYSNULL`
この住み分けを意識するだけで、あなたのコードの堅牢性は格段に上がります。「なんとなく」でコードを書くのは卒業して、なぜその値を使うのかを説明できるエンジニアを目指しましょう。
—
最後に
PL/Iは歴史が長く、仕様の隅々に「コンピュータの物理的な挙動」が隠れています。一見すると古臭いルールに見えるかもしれませんが、これらはすべて「いかにハードウェアと効率的に対話するか」を追求した先人たちの知恵なのです。
もし迷ったら、いつでもこの記事を見返してください。次はポインタの演算や、`BASED`変数についての深い話をしましょうか。
それでは、メインフレーム開発ライフを楽しんでくださいね!
