【入門編】SYSNULLビルトイン関数とNULLの差異 – PL/Iの基本構文とデータ制御実践ガイド

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`変数についての深い話をしましょうか。

それでは、メインフレーム開発ライフを楽しんでくださいね!

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