こんにちは。IBMメインフレームの世界へようこそ。
JavaやCOBOLの経験がある方にとって、PL/Iは「なんだか古臭くて、ルールが奇妙な言語だな」と映るかもしれませんね。でも安心してください。PL/Iは、汎用機という広大な大地を切り拓くために生まれた、実は非常に合理的で懐の深いプログラミング言語なんです。
今回は、メインフレームの現場で避けては通れない「エラー処理の奥義」、`ON ZERODIVIDE`についてお話ししましょう。
—
1. その前に:PL/Iの「自由すぎる」命名規則
まず、PL/Iの入り口で皆さんが驚くのが「予約語がない」という事実です。
Javaなら`IF`や`WHILE`は変数名に使えませんが、PL/Iの世界では「文脈で判断する」という大胆なルールを採用しています。例えば、`IF = 10;` と書けば、コンパイラは「ああ、IFという名前の変数に10を代入したいんだな」と解釈してくれます。
これは強力ですが、初心者のうちは「やりすぎ注意」な側面もあります。コードを読む際は、その単語が「命令」なのか「変数」なのか、文脈を読み解くパズルを楽しんでみてくださいね。
—
2. ゼロ除算の悪夢と、PL/Iの「魔法の杖」
さて、本題の `ON ZERODIVIDE` です。
計算処理の途中で「ゼロで割る」という致命的な事態が発生したとき、普通の言語ならシステムが異常終了(ABEND)して「はい、おしまい!」となりますよね。
しかし、PL/Iには「例外が発生したら、その瞬間、事前に仕込んでおいたコードを呼び出す」という、ONユニットという仕組みがあります。いわば「転ばぬ先の杖」です。
実践的なコード例
まずは、実際のコードを見てみましょう。
/i
/ ゼロ除算が発生した際のリカバリ処理サンプル /
TEST_CALC: PROC OPTIONS(MAIN);
DCL A FIXED DEC(5) INIT(100);
DCL B FIXED DEC(5) INIT(0);
DCL RESULT FIXED DEC(5);
/ ゼロ除算が発生した時の「逃げ道」を定義 /
ON ZERODIVIDE
BEGIN;
PUT SKIP LIST(‘警告: ゼロ除算が発生しました。結果を0として処理を続行します。’);
RESULT = 0; / 0で割る代わりに、強制的に0を代入して復旧 /
END;
/ 通常の演算処理 /
RESULT = A / B;
PUT SKIP LIST(‘計算完了。結果は:’ || RESULT);
END TEST_CALC;
—
3. このコードで何が起きているのか?
このコードの面白い点は、「エラーが起きても止まらない」というところです。
1. `ON ZERODIVIDE` という記述により、システムに対して「もしゼロで割ろうとしたら、このブロックを実行してくれ」という契約(監視)を託します。
2. `RESULT = A / B;` の行で、Bが0だった瞬間にシステム割り込みが発生します。
3. すぐさま実行フローが `ON` ユニットの `BEGIN;` ブロックへとジャンプします。
4. ログを出力し、適正な値(ここでは0)を代入して、なんと元の演算処理の次の行からプログラムが再開されます。
これがPL/Iの強力なところです。Javaの `try-catch` は例外が発生するとブロックを抜けてしまいますが、PL/Iの `ON` ユニットは、「あたかも何事もなかったかのように」処理を継続させるための設計がなされているのです。
—
4. スペシャリストからのアドバイス
「じゃあ、すべてのエラーをONユニットで回避すればいいのでは?」と思われるかもしれません。しかし、ここには落とし穴があります。
- エラーの原因を隠蔽しすぎないこと:安易に `RESULT = 0;` とすると、データがなぜ0になったのかという根本的な原因調査が難しくなります。実務では、必ずログを詳細に出力するようにしてください。
- ONユニットの範囲を理解する:`ON` ユニットは、定義されたブロック内だけでなく、その下位のプロシージャにも影響を及ぼします。思わぬ場所で発火しないよう、影響範囲は小さく保つのがメインフレーム開発の定石です。
—
最後に
PL/Iは、古い言語ゆえに「そんな書き方ありなの?」という驚きが多いかもしれません。でも、一つずつ紐解いていくと、大規模な基幹システムを長期間安定して稼働させるための、極めて実用的な工夫が詰まっていることに気づくはずです。
「エラーをどう飼い慣らすか」。それがメインフレームプログラマの腕の見せ所です。
次にゼロ除算に遭遇したとき、焦らず `ON` ユニットでスマートに復旧させてみてください。きっと、PL/Iとの距離がぐっと縮まっているはずですよ。
それでは、また次回のレガシー探訪でお会いしましょう!
