【入門編】STATICストレージクラスの初期化タイミングとモジュール間共有 – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの守護神「STATIC」と「EXTERNAL」を紐解く:PL/Iの世界へようこそ

こんにちは。メインフレームの深淵を覗き込み、数多のレガシーコードを現代へと橋渡ししてきたシステムアーキテクトです。

JavaやCOBOLといった言語からメインフレームの世界に足を踏み入れると、最初は「なんだか古めかしい書き方だな」と感じるかもしれません。でも安心してください。PL/I(ピーエル・ワン)は、その見た目に反して、驚くほど合理的で設計思想がしっかりした言語です。

今日は、そんなPL/Iの中でも、特に「データがどこで生まれ、いつまで生きるのか?」というストレージ(メモリ)の管理について、現場で最もよく遭遇する「STATIC」と「EXTERNAL」というキーワードに絞って紐解いていきましょう。

1. STATIC変数は「ロード時の儀式」で生まれる

まずは`STATIC`ストレージクラスについてです。COBOLで言うところの`WORKING-STORAGE`のようなイメージに近いのですが、PL/Iの`STATIC`はもっと「静寂」な存在です。

なぜ「STATIC」なのか?

`STATIC`と宣言された変数は、プログラムが実行される(ロードされる)瞬間にメモリが確保され、その値はプログラムが終了するまで決して失われません。

  • 初期化のタイミング: プログラムがOSによってメモリにロードされた瞬間に、指定した初期値が書き込まれます。
  • 注意点: プログラムを繰り返し呼び出しても、前回の実行で書き換えた値がそのまま残っています。これがバグの温床になることもあれば、便利な機能にもなるのです。

1
/ STATIC変数の例 /
DCL COUNTER FIXED BIN(31) STATIC INIT(0);
/ プログラムロード時に0で初期化される。再入(リエントラント)時は注意! /

現場の知恵: 「前回の値が残っている」ことは、初期化を忘れると悲惨なバグを生みます。特に再利用されるモジュールの場合、必ず適切なタイミングで値をリセットする習慣をつけましょう。

2. EXTERNALで「モジュール間の絆」を作る

次に、複数のプログラム間でデータを共有する`EXTERNAL`属性です。
Javaでいう`public static`なフィールドを、メインフレームの広大なメモリ空間でどう実現するか。その答えがこれです。

別の部屋にある変数を見に行く

`EXTERNAL`を付けると、その変数は「プログラム専用の引き出し」から「共有ロッカー」に移動します。同じ名前で`EXTERNAL`属性を持つ変数を別のモジュールで宣言すれば、リンクエディット時に同じメモリ番地を指すように繋がれるのです。

1
/ モジュールA:データを定義する側 /
DCL SHARED_VAL FIXED BIN(31) STATIC EXTERNAL INIT(100);

/ モジュールB:データを参照する側 /
DCL SHARED_VAL FIXED BIN(31) STATIC EXTERNAL;
/ Aで宣言されたものと同じ実体を指すことになる /

この仕組み、シンプルですが非常に強力です。ただし、「名前の一致」が全てなので、スペルミス一つで全く違うメモリ領域を参照してしまうという、レガシー言語特有の緊張感があります。

3. 実践:プログラムの骨組みと変数の共存

では、これらを統合したプログラムの基本構造を見てみましょう。`OPTIONS(MAIN)`は、その名の通り「ここから実行を開始する」というエントリーポイントを指します。

1
MY_PROG: PROCEDURE OPTIONS(MAIN);

/ — 定義エリア — /
/ 外部モジュールと共有するSTATIC変数 /
DCL G_STATUS_CODE FIXED BIN(31) STATIC EXTERNAL;

/ このモジュール内だけで生きるSTATIC変数 /
DCL LOCAL_COUNTER FIXED BIN(31) STATIC INIT(0);

/ — 処理エリア — /
LOCAL_COUNTER = LOCAL_COUNTER + 1;

/ 共有変数を更新 /
G_STATUS_CODE = 99;

PUT SKIP LIST(‘ローカルカウンターの値:’, LOCAL_COUNTER);

RETURN;

END MY_PROG;

初学者が陥りやすい罠

1. 初期化のタイミング: `STATIC`変数の初期値は、コンパイル時ではなく、ロード時に決まります。もし複数のプログラムが`EXTERNAL`変数を共有していて、それぞれが`INIT`値を持っていたらどうなるか? リンクエディット時にどの値が優先されるかという仕様を知っておくことが、システムアーキテクトへの第一歩です。
2. パッケージの単位: `PACKAGE`文を使うと、複数のプロシージャを一つのモジュールとして扱えます。大きなプログラムを分割する際は、ぜひ`PACKAGE`を活用してスコープを整理してください。

まとめ:怖がる必要はありません

「STATIC」は「プログラムが生きている間ずっとそこにいる守護神」、「EXTERNAL」は「離れた場所にいても心を通わせる共有の場所」。そうイメージしてみてください。

メインフレームのコードは、時に冷たく無機質に見えますが、それは「限られたメモリを極限まで効率的に使い、数十年止まらないシステムを作る」という先人たちの知恵の結晶です。

もしコードを読んでいて「なぜこの変数はここにあるのか?」と疑問に思ったら、それはシステムの歴史を紐解くチャンスです。一つずつ丁寧に向き合えば、PL/Iは必ずあなたの頼もしい武器になってくれますよ。

また次の講義で、メインフレームの深い世界を探求しましょう。それでは、良いコーディングを!

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