PL/Iの「自由奔放」な世界へようこそ:予約語の罠と、数値変換エラーを華麗に裁く方法
こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLの厳格なルールに慣れていると、PL/Iという言語は時に「自由すぎて怖い」と感じるかもしれません。しかし、実はこの自由さこそが、数十年もの間、金融や物流の基幹システムを支え続けてきた「懐の深さ」でもあるんです。
今日は、PL/Iの独特な命名規則と、初学者が最も頭を悩ませる「数値変換エラー(CONVERSION)」の攻略法について、現場の知見を交えてお話ししますね。
—
1. 「予約語がない?」PL/Iの自由な命名規則
他の言語では「`IF` や `SELECT` は変数名に使えない」というのが常識ですよね。でも、PL/Iの世界には、「絶対に使ってはいけない予約語」というものが存在しません。
例えば、こんなコードが書けてしまいます。
/i
DCL IF FIXED BIN(15); / 変数名にIFを使ってしまう! /
IF = 10;
IF IF = 10 THEN PUT SKIP LIST(‘不思議なコードですが、動きます’);
「えっ、そんなの混乱するだけでは?」と思いますよね。その通りです。だからこそ、現場では「予約語っぽく見える名前は避ける」という暗黙の了解(コーディング規約)が重要になります。PL/Iはコンパイラが文脈を読み取って解釈する「非常に賢い(が、お節介な)」言語なので、プログラマの意図を汲み取ろうと必死なんです。
アドバイス:
初心者のうちは、変数名には必ず「`W-`(ワーク用)」や「`I-`(入力用)」といったプリフィックス(接頭辞)を付ける癖をつけましょう。これだけで、コンパイラとの無駄な駆け引きを減らせますよ。
—
2. 数値変換エラー:ON CONVERSIONの守護神
メインフレームのバッチ処理では、外部から来たデータが「数字だと思っていたら、実はゴミデータ(スペースや異常文字)だった」という事故が頻発します。COBOLなら桁あふれや`INVALID KEY`で止まるような場面ですね。
PL/Iには、こうした変換失敗を優雅にキャッチする `ON CONVERSION` という仕組みがあります。これは「エラーが起きた瞬間に、別の処理に切り替える」ための防波堤です。
実践的なコード例
数値項目に不正な文字が入ってきた際、プログラムを異常終了させずにログを出力して処理を継続させる例です。
/i
/ 数値変換エラーが発生した時の「お守り」を定義します /
ON CONVERSION BEGIN;
/ どの変数の変換に失敗したのかを特定 /
PUT SKIP LIST(‘警告: 数値変換エラーが発生しました。データを確認してください。’);
PUT SKIP LIST(‘発生箇所: ‘, ONCHAR, ONSOURCE);
/ エラーを無視して、0を代入して強引に処理を続行させる例 /
ONSOURCE = ‘0’;
END;
/ 実際に変換を行う処理 /
DCL PRICE FIXED DEC(5);
DCL INPUT_CHAR CHAR(5) INIT(’12A45′); / ここに不正な ‘A’ が混入 /
PRICE = INPUT_CHAR; / 本来ならここで異常終了するが、ONユニットが発動する /
なぜ `ON CONVERSION` が重要なのか
このコードの肝は `ONSOURCE` という擬似変数です。これは「変換に失敗したデータ」そのものを指しています。これを書き換えることで、プログラムを止めずに「不正データなら0とみなす」といった柔軟なリカバーが可能になります。
—
3. 現場で役立つダンプ解析のヒント
もし、`ON CONVERSION` を仕掛けていても解決できないほど深刻なメモリ破壊や異常終了が起きたら、いよいよ「ダンプ(メモリの書き出し)」の出番です。
PL/Iのダンプを読む際は、以下のポイントを意識してください。
1. `ONCHAR` と `ONSOURCE` を探す:
ダンプ内にこれらの値が出ていれば、エラーの直接的な原因となった文字コードが分かります。
2. ストレージ属性を確認する:
`FIXED DEC`(パック10進数)なのか `FIXED BIN`(2進数)なのか。PL/Iはデータ属性を勝手に解釈して変換(キャスト)しようとします。ダンプ上の16進数データが、宣言と一致しているかを照らし合わせるのが基本です。
3. アライメントの罠:
`ALIGNED` と `UNALIGNED` の違いで、メモリの配置がズレることがあります。構造体の中身を見る際は、定義とメモリ配置が一致しているか、マニュアルの「ストレージマップ」を確認する癖をつけましょう。
—
最後に:怖がる必要はありません
PL/Iは古い言語ですが、その分、プログラムがどう動いているのかを深く理解するための「情報の宝庫」でもあります。エラーが起きるということは、プログラムが「ここ、想定と違うよ!」と教えてくれているサインです。
`ON CONVERSION` を使って、システムに「もしもの時の逃げ道」を作ってあげましょう。そうすれば、メインフレームのバッチ処理も、きっとあなたの信頼できる強力なパートナーになってくれるはずです。
何かまた分からないことがあれば、いつでも聞きに来てくださいね。一緒に紐解いていきましょう!
