Visual COBOL には、次のメインフレーム機能をエミュレートする機能があります。
Visual COBOL では、COBOL プログラム内のメインフレームスタイルのポインターとの互換性を次のように実現しています。
次のプログラムモジュールには AMODE 指令が必要です。
SETpointer-item TO ADDRESS OF data-item
SET ADDRESS OFlinkage-item TO pointer-item
Visual COBOL では、DATA コンパイラ指令の使用と設定も行えます。このコンパイラ指令は、AMODE コンパイラ指令を使用してコンパイルしたプログラムのデータ部の配置を制御します。
次の表に、COBOL のいくつかの方言に必要な AMODE 指令と DATA 指令の設定を示します。
COBOL 方言 | 指令 |
---|---|
COBOL 370 | AMODE(31) DATA(31) |
VS COBOL II (全リリース) | AMODE(31) DATA(31) |
OS/VS COBOL | AMODE(24) |
使用している方言に応じてこれらの指令を正しく設定する必要があります。
メインフレームでは、COBOL プログラムはサブプログラムがキャンセルされた場合でも、サブプログラム内のデータ部内に定義されたデータを継続して使用することができます。この機能は Server Express でエミュレートされていますが、その使用はお奨めしません。
この機能は、mfpm_access_cancelled_data チューナーを使用すると使用可能にできます。
サブプログラムをキャンセルする前に、呼び出し元のプログラム内のポインター変数に、サブプログラム内で継続して使用するデータのアドレスを設定します。サブプログラムをキャンセルした後、Server Express がキャンセルされたサブプログラムの作業場所節を解放するまで、そのデータは継続して使用できます。この作業場所節の解放は、以下の場合に行われます。
解放された作業場所節を指し示しているポインター変数を使用した場合の結果は予測できません。
Entry Point Mapping 機能を使用すると、COBOL プログラム内のエントリポイントを指定できます。これにより、アプリケーションは実行時にこのエントリポイントを検索できます。エントリポイントが呼び出される前に、まだロードされていないプログラム内のエントリポイントを指定する必要があります。
Entry Point Mapping の機能を使いこなすには、エントリポイントの呼び出しが通常どのようにランタイム システムによって解決されるのかを理解する必要があります。
プログラムの静的リンクで解決されていないエントリポイントをプログラムで呼び出すと、ランタイム システムは、動的に解決するためにそのエントリポイントを検索します。
プログラムがロードされると、プログラムの名前とプログラム内のすべてのエントリポイントがテーブルに記録されます。エントリポイントへの呼び出しが実行されると、ランタイム システムはテーブルを調べてエントリポイント名を検索します。エントリポイント名が見つからない場合には、同一名の実行可能ファイルをディスク上で検索します。見つからない場合には、エラーが返されます。
結果として、プログラムが実行可能ファイルの名前と異なるエントリポイント、または先にロードされたプログラム内のエントリポイントと異なるエントリポイントを呼び出すと、ランタイム システムはエントリポイントを見つけることができないため、プログラムが失敗します。このような場合にのみ、Entry Point Mapper を使用する必要があります。
この問題は、開発を進めるためにメインフレームから PC にダウンロードしたプログラムコードを使用する際に頻繁に発生します。メインフレームプログラムでは、しばしば単一プログラム内に複数のエントリポイントがあります。メインフレームの場合、エントリポイントはリンクによって解決されます。このため、プログラムへの呼び出しを行い、プログラムが呼び出されているかどうかに関係なくエントリポイントを検索することができます。
Server Express を使用すると、エントリポイントを含むプログラムがまだ呼び出されていない場合には、そのエントリポイントへの呼び出しが失敗します。
この問題を回避するには、エントリポイントテーブルを含むエントリ名マップファイルを作成し、そのマップファイルをランタイム システムで使用できるようにする必要があります。
マップファイルはテキストエディタを使用して作成します。各エントリポイントごとに、次の 3 行を入力する必要があります。
[ENTRY-POINT] entry-point-name [PROGRAM-NAME] main-program-name [SUBPROGRAM-NAME] subprogram-containing-entry-point
主プログラム A とサブプログラム C の実行単位を見てみます。この実行単位では、主プログラム A はサブプログラム C 内のエントリポイント B を呼び出します。エントリ名マップファイル内のテーブルエントリは次のとおりです。
[ENTRY-POINT] B [PROGRAM-NAME] A [SUBPROGRAM-NAME] C
注:
entry_name_mapper チューナーを使用して、エントリ名マッピングを使用することをランタイム システムに指示します。entry_name_mapper を設定した場合、ランタイム システムによるエントリ名マップファイルの検索方法は、ENTRYNAMEMAP 環境変数が設定されているかどうかによって異なります。
どちらの場合でも、ランタイム システムがエントリ名マップファイルを複数見つける場合があります。つまり、同じエントリポイントを異なるファイル内で個別に定義することができます。複数のエントリが見つかった場合、エントリ名マップファイル内で最初に見つかった定義が優先されます。ランタイム システムがエントリ名マップファイルを検索する順序を変更するには、COBDIR 環境変数または ENTRYNAMEMAP 環境変数のパス内でのファイルの順番を変更する必要があります。
別名を作成するには、Entry Point Mapper を使用して IBM メインフレームリンケージエディタの別名機能をエミュレートします。この別名機能では、システムが別名を使用してプログラムを実行するようにします。別名を作成するには、テキストエディタを使用してエントリ名マップファイルを編集します。
実行時、Visual COBOL は最初に元の名前のプログラムを探します。元の名前のプログラムが見つかると、Entry Point Mapper は起動されません。
[ENTRY-POINT] 行に別名を、[SUB-PROGRAM] 行に実際のプログラム名を入力します。
主プログラム progroot の実行を見てみます。この実行単位では、progroot は名前 pacct001 を使用して呼び出しを行います。必要なサブプログラムの実際の名前は tacct001 です。mfentmap.dat ファイル内のテーブルエントリは次のとおりです。
[ENTRY-POINT] pacct001 [PROGRAM-NAME] progroot [SUBPROGRAM-NAME] tacct001
原始プログラムに指定された名前とは異なる名前を使用してプログラムをロードする場合を見てみます。たとえば、プログラムの実際の名前が myprog で、JCL に myprogx をロードする命令があるとします。メインフレームの場合、プログラムをリンクして、必要な名前を指定することでプログラムをロードすることができます。ただし、Server Express では COBOL プログラムをリンクできないため、Entry Point Mapper を使用して、プログラムをロードするための名前と実際のプログラム名を関連付けます。
たとえば、プログラム名が myprog で、myprogx という名前でプログラムをロードする場合を見てみます。mfentmap.dat ファイル内には次のテーブルエントリが必要です。
[ENTRY-POINT] myprogx [PROGRAM-NAME] * [SUBPROGRAM-NAME] myprog
ここで、 [ENTRY-POINT] は別名を定義し、[SUBPROGRAM-NAME] は実行可能なプログラムの名前です。
Storage Management Subsystem (SMS; 記憶域管理サブシステム) データクラスはデータセット属性 (レコード長やレコード形式など) のテンプレートであり、データセットを新規に作成する際に使用されます。Server Express では、エンタープライズサーバーで実行するアプリケーションで SMS データクラスを使用させるようにすることができます。
データクラス定義は、Mainframe Express で作成したファイルに格納されます。Mainframe Express でデータクラス定義ファイルを作成した後、SMS サポートを使用可能にして、エンタープライズサーバーで使用するデータクラス定義ファイルを指定する必要があります。以下に手順を示します。
MFUSERCAT_LOC=definition-file
ここで、definition-file は使用するデータクラス定義ファイルの位置を示す完全修飾名です。
データクラスを定義してデータクラス定義ファイルを使用可能にした後は、次のいずれかの方法でデータクラスを参照することができます。
同じ定義ファイルを複数のエンタープライズサーバーで使用することができ、データクラス定義の一貫性が保障されます。データクラスの指定がない場合は、デフォルトのデータクラス MFEDFTDC が使用されます (存在する場合)。このデータクラスをエンタープライズサーバーで使用するためには、エンタープライズサーバーのデータクラス定義ファイルにこのデータクラスが定義されている必要があります。
SMS の詳細は、IBM BookManager Server Library で『DFSMSdfp Storage Administration Reference』を参照してください。