【入門編】PICTURE編集文字 ‘9’ と ‘Z’ のゼロ抑制(Zero Suppression) – PL/Iの基本構文とデータ制御実践ガイド

こんにちは!IBMメインフレームの世界へようこそ。システムアーキテクトの私です。

JavaやCOBOLといった他のモダンな言語、あるいはビジネス言語をバリバリ経験されてきた方にとって、初めて見るPL/I(ピーエルワン)のソースコードは、ちょっと独特で「うわっ、なんだこれ……」と身構えてしまうかもしれませんよね。

でも、安心してください。怖がる必要は全くありません。歴史あるメインフレームの言語であっても、一つひとつの仕様を紐解いていけば、当時のエンジニアたちが「どうすればコンピュータのメモリを節約し、美しい帳票を出力できるか」を突き詰めた、非常に合理的で愛嬌のある仕組みであることが分かります。

今回は、そんなPL/Iの数ある特徴の中から、PICTURE編集文字による「ゼロ抑制(Zero Suppression)」をテーマに、メモリの裏側まで優しく紐解いていきたいと思います。JavaやCOBOLの感覚とはちょっと違う、PL/Iならではの世界へ一緒に入っていきましょう!

—

1. 帳票印刷でよくある「あの悩み」とPL/Iの出会い

例えば、システムで計算した金額や数量を画面や帳票に出力するときのことを想像してみてください。
データベースや内部の変数では、データは決まった桁数(例えば5桁)で保持されています。何も考えずにそのまま出力すると、こんな風になってしまいますよね。

  • `00123円`
  • `00005円`

なんだか、頭に並んだ「0(ゼロ)」がやぼったく見えてしまいませんか? 金額の大きさがパッと直感的に伝わりにくいですよね。
「この無駄な先行ゼロを消して、スッキリ見やすく空白(スペース)に置き換えたい!」

他の言語、例えばCOBOLであれば `PIC ZZZ99` や `PIC Z(5)` のような編集句を使います。Javaなら `DecimalFormat` クラスを使ったりしますよね。
実は、PL/Iにも全く同じアプローチがあります。それが今回主役となる PICTURE句の ‘9’ と ‘Z’ です。

—

2. ‘9’ と ‘Z’ の役割分担:ゼロ抑制のメカニズム

PL/Iで数値を画面や帳票用に飾り付けて(編集して)出力したいとき、私たちは変数に `PICTURE(ピクチャ)属性` というものを持たせます。

ここで登場するのが、おなじみの文字たちです。

  • `9`:数字の桁位置を表します。ゼロ抑制は行いません(ゼロもそのまま表示します)。
  • `Z`:数字の桁位置を表します。もしその位置の値が「先行ゼロ(意味のないゼロ)」であれば、空白(スペース)に変換(抑制)します。

百聞は一見にしかず。実際のPL/Iコード片を見てみましょう。

DCL 変換前データ PIC ‘9(5)’ INIT(00123); / 内部的には 00123 という数値 /
DCL 編集後帳票用 PIC ‘ZZZZ9’; / ゼロ抑制を行うピクチャ定義 /

/ 実際に値を代入して編集してみます /
編集後帳票用 = 変換前データ;

このコードを実行すると、`編集後帳票用` の中身はどうなるでしょうか?
答えは、`” 123″`(最初の2文字がスペース、後ろに `123`)になります!

ここがポイント!

  • 一番左の `Z` に対応する `0` は、先行ゼロなので空白になります。
  • 次の `Z` に対応する `0` も、先行ゼロなので空白になります。
  • 3番目の `Z` にたどり着いたとき、値は `1` です。ここから「有効な数字」が始まったとみなされるため、以降の `Z` や `9` は、たとえ `0` が来ても空白にはならず、そのまま数字として表示されます。
  • 最後の `9` は、仮に値が `0` であっても絶対に空白にしたくない(「0円」とは表示させたい、等)場合の命綱として、一番右側に置かれることが多いお馴染みの文字です。

—

3. ちょっと待って!「メモリ消費」に関する重大な罠

ここで、JavaやCOBOLの感覚のままだと「思いっきりハマる」ポイントがあります。メインフレームのアーキテクトとして、一番お伝えしたかったのがここです。

「えっ、`PIC ‘ZZZZ9’` って、5文字分のスペースを食うの? じゃあメモリの無駄遣いなんじゃ……?」

いいえ、ここがPL/Iの非常にユニークで強力なところです。
実は、PL/Iにおいて `PICTURE` 編集文字を持つデータは、基本的に「文字(文字ストリング)」として扱われます。

内部データ型(計算用)と外部データ型(編集用)のちがい

PL/Iの基本を少しだけ振り返ると、内部で計算を行うための数値データは `FIXED BINARY`(固定小数点2進数)や `FIXED DECIMAL`(パック10進数 / COMP-3のようなもの)といった、いわゆる「演算用データ属性」を持ちます。

これに対して、今回のような `PIC ‘ZZZZ9’` は 「文字(CHARACTER)データ」の仲間 です。
つまり、
1. 計算用の純粋な数値変数(例: `DCL WK_AMT FIXED DEC(5) …`)で計算を行い、
2. 画面やファイルに出力する直前に、編集用変数(`PIC ‘ZZZZ9’`)に代入して文字に変換する、

というワンクッションのステップを踏むのが、メインフレームにおける王道の作法なのです。

もし、すべての変数を最初から `PIC` 編集つきで定義してしまうと、コンパイラはそれを「文字」として扱ってしまい、四則演算のたびに内部で文字と数値の変換が発生してパフォーマンスがガタ落ちします。さらに、メモリ上でも無駄にバイトを消費することになります。

「計算は計算用変数でスマートに、出力は `Z` や `9` を使ったピクチャ変数でおめかしして」
これが、レガシーシステムを軽快に動かすためのプロの知恵なんです。

—

4. 実務で使える!PL/Iコード実践サンプル

それでは、ここまでのお話をまとめた実用的なPL/Iのサンプルプログラムを見てみましょう。
バッチプログラムの中で、売上金額を綺麗に整えてログやファイルに出力するシーンを想定しています。

————————————————————–

  • プログラム名: ZEROSUPP
  • 概要 : PICTURE ‘Z’ と ‘9’ を使ったゼロ抑制のサンプル

————————————————————–
ZEROSUPP: PROC OPTIONS(MAIN);

— 1. 宣言部 ———————————————-
/ 計算用の純粋な数値変数(パック10進数:5桁) /
DCL W_SALES_AMT FIXED DECIMAL(5,0) STATIC INIT(123);

/ 編集用の文字変数(ゼロ抑制を行うピクチャ) /
DCL P_PRINT_AMT PICTURE ‘ZZZZ9’ STATIC;

/ 結果確認用の文字バッファ /
DCL W_MSG CHAR(30) STATIC;

— 2. 処理部 ———————————————-
PUT SKIP LIST (‘— ゼロ抑制(Zero Suppression)のテスト開始 —‘);

  • パターンA: 123 という値の場合

W_SALES_AMT = 123;
P_PRINT_AMT = W_SALES_AMT; / 数値からピクチャ変数へ代入(自動編集) /

W_MSG = ‘結果A: [‘ || P_PRINT_AMT || ‘]’;
PUT SKIP LIST (W_MSG);
/ 出力イメージ: 結果A: [ 123] (左側に2つスペースが入ります) /

  • パターンB: 5 という小さな値の場合

W_SALES_AMT = 5;
P_PRINT_AMT = W_SALES_AMT;

W_MSG = ‘結果B: [‘ || P_PRINT_AMT || ‘]’;
PUT SKIP LIST (W_MSG);
/ 出力イメージ: 結果B: [ 5] (左側に4つスペースが入ります) /

  • パターンC: すべてゼロ(0)の場合

W_SALES_AMT = 0;
P_PRINT_AMT = W_SALES_AMT;

W_MSG = ‘結果C: [‘ || P_PRINT_AMT || ‘]’;
PUT SKIP LIST (W_MSG);
/ 出力イメージ: 結果C: [ 0] (一番右の ‘9’ があるため、完全な空白にはならず ‘0’ が残ります) /

PUT SKIP LIST (‘— テスト終了 —‘);

END ZEROSUPP;

どうでしょうか? コードの流れそのものは、他の言語を経験されている方であれば直感的に理解できるはずです。「あ、代入するだけで勝手にいい感じの見た目にしてくれるんだな」と雰囲気が掴めたのではないでしょうか。

—

5. おわりに:レガシーの仕様は、当時のエンジニアからの「優しさ」

PL/Iの `PICTURE` 編集文字、特に今回ご紹介した `9` と `Z` によるゼロ抑制は、何十年も前のメインフレーム全盛期から、帳票の美しさや視認性を守り続けてきた由緒正しい仕組みです。

最初は「なんだこの独特な記号は……」と戸惑うかもしれませんが、背景にある「限られたメモリとリソースの中で、いかに人間にとって見やすい情報をスピーディに出力するか」という先人たちの工夫を知ると、少しだけPL/Iという言語が愛おしく感じられてきませんか?

怖がる必要は全くありません。基幹システムの改修や移行作業でこの記述に出会ったら、「おっ、ここで綺麗に帳票を整えてくれているんだな」と、ぜひ心の中でニヤリとしながら読み解いてみてくださいね。

あなたのメインフレーム・ライフ、そしてPL/Iの学習が実り多きものになるよう、これからもアーキテクトの視点から応援しています!

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