【実務・中級編】CHARACTER(n)とCHARACTER(n) VARYINGのメモリ構造 – PL/Iの基本構文とデータ制御実践ガイド

現場で泣きを見ないために:PL/IにおけるCHARACTER固定長とVARYINGの「境界線」

やあ。今日もレガシーシステムの荒波に揉まれている諸君、お疲れ様。
メインフレームの保守・改修において、最も「バグの温床」になりやすく、かつ「なぜか動いてしまう」ために放置されがちなのが、文字列のデータ型だ。特に`CHARACTER(n)`と`CHARACTER(n) VARYING`。この二つの内部構造の違いを理解せずに、安易に型変換や構造体のマッピングを行うと、後々、バッチ処理の異常終了や、VSAMファイルのレコード破壊という致命傷を負うことになる。

今日は、この「メモリの裏側」を深掘りして、プロとしての振る舞いを叩き込んでやろう。

1. メモリレイアウト:見えない「長さ」の正体

まず基本を叩き込むぞ。`CHARACTER(n)`と`CHARACTER(n) VARYING`では、メモリ上の占有領域が根本的に異なる。

  • `CHARACTER(n)` (固定長):

指定されたバイト数だけが、そこにある。余白はすべてスペース(X’40’)で埋まる。非常にシンプルで、予測可能だ。

  • `CHARACTER(n) VARYING` (可変長):

ここが罠だ。宣言したバイト数(n)に加え、先頭に「現在の有効長」を保持するための2バイトの長さフィールド(バイナリ)が付与される。つまり、実データより2バイト多くメモリを消費するんだ。

この「2バイトの長さ情報」を無視して構造体(STRUCTURE)を定義し、外部サブプログラムへ渡したり、バイナリ転送を行ったりするとどうなるか? 想像に難くないだろう。データが2バイト分ズレて、後続のフィールドが化ける。これが「なぜか値が読み込めない」という怪奇現象の正体だ。

2. 実践的なコーディング:バッチ処理における型意識

以下のコードを見てくれ。VSAMから読み込んだデータを加工し、別のファイルに書き出す際によくある光景だ。

1
/ —————————————————————— /
/ メイン処理構造の例 /
/ —————————————————————— /
SAMPLE_PROC: PROC OPTIONS(MAIN);

/ 固定長とVARYINGの対比 /
DCL FIX_NAME CHAR(20); / 固定長: 常に20バイト /
DCL VAR_NAME CHAR(20) VARYING; / 可変長: 2+20=22バイト確保 /

/ 内部データ処理の鉄則 /
VAR_NAME = ‘IBM_MAINFRAME’; / 現在の長さは13に設定される /

/ BUILTIN関数による安全な制御 /
IF LENGTH(VAR_NAME) > 0 THEN DO;
PUT SKIP LIST(‘有効長は:’ || LENGTH(VAR_NAME));
END;

/ VSAMやファイル転送時は「固定長」へキャストするのが定石 /
FIX_NAME = VAR_NAME; / VARYINGから固定長への代入は自動でスペース埋めされる /

/ 逆に固定長からVARYINGへ入れる際はTRIMで無駄な空白を削るのが礼儀 /
VAR_NAME = TRIM(FIX_NAME);

RETURN;
END SAMPLE_PROC;

3. トラブルを未然に防ぐための「現場の知恵」

実務で私が後輩に必ず教える「鉄則」を3つ授ける。

1. 外部I/OにはVARYINGを使うな
VSAMファイルや、他言語(COBOL等)とのインターフェースとなる構造体には、原則として`VARYING`は使うな。COBOL側は先頭2バイトの長さ情報など知らないから、データの一部が長さフィールドとして解釈され、システム全体が誤作動を起こす。外部連携はすべて`CHARACTER(n)`で統一するのが、平和を維持する秘訣だ。

2. ONユニットによる例外制御
文字列の長さがオーバーフローした際、デフォルトの`ONCODE`に任せるとバッチがアボート(異常終了)する。あらかじめ`ON CONDITION(SIZE)`などを適切に定義し、ログを吐いて安全にリターンするハンドリングを組み込んでおくべきだ。

3. SUBSTR関数の落とし穴
`SUBSTR(VAR_NAME, 1, 5)`のように`VARYING`に対して`SUBSTR`を適用すると、戻り値も`VARYING`として振る舞うことが多い。この戻り値を固定長エリアに代入する際、コンパイラの最適化やバージョンによって挙動が微妙に異なる場合がある。不安な時は`TRIM`や`STRIP`を噛ませ、型を明示的にキャストする癖をつけろ。

まとめ:道具を使いこなすということ

「なんとなく動くコード」を書くのは新人でもできる。だが、「メモリ構造を理解し、将来の改修やデータ移行を見据えたコード」を書くのが、我々アーキテクトの仕事だ。

`VARYING`は文字列の操作を直感的にしてくれる便利な道具だが、その裏には必ず「長さのコスト」がある。このコストと構造を意識するだけで、君のコードの信頼性は一段階上のレベルへ到達するはずだ。

次は、構造体のアライメント(境界調整)と、それによって生じるメモリの「穴」について話をしようか。また現場で会おう。健闘を祈る。

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