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

こんにちは。メインフレームの世界へようこそ。
JavaのクラスやCOBOLのCOPY句に慣れ親しんだ方にとって、PL/Iの「EXTERNAL属性」という概念は、最初は少しだけ魔法のように感じるかもしれません。でも、安心してください。実はこれ、皆さんがよく知っている「グローバル変数」を、メインフレーム流の職人芸で実現しているだけなんです。

今日は、このレガシー界の隠れた重要機能について、肩の力を抜いて紐解いていきましょう。

なぜ「EXTERNAL」が必要なのか?

Javaなら`public static`、COBOLなら`COMMON`や`EXTERNAL`属性。これらはすべて「複数のプログラム(コンパイル単位)から共通のデータを見に行きたい」という願いを叶えるための仕組みですよね。

PL/Iにおいても考え方は同じです。プログラムAで計算した「今日の日付」や「システム設定値」を、プログラムBでもそのまま使いたい。でも、PL/Iのコンパイラは、基本的に「そのソースファイルの中の世界」しか見えません。

そこで登場するのが`EXTERNAL`属性です。「これは私の持ち物だけど、外の世界(リンケージエディタ)にも名前を公開しておくから、他の奴らが同じ名前で呼んだら同じメモリ領域を指し示してくれよな」と、コンパイラとリンカに申し送るためのラベルだと考えてください。

実際にコードで見てみましょう

まずは、データを定義する側(親玉)の例です。

1
/ プログラムA:データを定義する側 /
PROG_A: PROCEDURE OPTIONS(MAIN);

/ EXTERNAL属性をつけることで、メモリ上の共通領域に配置される /
/ INITIALで初期値を与えておくのが定石です /
DCL SHARED_CONFIG_VALUE FIXED BIN(31) EXTERNAL INITIAL(999);

PUT SKIP LIST(‘PROG_A: 設定値は ‘ || SHARED_CONFIG_VALUE);

/ 別のプログラムを呼び出す /
CALL PROG_B;

END PROG_A;

次に、その変数を使う側(子分)の例です。

1
/ プログラムB:データを利用する側 /
PROG_B: PROCEDURE;

/ 属性と名前を完全に一致させて宣言する(ここが重要!) /
/ EXTERNALをつければ、PROG_Aと同じメモリを指すようになる /
DCL SHARED_CONFIG_VALUE FIXED BIN(31) EXTERNAL;

PUT SKIP LIST(‘PROG_B: 受け取った設定値は ‘ || SHARED_CONFIG_VALUE);

/ 値を書き換えると、PROG_A側からも変わって見える /
SHARED_CONFIG_VALUE = 777;

END PROG_B;

初学者がハマりやすい「落とし穴」

このEXTERNAL、便利ですが少しだけ「気難しい」ところがあります。現場でトラブルにならないよう、以下の3点だけは心に留めておいてください。

1. 「名前」と「属性」の完全一致
PL/Iは非常に厳格です。もし片方のプログラムで `FIXED BIN(31)` と書き、もう一方で `FIXED BIN(15)` と書いてしまったらどうなるか?コンパイルは通るかもしれませんが、実行時にメモリの境界を超えて読み書きしてしまい、「予期せぬデータ破壊」という悪夢が待っています。宣言はCOPY句(%INCLUDE)で共通化するのが、熟練アーキテクトの嗜みです。

2. リンケージエディタによる解決
Javaのクラスパスのように自動で紐づくわけではありません。コンパイル・リンクの工程で、これら複数のプログラムを束ねて実行モジュール(ロードモジュール)を作る際に、リンケージエディタが「あ、この名前はあっちのプログラムのこれと同じだな」と紐付けを行います。エラーが出る場合は、リンク対象にプログラムが含まれているかを確認してください。

3. 意図しない値の書き換え
グローバル変数全般に言えることですが、どこからでも書き換えられるということは、バグの温床になりやすいということでもあります。変更履歴を追うのが難しくなるので、「本当にここを外部公開する必要があるのか?」と一度自問自答することをお勧めします。

まとめ:怖がらなくて大丈夫!

PL/IのEXTERNAL属性は、例えるなら「共有掲示板」です。全員が同じ名前の掲示板を見ていれば、誰かが書き込んだ情報を全員が知ることができる。ただ、掲示板のルール(データ型)を全員で揃えておかないと、とんでもない誤解が生じる……。

そう考えると、少し親しみやすくなりませんか?

メインフレームの世界は、最新のフレームワークのような派手さはありませんが、その分、メモリ管理の一つひとつに技術者の魂が宿っています。まずは小さなプログラムで、EXTERNALを使った値の受け渡しを実験してみてください。

もし何か不可解な挙動に出くわしても、それはあなたのミスではありません。PL/Iという歴史ある言語からの「ちょっとした挑戦状」だと思って、楽しみながら付き合っていきましょう。応援しています!

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