【入門編】EXTERNAL属性によるグローバル変数共有 – PL/Iの基本構文とデータ制御実践ガイド

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」という言葉を見つけたら、「ああ、これは他のモジュールと手を繋いでいるんだな」と優しく声をかけてあげてください。

皆さんのメインフレーム移行が、素晴らしい成功体験になることを心から応援しています。また、いつでも聞きに来てくださいね!

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