ようこそ、PL/Iの世界へ!「汎用機」という言葉に少し身構えてしまうかもしれませんが、大丈夫です。PL/Iは、その名の通り「Programming Language One」、つまり「これ一つですべてをこなせるように」という野心的な思想で作られた言語です。
今回は、メインフレームの現場で避けては通れない、でも最初は少しギョッとする「ピクチャ編集(PIC)」の世界を、一緒に紐解いていきましょう。
—
1. そもそも「予約語」がない? PL/Iの自由な世界
JavaやC言語の経験がある方は、「`IF`や`THEN`を変数名に使えない」という制約に慣れているはずです。しかし、PL/Iは驚くほど寛容です。
PL/Iには「予約語」という概念がありません。極端な話、`IF`という名前の変数を作ることも可能です(もちろん、コードが読みづらくなるので推奨はしませんが!)。コンパイラは文脈から「あ、これはキーワードだな」「これは変数名だな」と判断してくれます。
この「自由さ」は、時にバグを呼び込むこともありますが、メインフレームの歴史を支えてきた熟練のエンジニアたちは、この柔軟さを武器に複雑なビジネスロジックを書き上げてきました。
—
2. 数値を「顔」にする:ピクチャ編集の魔術
さて、今回の本題です。メインフレームでは、データベースに格納された生データ(数値)を、帳票や画面に出力する際、見やすく加工する必要があります。例えば、`00000123` というデータを ` 123` と表示させたい時、これを行うのがピクチャ(PIC)指定です。
Zと9の使い分け
- `9`: 「そこに数字があるはずだ」という枠です。ゼロであってもそのまま表示します。
- `Z`: 「もしここがゼロなら、空白にしてね(ゼロサプレス)」という優しい指示です。
例えるなら、`9`は「どんな数字も受け入れる額縁」、`Z`は「空っぽなら目立たないように隠してくれるカーテン」のようなものですね。
—
3. 実践:コードで見てみよう
実際に、数値データを編集するコード例を見てみましょう。
1
/ 編集サンプルプログラム /
TEST_EDIT: PROC OPTIONS(MAIN);
DCL RAW_VAL FIXED DEC(7) INIT(123); / 元の数値データ /
DCL EDIT_VAL PIC ‘ZZZ,ZZ9’; / 編集用:カンマ付きでゼロサプレス /
DCL SIGN_VAL PIC ‘ZZ9-‘; / 符号付きの編集 /
/ 1. 基本的なゼロサプレス /
EDIT_VAL = RAW_VAL;
PUT SKIP LIST(‘編集結果1:’, EDIT_VAL); / 出力: 123 /
/ 2. 符号表示との組み合わせ /
/ マイナスの場合は ‘-‘ が表示され、プラスなら空白になります /
RAW_VAL = -123;
SIGN_VAL = RAW_VAL;
PUT SKIP LIST(‘編集結果2:’, SIGN_VAL); / 出力: 123- /
END TEST_EDIT;
このコードのポイント
- `PIC ‘ZZZ,ZZ9’`: もし値が `0` だった場合、すべてが空白になります。でも、最後の `9` があるおかげで、値が `0` の時は ` 0` と、少なくとも一つのゼロは残るようになっています。帳票で「金額ゼロ」を明示したい時によく使われるテクニックです。
- `PIC ‘ZZ9-‘`: 末尾の `-` は符号制御文字です。値が負の時にマイナス記号が出現し、正の時は空白になります。COBOLの編集ピクチャに近い感覚ですが、PL/Iではより柔軟に指定できるのが強みです。
—
4. なぜ今さらPL/Iなのか?
「今の時代に、なぜこんなレガシーな記述を?」と思うかもしれません。しかし、銀行や保険、公共システムなどの基幹領域では、この「数値の桁揃え」や「符号の扱い」一つで、数兆円の決済が正確に行われているかどうかが決まります。
もし、マイグレーションの現場でこの `PIC` 記述に出会ったら、「これはデータを美しく整えるための、職人のこだわりなんだな」と捉えてみてください。
初学者の方へのアドバイス
1. 最初は難しく考えない: `Z` は「ゼロを隠す」、`9` は「数字を表示する」とだけ覚えてください。
2. 桁数を合わせる: ピクチャの長さ(文字数)は、代入される数値の最大桁数以上を確保するのが鉄則です。足りないと、コンパイラが頑張って調整してくれますが、意図しない切り捨てが発生することもあります。
3. 悩んだらコンパイラに聞く: メインフレームのコンパイラは非常に優秀です。コンパイルリストの診断メッセージは、時にどんな教本よりも的確なヒントをくれます。
PL/Iは、一度馴染むと、その表現力の高さと奥深さに必ず魅了されます。怖がらず、まずは小さな出力テストから楽しんでみてくださいね。応援しています!
