【PL/I入門】「予約語がない」という衝撃。外部言語連携(ASM/COBOL)の作法を紐解く
皆さん、こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLの経験がある方にとって、PL/I(ピーエル・ワン)という言語は、まるで「自由奔放な老舗の芸術家」のように映るかもしれません。
今日は、そんなPL/Iのちょっと変わった性格と、他言語(COBOLやASM)と連携する際の「国境越えのルール」についてお話しします。難しく考えないでください。一つずつ紐解けば、メインフレームのバッチ処理なんて怖くありませんよ。
—
1. 「予約語がない」という不思議な仕様
まず最初に驚くのが、PL/Iには厳密な意味での「予約語」が存在しないという点です。
「えっ、`IF`や`THEN`は予約語じゃないの?」と思いますよね。実はPL/Iでは、キーワードは単なる「文脈上のデフォルト」に過ぎません。極端な話、`DECLARE IF FIXED;` と書けば、`IF`という名前の変数を作れてしまいます。
「じゃあコンパイラはどうやって区別するの?」
それは、コンパイラが文脈(コンテキスト)を見て判断しているんです。
「あ、ここに出てきた`IF`は変数の名前だな」「こっちは構文の`IF`だな」と、空気を読んで解釈してくれます。これは非常に柔軟ですが、裏を返せば、変数の名付けに失敗するとコンパイラを混乱させる原因にもなります。
初心者の方へのアドバイスとしては、「キーワードはキーワードとして使う(変数名にしない)」という当たり前のことを守るだけで十分です。メインフレームという広大な宇宙では、コードの可読性が何よりも正義ですからね。
—
2. 異言語との対話:ENTRY属性の魔法
さて、本題の外部呼出しです。COBOLのプログラムやアセンブラ(ASM)のルーチンを呼び出す際、PL/Iは`ENTRY`属性というものを使います。これは「これから呼び出す相手は、PL/Iの外に住んでいる人ですよ」とコンパイラに教えてあげるための紹介状のようなものです。
コード例:COBOLを呼び出すための紹介状
1
/ 外部のCOBOLプログラム ‘SUBPROG’ を呼び出す準備 /
DCL SUBPROG ENTRY (FIXED BIN(31), CHAR(20))
OPTIONS(COBOL);
DCL MY_ID FIXED BIN(31) INIT(100);
DCL MY_NAME CHAR(20) INIT(‘IBM-MAINFRAME’);
/ いざ、呼び出し! /
CALL SUBPROG(MY_ID, MY_NAME);
この`OPTIONS(COBOL)`という一文が重要です。これをつけることで、PL/Iは「あ、相手はCOBOLだから、引数の渡し方をCOBOL流に合わせなきゃ」と自動的にリンケージ規約を調整してくれます。
—
3. BYADDR vs BYVALUE:渡すのは「実物」か「住所」か
ここが一番のつまずきポイントです。他言語とやり取りする際、「データをどう渡すか」を明確にする必要があります。
- BYADDR(デフォルト): データの「番地(メモリアドレス)」を渡します。相手先がCOBOLの場合、基本的にこれです。相手は「その住所に行けばデータがあるんだな」と理解します。
- BYVALUE: データそのものを渡します。アセンブラのルーチンや、C言語のような環境と連携する際によく使います。
もし、COBOL側が「値」を期待しているのに、PL/Iが「住所」を渡してしまったら……。COBOL側は住所の数字をデータだと勘違いして計算してしまい、結果は当然「異常終了(ABEND)」です。
引数指定の書き方
1
/
BYADDR: デフォルト。住所を渡す。
BYVALUE: 値をそのまま渡す。
/
DCL SUB_ASM ENTRY (FIXED BIN(31) BYVALUE,
CHAR(20) BYADDR)
OPTIONS(ASM);
イメージしてみてください。
- BYADDR:家の鍵を渡す(相手が家の中に入って中身を書き換えられる)。
- BYVALUE:コピーした書類を渡す(相手が何をしようが、元の書類は汚れない)。
この違いを意識するだけで、デバッグの時間は劇的に短縮されます。
—
最後に:メインフレームは「対話」の積み重ね
PL/Iは、古い言語だからといって決して不親切ではありません。むしろ、ハードウェアの挙動に近い部分まで我々が制御できる、非常にパワフルで論理的な道具です。
「他言語との連携」は、異文化交流のようなものです。相手(COBOLやASM)の作法を尊重し、PL/Iという通訳を介して正しく情報を伝える。それができれば、どんな巨大なシステムも、あなたの手の中に収まります。
もしコンパイルエラーが出ても落ち込まないでください。それは、コンパイラという相棒が「そっちの道じゃないよ」と教えてくれているだけですから。一つずつ、紐解いていきましょうね。
それでは、良いメインフレームライフを!
