導入: なぜ今、EXTERNAL変数のリンク属性が重要なのか
メインフレームのシステム開発・運用に携わる皆さん、日々の業務で「プログラム間のデータ共有」に頭を悩ませることはありませんか?特に複数のプログラムが同じデータを参照・更新する場合、その管理は複雑になりがちです。ここで登場するのがEXTERNAL変数です。
EXTERNAL変数は、複数のコンパイル単位(プログラム)間でデータを共有するための強力なメカニズムを提供します。しかし、その「リンク属性」と、ロードモジュールがどのように構成され、JCLの`STEPLIB`によってどのようにロードされるかを理解していなければ、意図しないデータ不整合や、S806といったABEND(異常終了)に遭遇するリスクが高まります。
本記事では、EXTERNAL変数がどのようにロードモジュールに統合され、実行時に正しく解決されるのか、その背後にあるメカニズムを実務的な視点から解説します。この知識は、既存システムの改修から新規開発、トラブルシューティングに至るまで、あなたの業務効率を格段に向上させるでしょう。
基礎知識: EXTERNAL変数、ロードモジュール、そしてリンク属性
まずは、このテーマを理解するために不可欠な用語と仕組みから見ていきましょう。
-
EXTERNAL変数とは?
COBOLやPL/Iなどの言語において、複数のプログラム(コンパイル単位)から参照・更新されることを目的としたグローバル変数です。COBOLでは`GLOBAL`句や`EXTERNAL`句が使用され、PL/Iでは`EXTERNAL`属性が指定されます。これにより、異なるプログラムが同一のメモリ領域を共有し、データをやり取りできるようになります。 -
ロードモジュールとは?
コンパイルされた複数のオブジェクトモジュール(`.OBJ`)と、必要に応じてデータセクション、ランタイムライブラリなどがリンクエディタによって結合され、ディスク上に格納された実行可能なバイナリファイルのことです。JCLの`EXEC PGM=`で指定される実体であり、CPUが直接実行できる形式になっています。 -
リンク属性とは?
EXTERNAL変数がロードモジュール内でどのように実体化され、他のプログラムからその実体が参照されるか、という情報のことを指します。リンクエディタは、このリンク属性に基づいて、複数のオブジェクトモジュールに分散して定義されたEXTERNAL変数のうち、どれを「実体」として採用し、残りをその実体への参照に解決するかを決定します。 -
z/OSデータセット (ロードモジュールライブラリ)
ロードモジュールは、通常、PDS (Partitioned Data Set) または PDSE (Partitioned Data Set Extended) と呼ばれるタイプのデータセットにメンバーとして格納されます。JCLの`STEPLIB`や`JOBLIB`で指定されるこれらのデータセットは、実行時にオペレーティングシステムがロードモジュールを探し出すための「パス」の役割を果たします。
実装/解決策: EXTERNAL変数の「実体」を正しく解決する
EXTERNAL変数を効果的に使うには、リンクエディットのプロセスと、JCLでのライブラリ指定が肝となります。
-
リンクエディットの役割
プログラムAとプログラムBが同じEXTERNAL変数を共有する場合、これらはそれぞれ別々にコンパイルされ、オブジェクトモジュールが生成されます。リンクエディタ(z/OSではIEWLが一般的)は、これらのオブジェクトモジュールを結合し、一つのロードモジュールを作成します。この際、リンクエディタはEXTERNAL変数の名前を解決し、複数の定義が存在する場合はそのうちの一つを実体として採用します。
例えば、COBOLでは`VALUE`句で初期値を指定したEXTERNAL変数が「実体」として扱われ、他の初期値を持たない定義は参照として解決されるのが一般的です。 -
JCLでのライブラリ指定

コメント