この章では、64 ビットプログラムの開発方法について説明します。64 ビットプログラムは 2 通りの方法で開発できます。つまり、最初から 64 ビット環境で開発する方法と、既存の 32 ビットプログラムから変換する方法です。
Server Express は、32 ビット版と 64 ビット版の開発システムおよび Application Server を備えており、64 ビットプログラムを新しく開発したり、既存の 32 ビットプログラムを 64 ビット版に変換したりすることができます。
64 ビット COBOL プログラムは 32 ビット単位のサイズに制限されますが、ポインタは 64 ビットです。つまり、データ部のサイズやオフセット、手続き部などの COBOL 要素はすべて 32 ビット単位ですが、これらの要素を 64 ビットのポインタで参照できます。
Server Express は、32 ビットと 64 ビットの 2 種類のモードで動作します。64 ビットモードでは、64 ビットプログラムに対応した開発環境とツールが使用できます。
基本的に Server Express 1.x で開発したプログラムは、P64 コンパイラ指令を指定して再コンパイルするのみで、64 ビットプログラムとして問題なく動作するはずです。ただし、プログラムで次の要素を使用している場合には、複雑な作業が必要になることがあります。
P64 コンパイラ指令を使用すると、64 ビット開発システム (64 ビットモードの Server Express 2.0 など) や 64 ビットモードの Application Server 2.0 上で動作するプログラムを作成できます。この指令を指定せずにコンパイルしたプログラムは、32 ビット開発システム (Server Express 1.x、Net Express、および 32 ビットモードの Server Express など) や Application Server 1.0、32 ビットモードの Application Server 2.0 で動作する 32 ビットプログラムになります。そのため、32 ビット開発システムで作成したアプリケーションを Server Express の 64 ビット 開発システムで使用するには、P64 指令を使用して再コンパイルする必要があります。
cob64 コマンドでコンパイルする場合や、64 ビットモードで cob コマンドを使用する場合には、P64 指令がデフォルトで設定されます。Server Express 2.0 の動作モードについては、『Server Express ユーザガイド』の『32 ビットおよび 64 ビットモードでの作業』を参照してください。
P64 コンパイラ指令を指定してコンパイルしたプログラムと、この指令を指定せずにコンパイルしたプログラムでは、POINTER 型のサイズが異なります (64 ビットプログラムと 32 ビットプログラムについては、この章の以降の項で詳しく説明しています)。
プログラム内で POINTER 型のデータ項目が正しく扱われているかをチェックするには、Scan64 ユーティリティが役立ちます。Scan64 ユーティリティについては、『Utilities Handbook』の『Scan64』の章で詳しく説明しています。
アプリケーションの開発と 64 ビット版への移行を円滑に行うために、 $IF 文の機能が拡張され、プログラムのコンパイル時に設定されているコンパイラ指令をチェックできるようになりました。特に $IF...SET 文を使用して、P64 コンパイラ指令が設定されているかを確認できます。$IF ... SET 文の詳細については、『言語リファレンス』を参照してください。
Server Express 2.0 の COBOL ライブラリルーチンにはプロトタイプが追加されており、ライブラリルーチンが 64 ビット環境で正しく動作しているかを確認するうえで役立ちます。プロトタイプは、ライブラリルーチンにパラメータが正しいデータ型で渡されるようにするための標準的な確認方法です。ライブラリルーチンのプロトタイプの内容については、『ライブラリルーチン』の『ライブラリルーチン用の TYPEDEF と CALL プロトタイプ』を参照してください。
32 ビット開発システムと 64 ビット開発システム間では、実行可能コードの互換性はありません。
64 ビット開発システムで作成した中間コードは、INTLEVEL"5" 指令で指定されたコードレベルに対応していない 64 ビットシステムでは実行できません。INTLEVEL"5" のコードレベルに対応した 32 ビット開発システムでは、プログラムが 64 ビット用かがチェックされ、64 ビット用でないプログラムのみが実行またはコンパイルされます。
ファイル制御記述 (FCD) とは、使用中のファイルに関する情報を記述したデータ領域のことです。FCD の詳細については、『ファイル操作』の『ファイルハンドラ API』に記載されている『ファイル制御記述 (FCD)』を参照してください。
プログラムのコード内に直接記述できる FCD には、FCD 2 と FCD 3 という 2 種類の形式があります (FCD 1 は廃要素であり、アプリケーションに使用すべきではありません)。これらの FCD は、以下の開発システムでサポートされています。
開発システム
|
FCD の形式
|
|
---|---|---|
FCD 3
|
FCD 2
|
|
Server Express 2.0 以降 (64 ビットモード) | ○ | × |
Server Express 2.0 以降 (32 ビットモード) | ○ | ○ |
Server Express 1.1 (32 ビット) | × | ○ |
Server Express 1.0 (32 ビット) | × | ○ |
Net Express 3.0 以降 (旧バージョンも含む) | × | ○ |
OCDS | × | ○ |
64 ビットモードの Server Express は FCD 2 に対応していません。そのため、アプリケーションを 64 ビット版に変換する際には、次のような影響を及ぼします。
CALL program
USING filename
で組み込む) にかかわらず、64 ビット版への変換前に FCD 3 形式に書き直す必要があります。32 ビット開発システムのすべてのコンポーネントは FCD 2 と FCD 3 の両方をサポートしますが、64 ビット開発システムのコンポーネントがサポートするのは FCD 3 形式のみです。ポインタのサイズが異なるため、 64 ビットのコンポーネントは FCD 2 形式をサポートしません。ただし、32 ビットシステムのコンポーネントと、64 ビットシステムの対応するコンポーネントのソースコードは共通です。つまり、1 つのソースコードを P64 指令を指定してコンパイルしたものが FCD 3 をサポートする 64 ビットシステムのコンポーネントであり、NOP64 指令を指定してコンパイルしたものが FCD 2 と FCD 3 の両方をサポートする 32 ビットシステムのコンポーネントです。アプリケーションの開発でも、このようにソースコードを統一すると、作業の効率化を図ることができます。
Server Express は FCD 2 と FCD 3 の両方に対応しているため、アプリケーションでは次のいずれかの FCD を使用できます。
アプリケーションで、 FCD 2 と FCD 3 のいずれか一方のみが使用可能な場合は、拡張された FCD 構造を扱う他の方法を用意しないでください。
ただし、アプリケーション内の一部のプログラムが他のコンポーネントへのインターフェイスを備えており、そのインターフェイスに FCD 構造が含まれる場合があります。このような場合は、 FCD3 の完全なサポートの提供が必要な場合があります。これは、プログラムが FCD 2 と FCD 3 の両方に対応し、これらの形式を適切に区別する必要があるためです。たとえば、コード内に FCD 項目への参照がほとんどない場合に適当と思われるソースコードの例は、次のとおりです。
linkage section. 01 fcd-user pic x. 01 fcd2. copy "xfhfcd2". 01 fcd3. copy "xfhfcd3". procedure division using fcd-user. set address of fcd3 to address of fcd-user if fcd-version of fcd3 = 0 *> FCD2 項目の処理... $if P64 set display "Error: cannot accept FCD2 on 64 bit platform" exit program $end set address of fcd2 to address of fcd-user end-if
FCD 項目の値を参照する箇所すべてに、次のような処理を行うコードを追加する必要があります。
if ( fcd-version of fcd3 not = 0 and fcd--line-sequential of fcd3) or ( not fcd-version of fcd3 = 0 and fcd--line-sequential of fcd2 ) *> 行順操作 end-if
コードの大部分が FCD 機能を直接参照する場合は、内部的に FCD 3 のみを使用し、必要に応じてコンポーネントの入り口と出口で FCD 2 へのマッピングを行うことも可能です。次に例を示します。
working-storage section. 78 78-fcd3-map-to-fcd3 value 0. 78 78-fcd3-map-from-fcd3 value 1. 78 78-fcd3-map-error-none value 0. 78 78-fcd3-map-error-64bit value -1. 78 78-fcd3-map-error-func value -2. 78 78-fcd3-map-error-reladdr value -3. 01 fcd3-work. copy "xfhfcd3". linkage section. 01 fcd-user pic x. procedure division using fcd-user. *> 入り口 - 必要に応じて FCD 2 を FCD 3 にマッピング call 'fcd3map' using fcd-user fcd3-work by value 78-fcd3-map-to-fcd3 size 1 if return-code not = 0 display "Error: cannot convert FCD formats" exit program end-if *> FCD 3 形式のみで FCD を処理 *> .... *> 出口 - 必要に応じて FCD 2 を FCD 3 にマッピング call 'fcd3map' using fcd-user fcd3-work by value 78-fcd3-map-from-fcd3 size 1 exit program.
Copyright © 2006 Micro Focus (IP) Ltd. All rights reserved.