【入門編】コンパイルオプションOFFSETによるダンプ解析の効率化 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの迷宮を歩く:OFFSETオプションで「どこで落ちたか」を瞬時に特定する技術

メインフレームの世界へようこそ!JavaやCOBOLの経験がある方にとって、PL/I(ピーエル・アイ)という言語は、一見すると「古めかしい記号の羅列」に見えるかもしれません。でも、安心してください。PL/Iは「科学技術計算」から「事務処理」までこなせる、非常に懐の深い言語なんです。

今日は、そんなPL/Iの現場で、新人エンジニアが最初に直面する「アバウトなダンプ」の海で溺れないための、究極のライフハックをお伝えします。

1. プログラムの「地図」を作る:OFFSETオプションとは?

PL/Iプログラムをコンパイルするとき、何も設定しないと、エラーが発生しても「メモリアドレスのどこか」という冷たい情報しか出力されません。これでは、まるで地図を持たずに遭難するようなものです。

そこで使うのが `OFFSET` オプションです。これをコンパイル時に指定すると、コンパイラが「ソースコードの何行目が、メモリのどこに配置されているか」という対応表(コンパイルリスト)を生成してくれます。

コンパイル時の指定例

//SYSOPT DD
RENT, OFFSET, LIST, MAP
/

※ `RENT`(リエントラント)はメインフレームの基本中の基本ですね。メモリ効率を考えれば必須です。

2. 実践:プログラム構造とダンプの読み方

まずは、基本構造を見てみましょう。PL/Iは `PACKAGE`(入れ物)の中に `PROCEDURE`(処理)を書くのが定石です。

1
MYPROG: PACKAGE OPTIONS(MAIN);

/ メイン処理の手続き /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);
DCL A FIXED BIN(31) INIT(0); / 32ビットの整数型 /
DCL B FIXED BIN(31) INIT(10);
DCL C FIXED BIN(31);

/ ここで意図的にゼロ除算を発生させてみます /
C = B / A; / <--- ここが障害箇所! / END MAIN_PROC; END MYPROG; さて、ここで `C = B / A` でゼロ除算が発生し、システムが異常終了(ABEND)したとします。出力された `CEE3DMP`(LE環境のダンプ)を開くと、こんな風に書かれています。 > `From compile unit MYPROG at entry point MAIN_PROC at statement 12 at offset +000000A4`

「Offset +000000A4」の意味

この `A4` という値が、メモリ上の命令位置です。ここからが腕の見せ所です!コンパイルリスト(コンパイル時に出力されるテキストファイル)を開き、`OFFSET` と書かれた列を探してください。

| ステートメント番号 | オフセット | 生成された命令 |
| :— | :— | :— |
| 10 | 00000098 | LOAD R1, A |
| 11 | 0000009C | LOAD R2, B |
| 12 | 000000A4 | DIV R1, R2 |

「あ、オフセットA4は12行目だ!」と即座にわかりますよね。これができれば、現場の先輩からも「お、やるな」と思われること間違いなしです。

3. なぜPL/Iは少し「奇妙」なのか?

初心者の方が一番驚くのは、PL/Iの「自由さ」かもしれません。例えば、変数の宣言(DCL)がやたらと多いこと。

  • FIXED BIN(31): COBOLでいう `PIC S9(9) COMP` です。
  • CHAR(10): 文字列です。
  • STRUCTURE: 複数のデータを塊にする機能。これはCOBOLのデータ階層に似ているので馴染みやすいはずです。

PL/Iは、型に対して非常に厳格でありながら、ポインタ操作もできるという「Javaのような構造化」と「Cのような低レイヤー操作」のハイブリッドなんです。最初は怖がらずに、「データはメモリ上のどこかに陣取っているだけ」というイメージを持ってください。

4. 最後に:トラブルシューティングを楽しむコツ

メインフレームのデバッグは、現代のIDEのように「変数にマウスを乗せれば中身が見える」といった魔法は使えません。しかし、`OFFSET` を使い、ダンプという「プログラムの断末魔」を読み解くスキルは、どんな言語環境に行っても通用する「システムの構造を見抜く力」になります。

もしダンプにぶつかったら、「これはプログラムが最後に見せてくれた地図なんだ」と考えてみてください。そうすれば、少しだけ親しみが湧いてきませんか?

また分からないことがあれば、いつでも聞いてくださいね。PL/Iの世界は深いですけれど、一歩ずつ進めば必ず道は拓けます。一緒に頑張りましょう!

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