前へ | 次へ | 目次 | 索引 |
DEC C は,特にシステムおプレベルのプログラミングのための C 言語により表現できない機能を提供するために正確な Alpha 命令をサポートします。例えば,次のようなものがあります。
11.2.3.2 Alpha特権付きアーキテクチャ・ライブラリ(PALcode)命令のアクセス
Alphaアーキテクチャでは,特定のVAX命令を Alpha特権付きアーキテクチャ・ライブラリ(PALcode)命令として実現しています。DEC Cでは,次のPALcode命令をアクセスできます。
11.2.3.3 複数の操作の組み合わせに対する不可分性の保証
VAXアーキテクチャでは,変数のインクリメントなど,特定の組み合わせ操作は不可分に実行されることが保証されます(つまり,途中で割り込みが発生することはありません)。Alphaシステムでこれと同じ機能を実現するために,DEC Cは不可分性を保証して操作を実行できるような組み込み機能を準備しています。表 11-5 はこれらの不可分な組み込み機能を示しています。これらの組み込み機能についてん詳細は DEC C 言語の解説書を参照してください。
不可分性組み込み機能 | 説明 |
---|---|
__ADD_ATOMIC_LONG(ptr, expr, retry_count) __ADD_ATOMIC_QUAD(ptr,expr, retry_count) |
ptr によって示されるデータ引数に式 expr を追加する。任意に指定できる retry_count パラメータは,操作を繰り返す回数を指定する(省略時の設定では,操作は永久に繰り返される)。 |
__AND_ATOMIC_LONG(ptr, expr, retry_count) __AND_ATOMIC_QUAD(ptr, expr, retry_count) |
ptr によって示されるデータ・セグメントをフェッチし,式 expr との間で論理AND演算を実行し,結果を格納する。retry_count パラメータは,操作を繰り返す回数を指定する(省略時の設定では,操作は永久に繰り返される)。 |
__OR_ATOMIC_LONG(ptr, expr, retry_count) __OR_ATOMIC_QUAD(ptr, expr, retry_count) |
ptr によって示されるデータ・セグメントをフェッチし,式 expr との間で論理OR演算を実行し,結果を格納する。retry_count パラメータは操作を繰り返す回数を指定する (省略時の設定では,操作は永久に繰り返される)。 |
これらの組み込み機能は,割り込みを発生させずに操作を最後まで実行することだけを保証します。同時に書き込みアクセスが実行されるような変数に対して不可分な操作を実行する場合(たとえば,ASTとメイン・ライン・コードから書き込まれる変数や 2つの並列プロセスから書き込まれる変数など),volatile 属性によって変数を保護しなければなりません。
さらに,DEC C for OpenVMS Alphaシステムでは,VAXインターロック命令と同じ機能を実行するために次の命令をサポートします。
これらの組み込み機能は,不可分な組み込み機能と同様に retry_count パラメータを使用して,ループが永久に実行されるのを防止します。
11.2.4 VAX CとDEC C for OpenVMS Alphaシステムのコンパイラの相違点
次の機能はVAX Cでも使用できますが,DEC C for OpenVMS Alphaシステムの省略時の動作とは異なります。しかし,これらの機能の一部に対しては,コマンド行修飾子とプラグマ命令を使用することにより,VAX Cと同じ動作を実行できます。
11.2.4.1 データ・アラインメントの制御
自然な境界にアラインされていないデータをアクセスすると,Alphaシステムでは性能が著しく低下するため,DEC C for OpenVMS Alphaシステムは省略時の設定により,データを自然な境界にアラインします。この機能を無効にし,VAXのアラインメント(パックされたアラインメント)を実行するには,ソース・ファイルに #pragma nomember_alignmentプリプロセッサ命令を指定するか,/NOMEMBER_ALIGNMENTコマンド行修飾子を使用します。
11.2.4.2 引数リストのアクセス
&argv1などの引数のアドレスを検出すると,DEC C for OpenVMS Alphaシステムは,すべての引数をスタックに移動する関数に対してプロローグ・コードを生成します ( homing 引数と呼ぶ)が,その結果,性能が低下します。また,引数リスト"walking"は,<varargs.h>または<stdargs.h>インクルード・ファイルで関数を使用しなければ実現できません。
11.2.4.3 例外の同期化
Alphaアーキテクチャでは,算術演算例外がただちに報告されないため,後続の例外が通知される前に静的変数への代入が実行されることを期待することはできません (volatile属性を使用した場合でも)。
11.2.4.4 動的条件ハンドラ
OpenVMS Alpha システム用の DEC C と DEC C++ は,LIB$ESTABLISH を組み込み関数として取り扱いますが,OpenVMS VAX システムまたは OpenVMS Alpha システムで LIB$ESTABLISH を使用することは望ましくありません。C および C++ プログラマは,LIB$ESTABLISH の代わりに VAXC$ESTABLISH を呼び出してください (VAXC$ESTABLISH は OpenVMS Alpha システム用の DEC C および DEC C++ で提供される組み込み関数です)。
11.2.5 CプログラマのためのSTARLETデータ構造体と定義
OpenVMS Alpha バージョン 1.0 には,SYS$STARLET_C.TLB という新しいファイルが含まれており,このファイルには STARLETSD.TLB に相当する STARLET 機能を提供するすべての .H ファイルが格納されています。現在,DEC C コンパイラには DECC$RTLDEF.TLB の他に SYS$STARLET_C.TLB ファイルが同梱されており,以前の VAX C Compiler に同梱されていた VAXCDEF.TLB の代わりに使用されます。DECC$RTLDEF.TLB には,コンパイラと RTL をサポートするすべての .H ファイル,たとえば,STDIO.H などが格納されています。
次の相違点があるために,ソースを変更しなければならない可能性があります。
以前は,FAB,NAM,RAB,XABALL などの RMS 構造体は,たとえば "struct RAB {..." などのように,適切な .H ファイルで定義されていました。OpenVMS Alpha バージョン 1.0 で提供される .H ファイルでは,これらの構造体は "struct rabdef {..." として定義されています。この違いを補正するために,"#define RAB rabdef" という形式の行が追加されました。しかし,この変更のためにソースを変更しなければならない状況が 1 つだけあります。これらの構造体のいずれかを指すポインタを格納したプライベート構造体を使用しており,そのプライベート構造体が RMS 構造体を定義する前に定義されている場合には (ただし,使用されません),次のようなコンパイル時エラーが発生します。
%CC-E-PASNOTMEM, In this statement, "rab$b_rac" is not a member of "rab". |
このエラーを回避するには,プライベート構造体より前に RMS 構造体が定義されるように,ソース・ファイルを変更します。通常は,"#include" 文を移動します。
これまで歴史的には,LIB の 3 つの構造体 (NFBDEF.H,FATDEF.H,および FCHDEF.H) は .H ファイルとして提供されてきました。OpenVMS Alpha バージョン 1.0 とバージョン 1.5 では,これらのファイルは .H ファイルとして提供されていました (新しい SYS$STARLET_C.TLB にはありません)。OpenVMS Alpha 7.2 では,すべての LIB 構造体と定義を格納した SYS$LIB_C.TLB ファイルが追加されました。これらの 3 つの .H ファイルは .TLB の一部として提供されるようになり,個別には提供されなくなりました。これらのファイルで既存の変則的な状態を保存しようとする試みは行われていないため,ソースを変更しなければならない可能性があります。LIB からの構造体と定義は特権インタフェースのみに対するものであり,したがって変更が必要です。
新しい .H ファイルでは,variant_struct と variant_union が常に使用されます。一方,以前は一部の構造体が struct と union を使用していました。したがって,データ構造体内のフィールドを参照するときに,中間の構造体名を指定することはできません。
たとえば,
AlignFaultItem.PC[0] = DataPtr->afr$r_pc_data_overlay.afr$q_fault_pc[0]; |
という文は,次のようになります。
AlignFaultItem.PC[0] = DataPtr->afr$q_fault_pc[0]; |
SYS$STARLET_C.TLB の各 .H ファイルは,"#pragma member_alignment" の状態を保存し,復元します。
SYS$STARLET_C.TLB の .H ファイルは,以前は VAXCDEF.TLB で部分的にしか準拠していなかった表記規則に準拠しています。すべての定数 (#defines) は大文字の名前を使用します。すべての識別子 (ルーチン,構造体メンバなど) は小文字の名前を使用します。VAXCDEF.TLB との違いがある場合には,互換性を維持するために以前のシンボル名も使用できますが,今後は新しい表記法に従うようにしてください。
OpenVMS Alpha をインストールするときに,SYS$STARLET_C.TLB の内容は別の .H ファイルに抽出されません。DEC C コンパイラは,#include 文の形式とは無関係に,SYS$STARLET_C.TLB の内部からこれらのファイルにアクセスします。個々の .H ファイルを調べる場合には,次の例に示すように,Librarian ユーティリティを使用できます。
$ LIBRARY /EXTRACT=AFRDEF /OUTPUT=AFRDEF.H SYS$LIBRARY:SYS$STARLET_C. TLB |
11.2.6 /STANDARD=VAXCモードでサポートされないVAX Cの機能
VAX Cでサポートされる大部分のプログラミング方式は,DEC C for OpenVMS Alphaシステムでも/STANDARD=VAXCモードでサポートされますが,ANSI標準規格と矛盾する特定のプログラミング方式はサポートされません。次のリストはこれらの相違点を示しています。詳しくは DEC Cコンパイラに関する解説書を参照してください。
#ifdef a . . . #endif a |
テキストを削除するか,または次の例に示すようにテキストをコメント区切り文字で囲んでください。
#endif /* a */ |
array[SIZE] = NULL; /* accepted by VAX C */ array[SIZE] = {NULL}; /* required by DEC C */ |
#define x a #define x b /* generates a warning message in DEC C */ |
#include stdio |
このような場合には,かわりに次の構文を使用してください。
#include <stdio.h> |
さらに,このようなコードをリンクする場合には,リンカが変更されているため,C コード・モジュールを再コンパイルしたときに /SHARE 修飾子を指定しなかったときは,関連するリンカ修飾子を指定しなければなりません。
11.3 VAX COBOL と DEC COBOL の互換性と移行
DEC COBOL は,OpenVMS VAX システム上で動作する VAX COBOL に基づいており,高い互換性があります。以下の項では,両者のおもな違いの要約を示します。
この情報は,両製品との互換性がある COBOL アプリケーションを開発したり,VAX COBOL アプリケーションを OpenVMS Alphaオペレーティング・システム上の DEC COBOL に移行する際に役立ちます。
11.3.1 DEC COBOL の拡張仕様と機能の違い
DEC COBOL は,VAX COBOL にはない以下の言語拡張仕様と機能を含んでいます。
さらに,DEC COBOL には以下の機能が含まれています。
DEC COBOL は,VAX COBOL の以下の機能を含んでいません。
DEC COBOL と VAX COBOL の詳細については,製品のリリース・ノートおよび解説書をご覧ください。OpenVMS Alphaオペレーティング・システムでは,システム・プロンプトで HELP COBOL RELEASE_NOTESと入力すると,インストールされているコンパイラのリリース・ノートのオンライン・バージョンを見ることができます。
前へ | 次へ | 目次 | 索引 |