CICSの世界へようこそ!PL/Iで扱う「EIB」と「COMMAREA」の秘密を解き明かす
こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLといったモダンな言語に慣れている方にとって、PL/I(ピーエル・アイ)という言語は、まるで「考古学者が解読する暗号」のように見えるかもしれません。特にCICS(シーアイシーエス)というオンライン処理環境とPL/Iが組み合わさると、独特の作法に戸惑うことも多いはずです。
今日は、そんな皆さんのために「CICS連携の要」であるDFHEIBLKとDFHCOMMAREAについて、現場の知見を交えて優しく紐解いていきたいと思います。
—
1. そもそも「EIB」と「COMMAREA」って何?
CICS環境において、プログラムは単独で動いているわけではありません。CICSという巨大なオーケストラの指揮者のような存在が、プログラムを呼び出し、メモリを管理しています。その際、必ず受け渡される「お土産」のようなデータがこの2つです。
- DFHEIBLK(Execute Interface Block): CICSがプログラムに提供する「現在の状況報告書」。今どの端末から呼ばれたか、エラーは起きていないかといったメタ情報が詰まっています。
- DFHCOMMAREA(Communication Area): プログラム間でデータを渡すための「伝言板」。前段の画面やプログラムから受け取ったデータを、ここに格納してやり取りします。
2. PL/Iでの宣言:怖いものなんてない!
PL/Iのコードを見ると、`DCL`(DECLARE)というキーワードが並び、謎の属性がついていてギョッとするかもしれませんが、基本は「型」と「長さ」を指定しているだけです。
以下のコード例を見てみましょう。CICSのプログラムで最も標準的な入り口の書き方です。
1
/ CICSメインプログラムの入り口 /
MYPROG: PROCEDURE(DFHEIBLK, DFHCOMMAREA) OPTIONS(MAIN);
/ EIBはCICSが提供する構造体。宣言は必須だが中身はCICSにお任せ /
DCL DFHEIBLK PTR;
/ COMMAREAは「何が来るか」を自分で定義する。これが一番大事! /
DCL DFHCOMMAREA CHAR(256) BASED;
/ データを受け取るための自身の構造体を定義 /
DCL 1 MY_COMM_AREA,
3 USER_ID CHAR(8), / ユーザーID /
3 TRANS_CODE CHAR(4), / トランザクションコード /
3 DATA_BODY CHAR(244); / 残りのデータ /
/ CICSから受け取ったCOMMAREAを、自分の構造体にポインタで割り当てる /
/ これがPL/I流の「型変換(キャスト)」の考え方です /
DCL MY_PTR PTR;
MY_PTR = ADDR(DFHCOMMAREA);
/ さあ、これでMY_COMM_AREAを通じてデータが読み書きできるようになります /
/ 読み取り例 /
IF SUBSTR(DFHCOMMAREA, 1, 8) = ‘ADMIN ‘ THEN DO;
/ 管理者権限の処理へ /
END;
RETURN;
END MYPROG;
—
3. なぜ「BASED」を使うのか?(ポインタの魔法)
上記のコードで `DCL DFHCOMMAREA CHAR(256) BASED;` と書いたことに気づきましたか?
ここがPL/Iの面白いところであり、少し特殊な部分です。
`BASED`というのは、「場所(アドレス)はまだ決まっていないけど、この型として扱いますよ」という宣言です。CICSがメモリ上のどこかにCOMMAREAを用意してくれ、そのアドレスをプログラムに渡してくれます。私たちは`ADDR`関数を使って、「そのメモリ領域を、自分たちの構造体として見なしてください」と指示しているわけです。
Javaで言えば「インターフェースを実装したインスタンスをキャストして使う」感覚に似ていますが、PL/Iはもっと生々しく、メモリ上のバイト列を直接指し示します。
4. 現場で役立つトラブルシューティングのヒント
CICS×PL/Iの現場でよくある「落とし穴」を先回りしてお伝えしますね。
- 「長さ」の不一致に注意!:
CICSから送られてくるデータ長(`EIB.EIBCALEN`で確認できます)と、プログラム側で定義した構造体の長さが異なると、最悪の場合メモリアクセス違反(S0C4アベンド)を起こします。「受け取ったデータの長さが期待通りか」を必ず最初にチェックする癖をつけましょう。
- ポインタの迷子:
`BASED`宣言した変数は、ポインタを正しくセットする前にアクセスすると、予測不能な動作をします。まずは「`DFHCOMMAREA`が空(長さ0)ではないか?」を必ず確認するガード節を設けるのが、熟練アーキテクトの作法です。
—
最後に:怖がらずに、一歩ずつ
PL/Iは一見すると古い言語に見えますが、メモリ管理を非常に細かく制御できる、非常に強力なツールです。`DFHEIBLK`や`DFHCOMMAREA`といった構造体も、一度「CICSと会話するための共通言語」だと分かれば、決して難しくはありません。
もしコンパイルエラーやアベンドが出ても、それは「システムがあなたに何かを伝えようとしているサイン」です。そのサインを一つずつ読み解いていけば、必ず解決できますよ。
次回の記事では、このCOMMAREAを使って構造体をより複雑にネストさせる方法や、効率的なデータ更新のテクニックについて深掘りしていこうと思います。それでは、良いメインフレーム・ライフを!
