モジュール

PACKAGE 文を省略すると、次のコード サンプルに示すように、1 つの Open PL/I ソース ファイルに 1 つ以上の外部プロシージャを含めることができます。

PKG: PACKAGE EXPORTS (SUB1 EXTERNAL(‘PLB’));
   SUB1: PROC;  /* will be external, callable as “PLB”) */
       CALL SUB2();
   END SUB1;

   SUB2: PROC;  /* will be internal, not exported */
       PUT SKIP LIST (‘PACKAGE NAME = ‘, PACKAGENAME());
   END SUB2;

END PKG;

1 つのソース ファイルに含まれる外部プロシージャは、すべて同じオブジェクト ファイルにコンパイルされます。

モジュールは、オブジェクト コードにコンパイルされるソース ファイルとなる 1 つのコンパイル単位として定義されます。モジュールは 1 つ以上の外部プロシージャで構成されます。

ソース ファイルでは、対象の変数がいずれも BASED、STATIC、または DEFINED であれば、それらの宣言をすべての外部プロシージャの範囲外に記述することができます。この方法で定義された変数は、すべての外部プロシージャの範囲内であると見なされます。宣言で EXTERNAL 属性を指定した場合は、ソース ファイルの外部であると見なされます。

ソース ファイルでは、最初の外部プロシージャの前に、%REPLACE 文および名前付き定数 (ファイル定数や入り口定数など) の宣言を記述することもできます。

次の例は、最初の外部プロシージャの前に宣言および %REPLACE 文を含むソース ファイルを示しています。このソース ファイルには、プログラムの一部として使用できる 2 つのプロシージャ (GETREC および PUTREC) が含まれています。Open PL/I では、これらの入り口定数 GETREC および PUTREC はデフォルトで EXTERNAL 属性として宣言されます。したがって、このソース ファイルの外部の別のモジュールに含まれるプロシージャから GETREC または PUTREC を呼び出すことができます。GETREC および PUTREC を別のモジュールのプロシージャで参照する必要がある場合は、そのモジュール内で属性 ENTRY および EXTERNAL を使用して宣言する必要があります。

このソース ファイルの先頭にある他の項目 (REC、NAME、ADDRESS) は、他のモジュールでコンパイルされたプロシージャからは認識されず、GETREC および PUTREC にのみ認識されます。Open PL/I では、ファイル定数はデフォルトで EXTERNAL 属性として宣言されるため、ファイル DATA_BASE は他のモジュールからも参照できます。

%REPLACE DATA_SIZE BY 80;
DECLARE 1 REC BASED
            2 NAME CHAR(40),
            2 ADDRESS CHAR(DATA_SIZE); 
DECLARE DATA_BASE KEYED FILE UPDATE;

GETREC: PROCEDURE(P);
DECLARE P POINTER;
READ FILE(DATA_BASE) INTO(P->REC); 
END GETREC;

PUTREC: PROCEDURE(P); 
   DECLARE P POINTER; 
    REWRITE FILE(DATA_BASE) FROM(P->REC);
END PUTREC;