日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS
ライブラリ

タイトルページ
目次
まえがき
第 1 章:移行プロセスの概要
第 2 章:移行方法の選択
第 3 章:アプリケーションの移行
第 4 章:再コンパイルと再リンクの概要
第 5 章:ページサイズの拡大に対するアプリケーションの対応
第 6 章:共用データの整合性の維持
第 7 章:アプリケーションデータ宣言の移植性の確認
第 8 章:アプリケーション内の条件処理コードの確認
第 9 章:OpenVMS I64コンパイラ
付録 A :アプリケーション評価チェックリスト
用語集
索引
PDF
OpenVMS ホーム

OpenVMS
OpenVMS VAX から OpenVMS I64 への
アプリケーションの移行


目次 索引



VAX BASIC では, DCL コマンド行で追加演算子 (+) で指定したソース・ファイルには,ファイルに行番号が含まれている必要があります。行番号が含まれていないと,エラー・メッセージが表示されます。

HPE BASIC では,ソース・ファイル中に行番号が含まれている必要はありません。追加演算子は OpenVMS の追加演算子として扱われます。ソース・ファイルは単一のソース・ファイルであるかのように追加されてコンパイルされます。

HPE BASIC では,制御が到達しないコードを検索する際に広範囲にわたる分析が行われるため, VAX BASIC よりも報告されるエラーの数が多くなります。

HPE BASIC では,制御が到達しないコードに関するコンパイル時のエラー・メッセージ UNREACH は,情報メッセージです。 VAX BASIC では,制御が到達しないコードに関するコンパイル時のエラー・メッセージ INACOFOL は警告です。

HPE BASIC では,参照されない DEF 関数をチェックし,情報メッセージ "UNCALLED, routine xxxx can never be called." が表示されます。

HPE BASIC では,VAX BASIC と異なり,重複した行番号や昇順に並んでいない行番号は許可されません。この制限は,単一のソース・ファイルと, DCL コマンド行で "+" で連結されたソース・ファイルに適用されます。重複した行番号や昇順に並んでいない行番号があると, E レベルのコンパイル・エラーが発生します。

HPE BASIC では,この相違点に対処するための TPU コマンド・プロシージャの例が提供されています。このプロシージャを使用すると,ソース・ファイルを追加したり, 1 つ以上のソース・ファイルに対して BASIC 行番号を昇順にソートすることができます。

HPE BASIC をインストールすると,TPU コマンド・プロシージャが SYS$COMMON:[SYSHLP.EXAMPLES.BASIC]BASIC$ENV.TPU に格納されます。使用方法はファイル中に記載されています。 TPU コマンド・プロシージャで判明している問題はありませんが,完全なテストは行われていないため,弊社によるサポートは提供されません。

最高の性能を得るため,HPE BASIC コンパイラは算術演算命令の順序を変更します。その結果,エラー処理セマンティックが VAX BASIC と互換性がなくなる場合がまれにありますが,ほとんどのプログラムではこの変更による影響はありません。

VAX BASIC と完全に同じ動作が必要なプログラムでは, HPE BASIC の修飾子 /SYNCHRONOUS_EXCEPTIONS を使用してください。

HPE BASIC では,単一のソース・プログラム内のすべてのルーチン (SUB,FUNCTION,メイン・プログラム) は,デフォルトでオブジェクト・ファイル内の単一のモジュールとしてコンパイルされます。 VAX BASIC では,各ルーチンは個別のモジュールとして生成されます。 VAX BASIC と同じ動作をさせるには, HPE BASIC の /SEPARATE_COMPILATION 修飾子を使用してください。

DEF の外にある,対象が指定されていない RESUME 文は, DEF 文内でプログラムの実行を再開することができないという文書化された制限があります。 VAX BASIC ではこの制限は強制されませんが, HPE BASIC では実行時にこの制限が強制されます。

HPE BASIC コンパイラは,式の結果が使用されないと判断すると,その式を評価するためのコードを生成しません。これにより,削除された式で例外が発生する場合は,VAX BASIC との互換性がなくなります。次のプログラム例を VAX BASIC で実行すると,ゼロによる除算エラーが発生します。 HPE BASIC は変数 A が使用されないことを認識するため, A に代入される式を評価するためのコードが生成されず,エラーは発生しません。


B = 5 
A = B / 0 
END 



HPE BASIC と VAX BASIC のコンパイラ・メッセージの出力方法には若干の違いがあります。 VAX BASIC では,ソース情報はメッセージ文の前に出力され,ソースとソース行番号がどちらも出力されます。 HPE BASIC ではソース情報はメッセージ文の後に出力され,ソース行番号だけが出力されます。

HPE BASIC コンパイラがソース行情報を報告する際のメッセージは,次のようになります。


%BASIC-E-xxxxxxxxx, xxxxxxxxxxxxxx at line number YY in file xxxxxxxxxxxxxx 

HPE BASIC でも VAX BASIC でも,報告される行番号はファイル中の物理的なソース行の番号です。ソース・プログラム内に現れる BASIC 行番号ではありません。

エラーが発生すると,HPE BASIC コンパイラと VAX BASIC コンパイラは,場合によって異なる状態を DCL に返します。たとえば,DCL コマンド行で指定されたファイルが見つからない場合, HPE BASIC は BASIC-F-ABORT を返しますが,VAX BASIC は BASIC-F-OPENIN を返します。

DCL コマンド行の入力ファイル指定で SYS$INPUT を指定した場合,オブジェクト・ファイルとリスト・ファイルの名前は, HPE BASIC と VAX BASIC で異なります。 HPE BASIC では,ファイルの名前は,ファイル・タイプ .OBJ および .LIS だけになります (区切り文字の前にファイル名がない)。 VAX BASIC では,NONAME.OBJ および NONAME.LIS になります。

VAX BASIC コンパイラでは, FSS$ 関数を使用したプログラムをコンパイルすることができますが,実行時に FSS$ 関数が起動されると,次の実行時エラーが表示されます。


%BAS-F-NOTIMP, Not implemented 

HPE BASIC コンパイラでは,FSS$ 関数を使用していると,コンパイル時にすべての使用箇所で次のエラーが表示されます。


%BAS-E-BLTFUNNOT, built-in function not supported 



BAS$K_FAC_NO 定数は I64 システムと Alpha システムでは定義されていません。 EXTERNAL LONG CONSTANT BAS$K_FAC_NO は,すべて EXTERNAL LONG CONSTANT BAS$_FACILITY で置き換える必要があります。 OpenVMS VAX システムでは,定数 BAS$K_FAC_NO を使用して, SYS$LIBRARY:BASRTL.EXE と SYS$LIBRARY:BASRTL2.EXE の間で機能番号をやり取りします。この番号は I64 システムと Alpha システムでは必要ありません。

HPE BASIC と VAX BASIC では,いくつかの算術関数で結果が異なります。これは,元となる I64 と Alpha のシステム・ルーチンが,改良されたアルゴリズムを使用してこれらの演算を行うためです。

VAX システムで正常に実行できるプログラムの中には, Alpha システムと I64 システムではゼロによる除算などの浮動小数点エラーで異常終了するものがあります。エラーになったプログラムに汚れた浮動小数点ゼロがないか調べてください。「汚れた浮動小数点ゼロ」とは,指数部がゼロで仮数部がゼロでない数です。ほとんどの OpenVMS VAX システム命令は,不正な浮動小数点数をゼロとして扱いますが, I64 および Alpha の命令の中には,例外が発生するものがあります。

BASIC の算術演算式を使用して汚れたゼロを作ることはできませんが,ファイルから読み取ることで作ることができます。 GET や MOVE FROM などの BASIC の入出力文は,データが変数に対して有効かどうかをチェックせずにデータの各バイトを変数に格納します。

以下のいずれかの方法で問題に対処してください。

  • 汚れたゼロがどのようにして作成されたかを調べて対処します。これが推奨される方法です。

  • 汚れたゼロの値を受け取り,浮動小数点数を正常な値にするルーチンを作成します。

次の例は,単精度浮動小数点数を正常な値にするルーチンの例です (倍精度や G 浮動小数点についても同様のルーチンを作成できます)。


SUB clean_single (SINGLE a) 
MAP (over) SINGLE b 
MAP (over) WORD w1, w2 
b = a 
IF (w1 AND 32640%) = 0% THEN 
   a = 0 
END IF 
END SUB 

このルーチンは浮動小数点数を受け取り,指数部がゼロかチェックして,仮数部をクリアします。正しいビットがテストされるように,浮動小数点数を整数として再定義します。

浮動小数点形式と汚れたゼロについての詳細は,『Alpha Architecture Reference Manual』を参照してください。

HPE BASIC と VAX BASIC の間には,不正な MAT 演算に関して,以下の 2 つの違いがあります。

  • マトリックスの乗算を行う際に,演算対象のマトリックスのどちらかが代入先のマトリックスと同じ場合は, HPE BASIC では正しく ILLOPE (Error 141 - "Illegal operation") が報告されます。 VAX BASIC では,次のマトリックス乗算を行おうとしてもこの問題が正しく検出されず, ILLOPE メッセージが報告されません。ここで,B は仮想配列であり,A は仮想配列またはインメモリ配列です。


    MAT B = A * B 
    

  • VAX BASIC では,ある条件の下で,MAT 演算で使用する配列の下限がゼロでなければならないという,文書化された制限が強制されません。 HPE BASIC では,下限がゼロでない配列に対して MAT 演算を実行しようとすると,コンパイル時に LOWNOTZER エラーとなるか,実行時に MATDIMERR エラーが報告されます。



VAX BASIC と HPE BASIC には,デバッグの相違点があります。特に,例外ハンドラ,DEF 関数,外部サブプログラム,GOSUB ルーチンの近辺でデバッガの STEP コマンドを使用した場合の動作が異なります。これらの相違点についてここで説明しますが, HPE BASIC for OpenVMS Systems User Manualも参照してください。

エラーのあるソース・コードでデバッガの STEP コマンドを使用すると, OpenVMS VAX と OpenVMS BASIC/Alpha の間で,デバッガの動作が異なります。これらの違いは,2 つのシステムのハードウェアとソフトウェアのアーキテクチャの違いによるものです。

HPE BASIC では,例外となる文に対して STEP コマンドを実行すると,デバッガに制御が戻らなくなります。デバッガは,例外が発生した後で BASIC ソース・コード中のどの文を実行すべきか判断することができません。そのため,例外が発生する文に対して STEP コマンドを使用する場合は,明示的なブレークを設定してください。

エラーを処理するプログラムをデバッグするために STEP コマンドを使用する際には,以下のヒントを参考にしてください。

  • エラーを捕捉する文で STEP コマンドを使用すると,プログラムが明示的なブレークポイント,またはエラーが発生しなかった場合に実行される次の文に到達しないかぎり,デバッガに制御が戻りません。プログラムを他の場所で停止させたい場合は,明示的なブレークを設定します。

  • エラーを捕捉する文で STEP コマンドを使用すると,プログラムがエラー・ハンドラ・コードに到達したときに,デバッガに制御が戻りません。プログラムの実行がエラー・ハンドラに渡った時点でプログラムをブレークさせたい場合は,エラー・ハンドラに明示的にブレークポイントを設定します。これは,ON ERROR ハンドラと WHEN ハンドラの両方に当てはまります。

  • WHEN ハンドラの中では, WHEN ハンドラ内で実行を停止する文 (CONTINUE,RETRY,END WHEN, END HANDLER,EXIT HANDLER) で STEP コマンドを実行しても,明示的なブレークポイントが設定されている箇所にプログラム・フローが達するまで,実行は停止しません。

  • ON ERROR ハンドラ内の RESUME ステートメントで STEP コマンドを実行すると,エラー・ハンドラでないコードの最初の行でプログラムの実行が停止します。

  • 予期しないエラーが発生するのを防ぐために,デバッグ・セッションの始めで SET BREAK/EXCEPTION を実行します。すべてのエラー・ハンドラで明示的なブレークポイントを設定してある場合は,このブレークポイントは必要ありません。しかし,このコマンドを使用することで,すべての例外でブレークし,例外の後にプログラムの実行を停止させるための適切なブレークポイントを設定してあるかどうかを確認することができます。



以下に HPE BASIC と VAX BASIC のリスト・ファイルの相違点を示します。

  • /MACHINE/LIST---VAX BASIC では,BASIC/MACHINE を指定すると,マシン言語リストが含まれ,ソース・コード・リストが含まれないリスト・ファイルが出力されます。 HPE BASIC では,BASIC/MACHINE を指定してもリストは出力されません。リスト・ファイルを出力するには,/LIST を指定しなければなりません。 HPE BASIC では,/MACHINE/LIST を指定すると,マシン言語とソース・コードがリスト・ファイルに出力されます。
    VAX BASIC では,1 つ以上のルーチンがあるプログラムのリスト・ファイルを作成する際,そのルーチンのソース・コードの後に各ルーチンの機械語コードが出力されます。 HPE BASIC コンパイラで生成されるリスト・ファイルでは, /SEPARATE_COMPILATION 修飾子を指定しないかぎり,全ルーチンのソース・リストの後にすべてのルーチンの機械語コードのリストが出力されます。

  • %PAGE---HPE BASIC では,改ページ後に %PAGE 指示文が出力されます。 VAX BASIC では,%PAGE 指示文は改ページ前に出力されます。

  • %TITLE 文字列と %SBTTL 文字列---これらの文字列は,HPE BASIC では 31文字, VAX BASIC では 45 文字に切り捨てられます。

  • 用紙送り---VAX BASIC では用紙送りが %PAGE 指示文として扱われます。 HPE BASIC では,用紙送りで特別な処理は実行されません。ソース・ファイル中に用紙送りがあると,リスト・ファイル中にもその用紙送りが出力されますが,それに対するリスト・ヘッダ情報は出力されません。

  • /SHOW=MAP 修飾子---/SHOW=MAP 修飾子を指定した場合, I64 BASIC/Alpha BASIC では以下の違いがあります。

    • HPE BASIC では,割り当てマップ中の,値が該当しないか,リスト・フェーズで分からないオフセット・フィールドは空白のままになります。

    • 配列の動的なマップで,VAX BASIC では配列指示子のサイズが報告されますが, HPE BASIC では配列のサイズが報告されます。

  • メッセージの配置---リスト・ファイル中のエラー・メッセージの配置は, VAX BASIC と HPE BASIC で異なります。たとえば,HPE BASIC では,「制御が到達しないコード」や「呼び出されないルーチン」などのフロー分析が必要なエラーは,ソース・コード・リストと割り当てマップ・リストの後に出力されます。複数のルーチンが含まれているソース・ファイルのリストでは, /SEPARATE_COMPILATION 修飾子が指定されていないかぎり,これらのエラーは,コンパイル対象のすべてのルーチンのソース・リストと割り当てリストの後に出力されます。



9.2.4 共通言語環境の相違点

ここでは,共通言語環境内の HPE BASIC,VAX BASIC,およびその他の言語の相違点について説明します。

次の表に示すように,HPE BASIC での PSECT 属性は VAX BASIC と異なります。

HPE BASIC VAX BASIC
NOPIC PIC
NOSHR SHR
OCTAWORD アラインメント LONG アラインメント

HPE BASIC では,COMMON 文と MAP 文が作成する PSECT の長さは, 16 の倍数に切り上げられます。 COMMON や MAP のサイズは変わらず,PSECT のサイズが変わります。この変化が影響するのは,複数言語環境内の共有イメージを使用しているアプリケーションだけです。

HPE BASIC も VAX BASIC も,同じプラットフォーム上の他の言語と互換性がある PSECT を作成します (MACRO を除く)。 MACRO 以外の言語で作成されたモジュールと,コードを変更せずにリンクすることができます。これらの PSECT を参照する MACRO モジュールに対してリンクする場合は, MACRO コードに対して該当する変更を行う必要があります。

他のほとんどの HPE 言語では,デフォルトの 64 ビット浮動小数点データ型は, OpenVMS VAX システムの D 浮動小数点から, OpenVMS Alpha システムでは G 浮動小数点に, OpenVMS BASIC システムでは T 浮動小数点に変更されました。 BASIC と,この変更が行われている他の言語との間で, BASIC DOUBLE (OpenVMS D 浮動小数点) をやり取りする場合は,以下のいずれかを実行する必要があります。

  • 他の言語のコンパイラのコマンド行で,64 ビットの浮動小数点データ型を, D 浮動小数点に変更して Alpha BASIC の動作に合わせるか, T 浮動小数点に変更して I64 BASIC の動作に合わせます。

  • BASIC プログラムで,64 ビット浮動小数点データのデータ型を DOUBLE から GFLOAT または TFLOAT に変更し,他の言語に合わせます。



9.3 HPE C と VAX C の互換性

VAX C はもともとVAX/VMS システムで提供されていた C コンパイラです。 VAX C はその後 DEC C で置き換えられています。 DEC C は Compaq C に名称が変更され,さらに最近その名称が HPE C に変更されています。 VAX C で作成されたプログラムがある場合,まず OpenVMS VAX 上の HPE C へのポーティングを行うことをお勧めします。詳細については,『Compaq C Migration Guide for OpenVMS VAX Systems』を参照してください。このマニュアルは以下の URL で公開されています。


http://h41379.www4.hpe.com/commercial/c/docs/        

ご使用のアプリケーションが HPE C で作成されている場合,もしくは VAX C から HPE C へのポーティングが完了している場合, OpenVMS I64 用にポーティングする際にさらにいくつかの問題が発生することがあります。しかしこれらの問題は,どのプログラミング言語でも共通に発生する浮動小数点,ページ・サイズ,粒度,アライメント,アトミシティなどの問題です。この種の問題については本書の他の箇所で説明しています。


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項