PL/Iの「EXTERNAL属性」で紐解く、モジュール間データ共有の深淵
こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLの経験がある皆さんにとって、PL/Iという言語は少し「異質な存在」に映るかもしれませんね。特に「予約語が存在しない」という噂を聞いて、腰を抜かした方もいるのではないでしょうか。
今日は、そんなPL/Iの不思議な魅力と、現場で必ず直面する「EXTERNAL属性によるグローバル変数共有」について、少しだけ深掘りしてみましょう。怖がる必要は全くありません。一つずつ、紐解いていきましょうね。
—
1. PL/Iには「予約語」がない?という衝撃の事実
まず、皆さんが最も驚くのが「PL/Iには完全な予約語が存在しない」という点です。
Javaなら `public` や `class` と書く場所が、PL/Iでは予約されていません。つまり、極端な話をすれば、変数名に `IF` や `THEN` と名付けても、文脈さえ合っていればコンパイラは動いてしまいます。
「じゃあ、どうやってコンパイラは命令と変数を区別しているの?」
それは、PL/Iが「文脈依存の解析」を徹底しているからです。たとえ変数名が `IF` であっても、その位置が命令語として不自然であれば、コンパイラはそれを「あ、これは変数だな」と賢く判断します。昔の限られたメモリ空間で、最大限の自由度を確保しようとした先人たちの知恵なんですね。
—
2. EXTERNAL属性:モジュールを跨ぐ「共有の架け橋」
さて、本題の「EXTERNAL属性」です。
Javaなら `public static` なフィールドとしてクラス間でデータを共有しますが、PL/Iではもっとシンプルに、「名前」を合図にメモリの同じ場所を参照させるという手法をとります。
イメージ図:同じ看板を探す旅
異なるプログラム(コンパイル単位)があったとして、そこに「これはEXTERNALだ!」と宣言された変数が存在するとします。リンケージエディタ(リンク作業)の段階で、システムは同じ名前を持つEXTERNAL変数を探し出し、それらをメモリ上の「同じ箱」に紐付けてくれます。
まるで、異なるビルにいる人たちが、「〇〇さん」という名前を呼ぶことで、実は同じ電話回線を使っている…そんなイメージです。
—
3. 実践コード:EXTERNAL変数の定義と解決
では、実際にどう書くのか見てみましょう。2つのプログラムで共通のカウンターを共有する例です。
プログラムA(値をセットする側)
/i
/ プログラムA: 共通変数を定義し、値を設定 /
PROG_A: PROCEDURE OPTIONS(MAIN);
/ EXTERNAL属性をつけることで、外部から見えるようにする /
DCL SHARED_COUNTER FIXED BIN(31) EXTERNAL;
SHARED_COUNTER = 100; / 共有変数に値を代入 /
PUT SKIP LIST(‘PROG_A: カウンターをセットしました’);
CALL PROG_B; / 別のモジュールを呼び出す /
END PROG_A;
プログラムB(値を参照する側)
/i
/ プログラムB: 同じ名前でEXTERNALを宣言すれば、自動的に紐付く /
PROG_B: PROCEDURE;
/ 同じ名前、同じデータ属性で宣言するのが鉄則 /
DCL SHARED_COUNTER FIXED BIN(31) EXTERNAL;
PUT SKIP LIST(‘PROG_B: 共有された値は ‘ || SHARED_COUNTER);
END PROG_B;
注意すべきポイント
ここで一つだけ、現場でよくある失敗談を。
もし `PROG_B` で宣言した `SHARED_COUNTER` の属性(`FIXED BIN(31)` など)が `PROG_A` と異なっていたらどうなると思いますか?
コンパイラは「名前が同じだから、きっと同じものを指しているんだろう」と信じ込んでリンクしてしまいます。結果、実行時にメモリの破壊や、とんでもない数値のオーバーフローが発生し、深夜のデバッグに追われることになります。
「属性は必ず合わせる」。これが、EXTERNALを使う際の「呪文」だと思ってください。
—
4. なぜ今、EXTERNALを使うのか?
今風の設計からすると「グローバル変数は悪」という教えが強いですよね。確かに、大規模なシステムでEXTERNALを多用すると、どこで値が変わったのか追跡するのが非常に困難になります。
しかし、メインフレームの歴史あるシステム改修では、既存の共通メモリ領域(コモンエリア)にアクセスするために、この属性が避けて通れない場面が多々あります。
- 古い仕組みを壊さずに機能拡張したいとき
- レガシーな共通ルーチンを呼び出すとき
そんな時、EXTERNAL属性は非常に強力な武器になります。
—
最後に:怖がらなくて大丈夫です
PL/Iの文法は、最初は独特の記号や属性の多さに圧倒されるかもしれません。でも、一つずつ「この変数はどこに住んでいるのか?」「誰と共有しているのか?」を意識するだけで、メインフレームという巨大なシステムが、実はとても論理的に動いていることに気づけるはずです。
もし現場で「EXTERNAL」という言葉を見つけたら、「ああ、これは他のモジュールと手を繋いでいるんだな」と優しく声をかけてあげてください。
皆さんのメインフレーム移行が、素晴らしい成功体験になることを心から応援しています。また、いつでも聞きに来てくださいね!
