【入門編】ON ZERODIVIDEによるゼロ除算のトラップ – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの守護神PL/I:ゼロ除算を優雅に乗りこなす「ONユニット」の魔力

こんにちは!長年、巨大なメインフレームの深淵でシステムを守り続けているアーキテクトです。

JavaやCOBOLの世界からメインフレームの現場にやってくると、PL/Iという言語は少し不思議な宇宙に見えるかもしれません。「なぜ変数の宣言がこんなに複雑なんだ?」「なぜいきなり変なキーワードが出てくるの?」と戸惑うこともあるでしょう。

でも、安心してください。PL/Iは非常に強力で、かつ人間味のある言語です。今日は、基幹業務で避けては通れない「ゼロ除算(ZERODIVIDE)」というトラブルを、PL/I流のスマートなやり方で攻略する方法をお話しします。

1. PL/Iの基本構造:まずは「家」を建てる

PL/Iのコードは、例えるなら「しっかりとした設計図」のようなものです。まずはプログラムという「家」の構造を見てみましょう。

/i
MY_PROGRAM: PACKAGE; / プログラムの大きな区画(パッケージ)です /

MAIN_PROC: PROCEDURE OPTIONS(MAIN); / ここがプログラムの入り口(メイン処理) /

/ 変数宣言や処理をここに書きます /

END MAIN_PROC;
END MY_PROGRAM;

JavaのクラスやCOBOLのIDENTIFICATION DIVISIONに相当しますが、`PACKAGE`で全体を囲い、`PROCEDURE`という「手続き」が実際に動くエンジンになります。特に`OPTIONS(MAIN)`は、「ここがOSから最初に呼ばれる場所だよ!」という大切な目印です。

2. ゼロ除算は突然に:なぜ「トラップ」が必要か

基幹システムのバッチ処理で最も避けたいのは、計算中に「ゼロで割った!」という理由でプログラムが異常終了し、夜間バッチが停止することですよね。

COBOLなら`ON SIZE ERROR`でチェックする場面ですが、PL/Iには「ONユニット」という、さらにエレガントな仕組みがあります。これは、いわば「トラブルが起きたときだけ駆けつけてくれる専用の救急隊」をあらかじめ待機させておくようなものです。

3. 実践!ON ZERODIVIDEで異常終了を防ぐ

さっそく、コードを見てみましょう。

/i
CALC_PROC: PROCEDURE OPTIONS(MAIN);

DCL A FIXED DEC(5,0) INIT(100); / 5桁の整数 /
DCL B FIXED DEC(5,0) INIT(0); / ここがゼロ!危険な香り… /
DCL RESULT FIXED DEC(10,2); / 計算結果用 /

/ 救急隊の待機場所:ゼロ除算が起きたらここに飛んでくる /
ON ZERODIVIDE BEGIN;
PUT SKIP LIST(‘警告: ゼロ除算が発生しました。結果を0として続行します。’);
RESULT = 0; / 0で割る代わりに、安全な値を代入して処理を救う /
END;

/ 実際に計算を行う /
RESULT = A / B;

PUT SKIP LIST(‘計算結果は: ‘, RESULT);

END CALC_PROC;

このコードのポイント

  • `ON ZERODIVIDE`: これが魔法のキーワードです。この行以降、プログラム内のどこでゼロ除算が起きても、即座に異常終了させず、`BEGIN;` から `END;` の間の処理を実行してくれます。
  • 中断させない: 普通ならOSがプログラムを強制終了させるところを、PL/Iは「おっと、計算ミスだね。代わりにこれやっておこう」と、現場の判断でリカバリできるのです。

4. なぜPL/Iのデータ宣言は「変」なのか?

初心者の方が最初に戸惑うのが `DCL A FIXED DEC(5,0);` のような宣言かもしれません。

  • `FIXED DEC`: これは「固定小数点数」です。メインフレームの世界では、お金の計算のように「誤差」が許されない処理が多いため、浮動小数点ではなく、桁数をきっちり決めたこの形式が好まれます。
  • `(5,0)`: 「全体で5桁、小数点以下は0桁」という意味です。非常に厳格ですよね。

このようにPL/Iは、「計算の精度をエンジニアが完全にコントロールする」ことを重視しています。この厳格さがあるからこそ、数十年経った今でも銀行や保険会社の屋台骨を支え続けているのです。

最後に:怖がらずに、仕組みを楽しもう

PL/Iは歴史が古く、一見すると無機質で難しいルールが多いように見えます。ですが、今回ご紹介した`ON`ユニットのように、プログラマが「もしもの時」を設計するための配慮が行き届いた、実はとても優しい言語です。

もし現場で古いコードを読んでいて、「なんじゃこのキーワードは?」と思ったら、それは当時の先輩たちが「システムを絶対に止めない」という執念で書いた知恵の結晶です。

一つずつ、その意図を紐解いていけば、あなたも必ずメインフレームを使いこなす名アーキテクトになれますよ。これからも、レガシー世界の深淵を一緒に冒険していきましょう!

何か不明な点や、特定のキーワードで躓いたら、いつでも相談してくださいね。応援しています!

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