![]() |
![]() |
日本-日本語 | ![]() |
|
|
|
![]() |
![]() OpenVMS マニュアル |
|
![]() |
HP OpenVMS MACRO コンパイラ
|
目次 | 索引 |
![]() | 1.5 移植性のない VAX MACRO のコーディング・スタイルの特定 | ![]() |
OpenVMS Alpha または OpenVMS I64 のオブジェクト・コードにコンパイルしようとしている VAX MACRO モジュールを調べるときには,移植性のないコーディング構造を探す必要があります。そのようなコードがモジュールにあると,そのようなコードがない場合と比較して移植に時間がかかります。コンパイラはこのようなコードの多くを検出できますが,自分で見つけることで移植作業が短縮できます。あまり頻繁に使用されず発見が難しいものも含め,移植性のない MACRO コーディング・スタイルの詳細については, 第 3 章 を参照してください。
以下の移植性のない MACRO コーディング・スタイルを探してください。
TSTL (SP)+ ; remove return address RSB ; return to caller's caller |
POPL R0 ; remove the return address SUBL #structure_size,SP ; allocate stack space for caller PUSHL R0 ; replace the return address |
または
POPL R1 ; hold return address PUSHL structure ; build structure for caller ; ; code continues ; JMP (R1) ; return to caller |
MOVAL routine_label,-(SP) RSB |
または
PUSHAL routine_label RSB |
MOVL SP,FP SUBL #data_area,SP |
MOVL #fake_psl,-(SP) MOVAL target_label,-(SP) ; all three REI |
または
MOVPSL -(SP) MOVAL target_label,-(SP) ; force AST delivery only REI |
または
MOVL #fake_psl,-(SP) BSBW DOREI ; ; code continues ; DOREI: REI |
BRx label+offset |
MOVB #OP$_opcode,(Rx) |
または
MOVZBL #OP$_opcode,(Rx) |
JMP G^external_routine |
第 1.3 節 では, VAX MACRO を OpenVMS Alpha や OpenVMS I64 に移植するための推奨される手順を説明しました。この手順に従うことでコードを効率よく移植することができますが,それだけでは移植を行う技術者の間で移植作業の一貫性が確保されるという保証がなく,移植されたコードを後からデバッグしてテストする必要がある技術者に分かりやすいという保証もありません。移植作業が均一に進み,ソース・コードの変更内容がきちんと文書化されるようにするためには,技術グループで,作業の目的に合ったコーディング規約を作成する必要があります。
当然,ツールの管理,ソース・コードの管理,共通コード,テストに関して従うべき手順を含め,技術グループが採用する方法論をグループの開発環境に合わせて調整する必要があります。技術グループが検討する必要があるコーディング規約には以下のものがあります。
VAX MACRO コードの移植作業を計画する際に, OpenVMS VAX システム, OpenVMS Alpha システム,および OpenVMS I64 システムで共通のソースを保守することのメリットを検討してください。技術グループにとっては,保守と拡張が必要なソースが 1 つですむというメリットがあり,また共通ソースはユーザ・インタフェースの共通化に役立ちます。ただし,条件付きのソース・コードが多くなりすぎてコードが分かりにくくなる場合は,アーキテクチャ固有の部分とアーキテクチャに依存しない部分に再構成してください。これらの部分が管理できないほど多くなったら,アーキテクチャ固有のモジュールを個別に作成してください。
正常にコンパイルできると,ソース・ファイル中の VAX MACRO コードは, VAX MACRO アセンブラでも正常に処理されます。コードにコンパイラ指示文を追加した場合は,コードのアセンブル時にライブラリ SYS$LIBRARY:STARLET.MLB によって解決されます。アセンブラは自動的にこのライブラリを検索し,未定義のマクロを探します。定義が見つかったら,アセンブラはコンパイラ指示文があったことを無視します。
ただし,OpenVMS VAX Version 6.0 以降を使用している場合は,まず指示文の定義を OpenVMS Alpha または OpenVMS I64 上の SYS$LIBRARY:STARLET.MLB から抽出し, OpenVMS VAX 上の SYS$LIBRARY:STARLET.MLB に挿入する必要があります。以下に例を示します。
1.7.1 コンパイラ指示文定義の追加
LIB/EXTRACT=.JSB_ENTRY/OUT=JSB_ENTRY.MAR SYS$LIBRARY:STARLET.MLB . . . LIB/INSERT SYS$LIBRARY:STARLET.MLB JSB_ENTRY.MAR |
コンパイラ指示文の定義の多くは,他のマクロを参照している点に注意してください。コード中で使用されているコンパイラ指示文のすべての定義だけでなく,関連するすべてのマクロを抽出し, OpenVMS VAX システム上の SYS$LIBRARY:STARLET.MLB に挿入してください。
1.7.2 VAX への依存の除去
Alpha または Itanium のコードに直接コンパイルできないコーディング・スタイルが含まれているために,ソース・ファイルを変更する必要がある場合でも,共通の VAX MACRO ソースから OpenVMS VAX および OpenVMS Alpha や OpenVMS I64 用のイメージを生成できることがあります。
同じコードが OpenVMS VAX および OpenVMS Alpha や OpenVMS I64 で動作するようにするために,このような VAX への依存を除去することで,移植作業の際に大きなメリットが生まれることがあります。 VAX 環境または Alpha 環境で動作するようにコードの移植を終えている場合は,その環境でモジュールを構築してテストすることで,移植したコードの単一のモジュールまたはモジュールのグループをデバッグできます。これによりデバッグ作業が大幅に短縮できます。
場合によっては,ソース・ファイルを条件付きにしたり ( 第 1.7.3 項 を参照), OpenVMS VAX システムおよび OpenVMS Alpha システムや OpenVMS I64 システムで別のソースを提供するために,プロシージャを定義して実装しなくてはならないことがあります。
コードが内部モードで動作する場合は,共通の VAX MACRO ソースから OpenVMS VAX および OpenVMS Alpha や OpenVMS I64 のイメージを生成しようとしても,完全な成功は見込めません。内部モードのコードは,エグゼクティブと相互動作するため, OpenVMS VAX および OpenVMS Alpha や OpenVMS I64 の間のインタフェースおよびエグゼクティブ・データ構造の違いによる影響を受けやすくなっています。しかし,ユーザ・モードのコードは一般にアーキテクチャへの依存の影響を受けにくいため,より容易にコードの共通化ができます。
1.7.3 アーキテクチャ固有のコードの条件付け
VAX MACRO コードを条件付きにするには, SYS$LIBRARY:ARCH_DEFS.MAR ファイルと以下のアーキテクチャ固有のシンボルを使用する必要があります。
コードのソース・モジュールを共通化し,アーキテクチャの種類による条件付きとする場合は,アセンブルおよびコンパイル時のコマンド行で ARCH_DEFS.MAR を追加して, .IF DF VAX,.IF DF ALPHA, .IF#DF IA64を使用します。
以下のコード・パターンの使用は避け,移植済みのコード中にある場合は変更してください。
.IF DF VAX . . . ; VAX code .IFF . . . ; Alpha code . . . ; will it work for IA64 .ENDC |
または
.IF DF ALPHA . . . ; Alpha code .IFF . . . ; VAX code, will likely fail for IA64 .ENDC |
最も良いコードは次のものです。
.IF DF VAX . . . ; VAX code .IFF .IF DF ALPHA . . . ; Alpha code .IFF .IF DF IA64 . . . ; IA64 code .IFF .ERROR . . . .ENDC .ENDC .ENDC |
ARCH_DEFS.MAR ファイルは, OpenVMS Alpha および OpenVMS I64 で提供されています。 OpenVMS VAX では対応するファイルを作成する必要があります。 以下に示すのは,作成するファイルの例です。
; This is the VAX version of ARCH_DEFS.MAR, which contains ; architectural definitions for compiling sources for ; VAX systems. ; VAX = 1 VAXPAGE = 1 ADDRESSBITS = 32 |
Alpha 版は SYS$LIBRARY に存在し,以下のシンボルの定義が含まれています。
I64 版は SYS$LIBRARY に存在し,次のシンボルの定義が含まれています。
![]() | 警告 OpenVMS Alpha や OpenVMS I64 の ARCH_DEFS.MAR で定義されているその他のシンボルは OpenVMS Alpha または OpenVMS I64 のソース・コード固有であり,すべてのリリースに含まれているという保証はありません。 |
目次 | 索引 |
![]() |
||||||||
|