PL/Iの洗礼?「ゼロ除算」を優雅にさばく!メインフレーム界の古き良き流儀
メインフレームの世界へようこそ。JavaやCOBOLを経てこの世界に足を踏み入れた皆さんは、今まさに「PL/I」という、非常に柔軟で、かつ少しだけ個性的な言語の前に立っていますね。
「予約語がない?」「変数の宣言がいきなり難解?」と面食らうことも多いでしょう。でも安心してください。PL/Iは、一度その「論理的な美しさ」を理解すれば、これほど頼もしい相棒はいません。
今日は、システム開発の現場で避けては通れない「ゼロ除算(ZERODIVIDE)」をテーマに、PL/I流のスマートなリカバリ術を解説します。
—
1. そもそもPL/Iに「予約語」がないってどういうこと?
他の言語では `IF` や `THEN` は絶対に変数名に使えませんよね。ところがPL/Iは違います。
/i
DCL IF FIXED BIN(15) INIT(10); / IFという変数名! /
IF IF = 10 THEN PUT SKIP LIST(‘不思議な世界’);
これ、コンパイラが「文脈(コンテキスト)」を読み取って判断しているんです。人間関係で例えるなら、「空気を読む」のが非常に上手な言語ですね。だからこそ、皆さんがコードを書くときは「意図が伝わる命名」を心がけることが、後任者への何よりの優しさになります。
—
2. 恐怖のS0CB(ゼロ除算)を回避する「ONユニット」
さて、本題です。基幹システムのバッチ処理中に、計算結果がゼロになってしまい、プログラムが「S0CB(演算例外)」で異常終了した経験はありませんか?
Javaなら `try-catch` ですが、PL/Iには「ONユニット」という、もっとエレガントな仕組みがあります。「エラーが起きたら、こうしなさい」というルールを、コードの冒頭や処理の要所に置いておくんです。
実装例:ゼロ除算を優しく捕まえる
/i
TEST_DIV: PROC OPTIONS(MAIN);
DCL (VAL1, VAL2, RESULT) FIXED DEC(10, 2);
VAL1 = 100;
VAL2 = 0; / ここで除算が発生すると、通常はABENDします /
/ ZERODIVIDE条件が発生した時の「お作法」を定義 /
ON ZERODIVIDE
BEGIN;
PUT SKIP LIST(‘警告:ゼロ除算が発生しました。計算をスキップします。’);
RESULT = 0; / 回避策として0を代入 /
GOTO CALC_END; / 正常なフローに戻す /
END;
/ 計算処理 /
RESULT = VAL1 / VAL2;
PUT SKIP LIST(‘計算結果は:’ || RESULT);
CALC_END:
PUT SKIP LIST(‘処理を継続します。’);
END TEST_DIV;
このコードのポイント
- ON ZERODIVIDE: これが「監視の目」です。この記述以降、ゼロ除算が発生すると即座にプログラムが割り込みを検知し、`BEGIN`〜`END` ブロックに飛び込みます。
- GOTOの活用: モダンな言語では嫌われがちな `GOTO` ですが、メインフレームの異常系処理では、スタックをきれいに整理して脱出するための強力な武器になります。
—
3. なぜPL/Iはこんなに丁寧なのか?
PL/Iの設計思想には「プログラマの意図を汲み取り、極力異常終了させない」という強い意志が感じられます。
例えば、`FIXED DEC(10, 2)` という宣言。これは「10桁の数字で、うち小数点以下は2桁」という厳密な定義です。この厳格さと、`ON` ユニットのような柔軟な例外処理が同居しているのが、PL/Iが長年金融機関や公共のシステムを支えてきた理由なのです。
初学者の皆さんへのアドバイス
1. まずは怖がらない: メインフレームの「S0CB」という文字列は、初心者にとっては呪文のように怖いものですが、単なる「数学的な無理」を報告してくれているだけです。
2. ONユニットを使いこなす: 複雑な計算ロジックがある箇所には、必ずと言っていいほど `ON ZERODIVIDE` や `ON OVERFLOW` を仕込んでおきましょう。これだけでシステムの信頼性がぐっと上がります。
3. 大文字で書く: PL/Iの歴史は長いので、古いシステムと連携する際は大文字の習慣を守るのが無難です。
—
まとめ
PL/Iの「ONユニット」は、まるで優秀な秘書がエラーの予兆を察知して、裏でこっそりリカバリを済ませてくれるようなものです。
「動かないかもしれない」と怯える必要はありません。システムが教えてくれるエラーを正しくトラップして、プログラムを安全に目的地(正常終了)まで導いてあげてください。
次回のブログでは、ちょっと癖のある「データ型変換の罠(FIXED BIN vs FIXED DEC)」について深掘りします。それでは、良いメインフレームライフを!
