この章では, アプリケーションを構成するソース・ファイルを再コンパイルおよび再リンクすることにより, VAXシステム上で動くアプリケーションをAlphaシステムに移行する (migrate)プロセスについて,その概要を説明します。
一般に,アプリケーションが高級プログラミング言語で作成されている場合には, わずかな作業でAlphaシステムで実行できるようになります。高級言語では, アプリケーションをマシン・アーキテクチャから分離します。さらに, Alphaシステム上のプログラミング環境のほとんどの部分は, VAXシステムのプログラミング環境と同じです。したがって, Alpha版の各言語のコンパイラとOpenVMSリンカ・ユーティリティを使用すれば, アプリケーションを構成するソース・ファイルを再コンパイルおよび再リンクでき, ネイティブなAlphaイメージを作成できます。
アプリケーションがVAX MACROで作成されている場合は,最低限の作業だけで Alphaシステム上でも実行できる可能性があります。ただし一般には, VAXのアーキテクチャに依存する何らかの要素が含まれており, それに応じた変更を加えなければなりません。
内側のモードや高い割り込み優先順位レベル(IPL)で動作する特権アプリケーションは, コード内でオペレーティング・システムの内部的な動作に関するさまざまな仮定を行っているので, 大幅な書き換えが必要になります。一般に,このようなアプリケーションは OpenVMS VAXオペレーティング・システムのメジャー・ リリースのたびに大幅な変更を加える必要が生じます。
- 注意
- 高級言語で作成されたアプリケーションであっても, アーキテクチャ固有の機能に依存することがあります。 また,新しいプラットフォームへの移行の際に, アプリケーション内の隠れたバグが表面化することもあります。
VAXシステムでサポートされる言語の多くは,Alphaシステムでもサポートされます。 たとえばFORTRANやCなどです。 Alphaシステムで共通に使用できるプログラミング言語のコンパイラについての詳しい説明は, 第11章を参照してください。
Alphaシステムで使用出来るコンパイラは,それぞれ VAXシステムの対応するコンパイラと互換性を維持するように設計されています。 各コンパイラは言語標準規格に準拠し,また, VAXの言語拡張機能の大部分をサポートします。コンパイラは, VAXシステムの場合と同じ省略時のファイル・タイプで,出力ファイルを作成します。 たとえば,オブジェクト・モジュールのファイル・タイプは.OBJです。
しかし,VAXシステムのコンパイラがサポートする一部の機能は, Alphaシステムの同じコンパイラでサポートされません。さらに, Alphaシステムのいくつかのコンパイラは, VAXシステムの対応するコンパイラがサポートしない新しい機能をサポートします。 また互換性を維持するために,一部のAlphaコンパイラは互換モードをサポートします。 たとえば,DEC C for OpenVMSAlphaシステムのコンパイラは VAX C互換モードをサポートし,このモードは /STANDARD=VAXC修飾子を指定することにより起動されます。
ソース・ファイルを正しく再コンパイルした後, アプリケーションを再リンクしてネイティブな Alphaイメージを作成しなければなりません。リンカは現在の VAXシステムと同じファイル・タイプで,出力ファイルを作成します。たとえば, 省略時の設定では,リンカはイメージ・ファイルのファイル・タイプとして .EXEを使用します。
Alphaシステムではある種のリンク作業を実行する方法が異なるため, アプリケーションを構築するために使用するLINKコマンドを変更しなければなりません。 次のリストは,アプリケーションのビルド手順に影響を与える可能性のある, これらのリンカの変更点を説明しています。詳しくは 『OpenVMS Linker Utility Manual』を参照してください。
リンカは表 4-1にある Alphaシステム固有の修飾子とオプションをサポートします。 表 4-2は,VAXシステムではサポートされ, Alphaシステムのリンカではサポートされないリンカ修飾子を示しています。
修飾子 | 説明 |
---|---|
/DEMAND_ZERO | リンカがデマンド・ゼロ・イメージ・セクションを作成する方法を制御する。 |
/DSF | OpenVMS Alphaシステムコード・デバッガで使用するために, デバッグ・シンボル・ファイル(DSF)と呼ぶファイルを作成するようにリンカに要求する。 |
/GST | 共有可能イメージに対してグローバル・シンボル・テーブル (GST)を作成することをリンカに要求する(省略時の設定)。 ランタイム・キット用に共有可能イメージを作成する場合には, /NOGSTを指定する方が一般的である。 |
/INFORMATIONALS | リンク操作で情報メッセージを出力することをリンカに要求する (省略時の設定)。/NOINFORMATIONALSを指定する方が一般的であり, その場合には情報メッセージは出力されない。 |
/NATIVE_ONLY | 作成しているイメージに,
コンパイラが作成したプロシージャ・シグネチャ・ブロック(PSB)情報を
渡さないようにリンカに要求する(省略時の設定)。
リンク中に/NONATIVE_ONLYを指定した場合には,イメージ・アクティベータは, ジャケット・ルーチンを起動するために, リンク操作に対する入力ファイルとして指定されたオブジェクト・モジュールで提供された PSB情報を使用する。ネイティブなAlphaイメージが, トランスレートされたVAXイメージと連携動作するには, ジャケット・ルーチンが必要である。 |
/REPLACE | コンパイラによって要求された場合, 作成中のイメージの性能を向上するための最適化を行うことをリンカに要求する(省略時の設定)。 |
/SECTION_BINDING | 常駐イメージとしてインストール可能な共有可能イメージを作成することをリンカに要求する。 |
/SYSEXE | リンク操作で解釈されなかったシンボルを解釈するために OpenVMSエグゼクティブ・イメージ(SYS$BASE_IMAGE.EXE) を処理することをリンカに要求する。 |
オプション | 説明 |
SYMBOL_TABLE=オプション | 共有可能イメージに関連するシンボル・テーブル・ファイルにユニバーサル・シンボルだけでなく, グローバル・シンボルも登録することをリンカに要求する。省略時の設定では, リンカはユニバーサル・シンボルだけを登録する。 |
SYMBOL_VECTOR=オプション | Alpha共有可能イメージでユニバーサル・シンボルを宣言するために使用する。 |
オプション | 説明 |
---|---|
BASE=オプション | リンカがイメージを割り当てるベース・アドレス(先頭アドレス)を指定する。 |
DZRO_MIN=オプション | リンカがイメージ・セクションからページを取り出し, それを新たに作成したデマンド・ゼロ・イメージ・セクションに配置する前に,リンカがイメージ・ セクションで検出しなければならない連続した初期化されていないページの最小数を指定する。 デマンド・ゼロ・イメージ・セクション(初期化されたデータを含まないイメージ・セクション) を作成すると,リンカはイメージのサイズを小さくできる。 |
ISD_MAX=オプション | イメージ内で認められるイメージ・セクションの最大数を指定する。 |
UNIVERSAL=オプション | 共用可能イメージ内のシンボルをユニバーサルとして宣言し, リンカがそのシンボルを共用可能イメージのグローバル・シンボル・テーブルに登録するようにする。 |
OpenVMS Mathematics (MTH$)ランタイム・ライブラリに対して標準的な VMS呼び出しインターフェイスを使用する算術演算アプリケーションを, Alphaシステムに移行するときには,MTH$ルーチンの呼び出しを変更する必要はありません。 これは,MTH$ルーチンをDigital Portable Mathematics Library (DPML) for Alphaシステムの対応する math$に変換するためのジャケット・ルーチンが準備されているからです。しかし, JSBエントリ・ポイントとベクタ・ルーチンに対して実行される呼び出しは, DPMLでサポートされません。DPMLルーチンはOpenVMS MTH$ RTLのルーチンと異なっており, 算術演算の結果の精度にわずかな違いが発生する可能性があります。
将来のライブラリとの互換性を維持し, 移植可能な算術演算アプリケーションを開発するには, この呼び出しインターフェイスを使用するのではなく,選択した高級言語 (たとえばDEC CやDEC FORTRANなど)を通じて提供される DPMLルーチンを使用することが適切です。DPMLルーチンを使用すれば, 性能と精度も大幅に向上できます。
DPMLルーチンについての詳しい説明は, 『Digital Portable Mathematics Library』を参照してください。
アプリケーションがVAXシステムで実行されているのか, Alphaシステムで実行されているのかを, アプリケーションで判断しなければならないことがあります。プログラムの内部から $GETSYIシステム・サービス(またはLIB$GETSYI RTLルーチン)を呼び出し, ARCH_TYPEアイテム・コードを指定すれば,この情報を入手できます。 アプリケーションがVAXシステムで実行されている場合には, $GETSYIシステム・サービスは1という値を戻します。アプリケーションが Alphaシステムで実行されている場合には,$GETSYIシステム・サービスは 2という値を戻します。
例 4-1は,F$GETSYI DCLコマンドを呼び出し, ARCH_TYPEアイテム・コードを指定することにより, DCLコマンド・プロシージャでホスト・アーキテクチャを判断する方法を示しています (アプリケーションで$GETSYIシステム・サービスを呼び出す例については, 第5.4節を参照してください。その例では, Alphaシステムのページ・サイズを入手するためにシステム・サービスが使用されています)。
$! Determine architecture type $ type_symbol = f$getsyi("arch_type") $ if type_symbol .eq. 1 then goto ON_VAX $ if type_symbol .eq. 2 then goto ON_ALPHA $ ON_VAX: $ ! $ ! Do VAX-specific processing $ ! $ exit $ ON_ALPHA: $ ! $ ! Do Alpha-specific processing $ ! $ exitしかし,ARCH_TYPEアイテム・コードは,バージョン 5.5またはそれ以降のバージョンを実行しているVAXシステムだけでしか使用できません。 アプリケーションが,これ以前のバージョンのオペレーティング・システムでホスト・ アーキテクチャを判断しなければならない場合には, 表 4-3に示した $GETSYIシステム・サービスの他のアイテム・コードを使用しなければなりません。
キーワード | 使用方法 |
---|---|
ARCH_TYPE | VAXシステムでは1を戻す。 Alphaシステムでは2を戻す。Alphaシステムと,OpenVMSバージョン 5.5またはそれ以降のバージョンのVAXシステムでサポートされる。 |
ARCH_NAME | VAXマシンでは "VAX"というテキスト文字列を戻し,Alphaマシンでは "Alpha"というテキスト文字列を戻す。Alphaシステムと, OpenVMSバージョン5.5またはそれ以降のバージョンを実行している VAXシステムでサポートされる。 |
HW_MODEL | ハードウェア・モデルを識別する整数を戻す。 1024以上のすべての値はAlphaシステムを示す。 |
CPU | 特定のCPUを識別する整数を戻す。 128という値は,システムを"VAXでない"として識別する。このコードは ARCH_TYPEおよびARCH_NAMEコード以前のOpenVMSのバージョンでサポートされる。 |