【入門編】ビルトイン関数 PRECISION による精度変更 – PL/Iの基本構文とデータ制御実践ガイド

こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLといった他のプログラミング言語の経験がおありなら、PL/I(ピーエルワン)という名前を初めて聞いたとき、「なんだか古めかしい名前だな…」「難しそうだな…」と感じられたかもしれませんね。

でも、安心してください。ベースにある考え方は他の言語と変わりません。ただ、PL/Iには「他言語の常識が通用しない、ちょっとユニークなこだわり」がいくつかあるだけです。一つずつ紐解いていけば、決して怖くありませんよ。

今回は、そんなPL/Iの数あるユニークな機能の中から、変数の精度を操るビルトイン関数 `PRECISION`(プレシジョン) について、内部の動きやメモリの裏側まで、現場のプロの視点でお話ししていきますね。

—

1. 他の言語とはちょっと違う?PL/Iの変数は「お引越し」が好き

JavaやCOBOLで数値の桁数を変更したいとき、どうしますか?
多くの場合、新しく別の変数を定義し直したり、画面やレコードのレイアウト(FDやCOPY句)そのものを変えたりしますよね。

しかし、PL/Iの世界では、計算の途中で「あ、やばい、桁数が足りなくなるかも!」と思ったとき、ビルトイン関数 `PRECISION` を使うことで、その場で変数の精度(有効桁数)をギュッと広げたり、スリムにしたりすることができます。

ここでJavaやCOBOL出身のエンジニアが驚くポイントがあります。
「えっ、変数のサイズを変えたら、メモリはどうなるの?」

実はPL/Iは、私たちが `PRECISION` 関数を呼び出した瞬間、裏側でこんなドラマを繰り広げています。

1. 新しいサイズのメモリ領域をこっそり確保する
2. 古いデータから中身をきれいにコピーして引っ越す
3. 古いメモリ領域をそっと片付ける

そう、変数の精度変更とは、いわば「データのお引越し」そのものなんです。

—

2. メモリ再割り当てのオーバーヘッドという「お引越しのコスト」

「お引越し」と聞いて、ピンと来た方もいるのではないでしょうか。
現実世界でも、家具が多い家ほど引っ越しには時間も労力(コスト)もかかりますよね。

プログラムの世界でも全く同じです。`PRECISION` 関数を使って動的に精度を変更するということは、プログラムの実行中に「メモリの再割り当て(ストレージの再アロケーション)」が発生していることを意味します。

もし、これが何百万件もループするバッチ処理のど真ん中で毎回行われたとしたら……?
想像しただけでも、CPUがヒーヒー言っているのが目に浮かびますよね。基幹システムのパフォーマンス低下(オーバーヘッド)の温床になりかねないポイントです。

だからこそ、私たちシステムアーキテクトは現場でこうアドバイスします。
「動的な `PRECISION` の変更は便利だけど、ループの外でやるか、最初から十分な桁数を持たせておきなさい」と。

—

3. 実践!PL/Iコードで見る `PRECISION` の世界

百聞は一見にしかず。実際に `PRECISION` 関数を使ったPL/Iのコードを見てみましょう。
大文字ベースの伝統的な書き方ですが、日本語のコメントを添えていますので、リラックスして読んでくださいね。

1
//
/ 精度変更(PRECISION)のサンプルプログラム /
/ JavaやCOBOL経験者向けに、動きを優しく解説します /
//
PRECISION_SAMPLE: PROC OPTIONS(MAIN);

/ 変数の宣言 /
/ FIXED DECIMAL(5,2) は、全体で5桁、うち小数点以下が2桁という意味です /
DCL W_ORIGINAL_VAL FIXED DECIMAL(5,2) INIT(123.45);
DCL W_NEW_VAL FIXED DECIMAL(7,3);

DISPLAY(‘— 処理開始 —‘);
DISPLAY(‘元の値: ‘ || W_ORIGINAL_VAL);

//
/ PRECISION関数の呼び出し /
/ 第1引数: 対象の変数 /
/ 第2引数: 新しい全体桁数 /
/ 第3引数: 新しい小数点以下の桁数 /
//
/ ここで裏側でお引越し(メモリ再割り当て)が発生します! /
W_NEW_VAL = PRECISION(W_ORIGINAL_VAL, 7, 3);

DISPLAY(‘精度変更後の値: ‘ || W_NEW_VAL);
DISPLAY(‘— 処理終了 —‘);

END PRECISION_SAMPLE;

コードのポイント

  • `FIXED DECIMAL(5,2)`:COBOLの `PIC S9(3)V92 COMP-3` のようなものです。PL/Iでは非常に直感的に定義できます。
  • `PRECISION(W_ORIGINAL_VAL, 7, 3)`:元の5桁・小数2桁のデータを、7桁・小数3桁の器にスポッと綺麗に収め直しています。余った桁には自動的にゼロがパディング(埋め込み)されます。

—

4. 最後に:レガシーの仕様は「怖くない」

いかがでしたでしょうか?
`PRECISION` による精度の変更は、一見すると魔法のようにつまみ食いできて便利な機能ですが、その裏では「メモリの再割り当て」というハードウェアのコストを伴っています。

レガシーシステムのマイグレーションや保守において、「なぜこのコードはこういう書き方をしているのか?」と疑問に思ったときは、今回のような「メモリやハードウェアの裏側のストーリー」を少しだけ想像してみてください。

先人たちがなぜそのコードを書いたのかが見えてくると、PL/Iという言語がぐっと身近に、そして愛おしく感じられるはずです。

メインフレームの世界へ飛び込んだあなたの挑戦を、心から応援しています!また次回の技術コラムでお会いしましょう。

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