この章では,ネイティブなOpenVMS Alphaコンパイラ固有の機能について説明します。 さらに,OpenVMS VAXコンパイラの機能のうち, OpenVMS Alphaコンパイラではサポートされない機能と, 動作が変更された機能についても示します。
以下にこの章で説明するコンパイラを示します。
コンパイラの相違点が発生するのは,次の2つの理由によります。それは, OpenVMS VAXで動作するコンパイラの以前のバージョンと現在のバージョンとの間に違いがあるためと, VAXコンピュータとAlphaコンピュータで動作するバージョンに違いがあるためです。 OpenVMS Alphaコンパイラは,OpenVMS VAXの対応するコンパイラと互換性を維持するように設計されています。 この後の節に示すように,互換性を維持するためにいくつかの修飾子が提供されます。
言語は言語標準規格に準拠し,OpenVMS VAXの大部分の言語拡張機能をサポートします。 コンパイラはOpenVMS VAXシステムの場合と同じ省略時のファイル・タイプを使用して出力ファイルを作成します。 たとえば,オブジェクト・モジュールのファイル・タイプは.OBJです。
しかし,OpenVMS VAXシステムのコンパイラでサポートされていた機能のうち, 一部の機能はOpenVMS Alphaシステムで提供されません。
各言語のコンパイラの相違点の詳細については,その言語のマニュアル, とくにユーザーズ・ガイドとリリース・ノートを参照してください。
DEC Adaは,VAX Adaに含まれる標準的および拡張されたAda言語機能を, ほとんどすべて含んでいます。これらの機能は次の解説書で説明されています。
しかし,プラットフォーム・ハードウェアの違いにより, いくつかの機能はサポートされておらす,VAXシステムと Alphaシステムでは異なる機能もあります。 あるシステムから別のシステムへのプログラムの移行を助けるため, 移行の節ではこれらの違いを説明します。
- 注意
- すべてのシステムの各リリースごとに, これらの機能のすべてがサポートされるわけではありません。 詳しくは,DEC Adaのリリース・ノートを参照してください。
概して,DEC Adaはすべてのプラットフォームで同じデータ・タイプをサポートします。 しかし,以下の違いに注意してください。
VAXシステムではサポートされているが,Alphaシステムではサポートされていない
Alphaシステムではサポートされているが,VAXシステムではサポートされていない
Alphaシステムでは,DEC Adaは省略時設定としてレコードとアレイの構成要素を自然な境界にアラインします。 VAXシステムでは,DEC Adaはレコードとアレイの構成要素をバイト境界にアラインします。 アラインメントはCOMPONENT_ALIGNMENTプラグマで指定できます。 レコード表現節の最大アラインメントは, VAXシステムでもAlphaシステムでも 29です。
タスクの優先順位とスケジューリング, およびタスク制御ブロック・サイズはアーキテクチャ固有です。詳しくは, リリース・ノートを参照してください。
プラグマには以下のような違いがあります。
Alphaシステムでは,COMPONENT_SIZEが省略時の選択肢です。VAXシステムでは, STORAGE_UNITが省略時の選択肢です。
Alphaシステムでは,このプラグマはIEEE_FLOATとVAX_FLOATという 2つの選択肢をサポートします。VAXシステムでは,VAX_FLOATをサポートします。
システム間で異なるデータ型の制限があります。詳しくは,『DEC Ada Run-Time Reference Manual for OpenVMS Systemss』を参照してください。
Alphaシステムではサポートされません。
Alphaシステムではサポートされません。
VAXシステムとAlphaシステムでのこのプラグマのサポートには, 実行に関するいくつかの違いがあります。詳しくは, 『DEC Ada Run-Time Reference Manual for OpenVMS Systemss』を参照してください。
SYSTEMパッケージに関しては,以下の変更があります。
Alphaシステムではサポートしていますが,VAXシステムではサポートしていません。
VAXシステムではサポートしていますが,Alphaシステムではサポートしていません。
VAXシステムでの値は33,Alphaシステムでの値は15です。
DEC Adaを使用できる各システムで特定の列挙型がサポートされます。
Alphaシステムでは,OpenVMS_Alphaという名前がサポートされます。
Alphaシステムでの値は 10.0-3 (1 ms)です。VAXシステムでの値は 10.0-2 (10 ms)です。
さらに,VAXシステムでサポートされる以下のタイプとサブプログラムは, Alphaシステムではサポートされません。
以下に他のパッケージでの違いを示します。
システム間で実行方法に違いがあります。詳しくは, 『DEC Ada Language Reference Manual』を参照してください。
システム間で実行方法に違いがあります。各パッケージの解説を参照してください。
このパッケージはVAXシステムと, いくつかの制限事項はありますがAlphaシステムでサポートされます。詳しくは, 『DEC Ada Run-Time Reference Manual for OpenVMS Systemss』を参照してください。
VAXシステムでサポートされる以下の2つのあらかじめ定義されている命令は Alphaシステムではサポートされません。
DEC Cを構成するコンパイラ群は,ANSIに準拠する基本的なC言語を定義し, これらの言語はAlphaアーキテクチャも含めて, すべてのDECプラットフォームで使用できます。詳しくは, DEC Cの解説書を参照してください。
DEC C for OpenVMS AlphaシステムはANSI C標準規格に準拠し, オプションとしてVAX CおよびCommon C (pcc)の拡張機能をサポートします。 オプションとして提供されるこれらの拡張機能はモードと呼び, これらの拡張機能を起動するには,/STANDARD修飾子を使用します。 表 11-1はこれらのモードと, 各モードを起動するのに必要なコマンドと修飾子の構文を示しています。
| モード | コマンド修飾子 | 説明 |
|---|---|---|
| 省略時の設定 | /STANDARD=RELAXED_ANSI89 | ANSI C標準規格に準拠するが,弊社の追加キーワードや, 1文字目がアンダースコアでない事前定義マクロも使用できる。 |
| ANSI C | /STANDARD=ANSI89 | 厳密にANSI Cに準拠した言語のみを受け付ける。 |
| VAX C | /STANDARD=VAXC | ANSI C標準規格の他にVAX Cの拡張機能も使用できる。 これらの拡張機能がANSI C標準規格と互換性がない場合でも使用可能である。 |
| Common C (pcc) | /STANDARD=COMMON | ANSI C標準規格の他に,Common Cの拡張機能も使用できる。 これらの拡張機能がANSI C標準規格と互換性がない場合も使用可能である。 |
| Microsoftとの互換性 | /STANDARD=MS | Microsoft Visual C++コンパイラ製品に付属する Cコンパイラの言語規則に従ってソース・プログラムを解釈する。 |
DEC C for OpenVMS Alphaシステムのコンパイラは, 対応するVAXコンパイラとほとんど同じデータ型マッピングをサポートします。 表 11-2は, AlphaアーキテクチャでのC言語の算術演算データ型のサイズを示しています。
| Cデータ型 | VAX Cのマッピング | DEC Cのマッピング |
|---|---|---|
| pointer | 32 | 32または64[1] |
| long | 32 | 32 |
| int | 32 | 32 |
| short | 16 | 16 |
| char | 8 | 8 |
| float | 32 | 32[2] |
| double | 64[2] | 64[2] |
| long double | 64[2] | 64[2] |
| __int16 | NA | 16 |
| __int32 | NA | 32 |
| __int64 | NA | 64 |
| [1] 実現されている場合には,
ソース・ファイルでプラグマを使用するか,
またはコマンド行修飾子を使用することにより,サイズを選択できる。
[2] コマンド行修飾子を使用することにより,AlphaでD,F,G,S,または T浮動小数点データ型にマッピングする方法を選択できる。 第11.2.2.1項を参照。 | ||
移植性を向上するために,DEC C for OpenVMS Alphaシステムのコンパイラでは, 各データ型に対してマクロを定義するヘッダ・ファイルが準備されています。 たとえば,64ビットの長さのデータ型が必要な場合には,int64マクロを使用します。
Cの浮動小数点データ型とAlphaの浮動小数点データ型の間のマッピングは, コマンド行修飾子によって制御されます。Alphaアーキテクチャでは, 次の浮動小数点データ型をサポートします。
コマンド行修飾子を使用すれば,標準的なCデータ型のfloatとdoubleが Alphaのどの浮動小数点データ型にマッピングされるかを制御できます。たとえば, /FLOAT=G_FLOAT修飾子を指定した場合には,DEC Cはfloatデータ型を AlphaのF浮動小数点データ型にマッピングし,doubleデータ型をAlphaの G浮動小数点データ型にマッピングします。 表 11-3は浮動小数点オプションを示しています。 各コマンド行に浮動小数点修飾子は1つだけ指定できます。
| コンパイラ・オプション | Float | Double | Long Double |
|---|---|---|---|
| /FLOAT=F_GLOAT | F浮動形式 | G浮動形式 | |
| /FLOAT=D_FLOAT | F浮動形式 | D-53浮動小数点 | |
| /FLOAT=IEEE_FLOAT | S浮動形式 | T浮動形式 | |
| /L_DOUBLE_SIZE=128 (省略時の値) |
- | - | X浮動形式 |
DEC Cには,表 11-4に示す機能があり, これらの機能はAlphaシステム固有の機能です。この後の節では, これらの機能について説明します。
| 機能 | 説明 |
|---|---|
| 一部のAlpha命令へのアクセス | 組み込み機能として使用できる |
| 一部のVAX命令へのアクセス | Alpha PALcodeを通じて使用できる |
| 不可分な組み込み機能 | AND,OR,およびADD演算の不可分性を保証する |
DEC Cは,特にシステムおプレベルのプログラミングのための C言語により表現できない機能を提供するために正確なAlpha命令をサポートします。 例えば,次のようなものがあります。
Alphaアーキテクチャでは, 特定のVAX命令をAlpha特権付きアーキテクチャ・ライブラリ(PALcode)命令として実現しています。 DEC Cでは,次のPALcode命令をアクセスできます。
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 パラメータを使用して, ループが永久に実行されるのを防止します。
次の機能はVAX Cでも使用できますが, DEC C for OpenVMS Alphaシステムの省略時の動作とは異なります。しかし, これらの機能の一部に対しては, コマンド行修飾子とプラグマ命令を使用することにより,VAX Cと同じ動作を実行できます。
自然な境界にアラインされていないデータをアクセスすると, Alphaシステムでは性能が著しく低下するため,DEC C for OpenVMS Alphaシステムは省略時の設定により,データを自然な境界にアラインします。 この機能を無効にし,VAXのアラインメント(パックされたアラインメント) を実行するには,ソース・ファイルに #pragma nomember_alignmentプリプロセッサ命令を指定するか, /NOMEMBER_ALIGNMENTコマンド行修飾子を使用します。
&argv1などの引数のアドレスを検出すると,DEC C for OpenVMS Alphaシステムは,
すべての引数をスタックに移動する関数に対してプロローグ・コードを生成します(
homing 引数と呼ぶ)が,その結果,性能が低下します。また,
引数リスト"walking"は,<varargs.h> または
<stdargs.h>
インクルード・ファイルで関数を使用しなければ実現できません。
Alphaアーキテクチャでは,算術演算例外がただちに報告されないため, 後続の例外が通知される前に静的変数への代入が実行されることを期待することはできません (volatile属性を使用した場合でも)。
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++で提供される組み込み関数です)。
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.1では,すべての 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
STARLETソースから作成された.Hファイルの他に,SYS$STARLET_C.TLBには,CMA.Hなど, DECthreadsをサポートするための.Hファイルも含まれています。
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>
externセマンティックを使用して宣言することにより,
その変数を使用できます。
さらに,このようなコードをリンクする場合には,リンカが変更されているため, Cコード・モジュールを再コンパイルしたときに/SHARE修飾子を指定しなかったときは, 関連するリンカ修飾子を指定しなければなりません。
DEC COBOLは,OpenVMS VAXシステム上で動作するVAX COBOLに基づいており, 高い互換性があります。以下の項では,両者のおもな違いの要約を示します。 この情報は,両製品との互換性があるCOBOLアプリケーションを開発したり, VAX COBOLアプリケーションをOpenVMS Alphaオペレーティング・システム上の DEC COBOLに移行する際に役立ちます。
DEC COBOLは,VAX COBOLにはない以下の言語拡張仕様と機能を含んでいます。
さらに,DEC COBOLには以下の機能が含まれています。
DEC COBOLは,VAX COBOLの以下の機能を含んでいません。
DEC COBOLとVAX COBOLの詳細については, 製品のリリース・ノートおよび解説書をご覧ください。OpenVMS Alphaオペレーティング・システムでは,システム・プロンプトでHELP COBOL RELEASE_NOTESと入力すると, インストールされているコンパイラのリリース・ノートのオンライン・バージョンを見ることができます。
第11.3.2.3項と第11.3.2.5項では,
DEC COBOLとVAX COBOLのコマンド行修飾子を比較しています。
OpenVMS Alphaオペレーティング・システムのDEC
COBOLのコマンド行修飾子の詳細については,OpenVMS Alphaのシステム・プロンプトで
HELP COBOLと入力して,オンライン・ヘルプを参照してください。
VAX COBOLのコマンド行修飾子については,『VAX COBOL User Manual』を参照してください。
/NATIONALITY=JAPANが指定されていると,円記号(�)が省略時の通貨記号になり, 日本語サポート機能が有効になります。また,この場合は /NODIAGNOSTICSと/NOANALYSIS_DATAが暗黙のうちに指定されます。
OpenVMS Alpha上のDEC COBOLで/NATIONALITY=JAPANを指定した場合, Oracle CDD/Repositoryはサポートされません。
コンパイル・コマンド行で/NATIONALITY=USを指定すると,ドル記号($) が省略時の通貨記号になり,日本語サポート機能は無効になります。
コンパイル・コマンド行で/STANDARD=MIAが指定されていると,コンパイラは MIA仕様に準拠していない言語要素について診断情報を発行します。
診断情報を表示するには,/WARNINGS=ALL修飾子か /WARNING=INFORMATION修飾子が必要です。
省略時の設定はNOMIAです。
以下のコマンド行修飾子はDEC COBOLでのみ使用できます。
『OpenVMS Calling Standard』の呼び出し規則では,データ・フィールドが( その規則で定められている)特定のアドレスにアラインされている必要があります。 これと同じ規則に,すべてのデータ・レコードは, そのアラインメントの倍数でなくてはならないと定められています。
コンパイル・コマンド行で/ALIGNMENT=PADDINGが指定されていると, COBOLのグループ・データ項目はその自然な境界上にアラインされ, これらのグループ項目はアラインメントの倍数になるようにパッドが挿入されます。 Alphaのアラインメントとパッドの挿入が行われるときの基本データ項目のアラインメントの詳細については, 『DEC COBOL Reference Manual』を参照してください。
表 11-6は,VAX COBOLに固有のコマンド行修飾子と修飾子オプションの組み合わせを示しています。 これらはDEC COBOLでは使用できません。
| 修飾子 | 説明 |
|---|---|
| /DESIGN | 詳細設計として入力ファイルをコンパイラが処理を行かどうかを制御する。 |
| /INSTRUCTION_SET[=option] | VAX命令セットの異なる部分を使用して, シングル・チップVAXプロセッサ上で実行時の性能を改良する。 |
| /STANDARD=OPENVMS_AXP | DEC COBOLコンパイラでサポートされない言語機能に関する情報メッセージを出力する( 第11.3.2.7項および『VAX COBOLバージョン5.1 リリース・ノート』を参照) |
| /STANDARD=PDP11 | COBOL-81コンパイラでサポートされない言語機能に関する情報メッセージを出力する |
| /WARNINGS=STANDARD | DECによる拡張機能である言語機能に関する情報メッセージを出力する。DEC COBOLの同等な機能は/STANDARD=SYNTAX修飾子である |
DEC COBOLは,VAX COBOLの/STANDARD=V3修飾子のインプリメンテーションがサポートしているいくつかの機能をサポートしていません。
/WARNING=ALL修飾子を使用すると,/STANDARD=V3の効果がわかりやすくなります。 特に,DEC COBOLは,/STANDARD=V3が指定されていると, 以下の情報メッセージを生成します。
/STANDARD=V3 evaluation order not
supported for this construct
/STANDARD=V3 variable length item
rules not supported for this construct
/STANDARD=V3修飾子のVAX COBOLのインプリメンテーションの詳細については, 『VAX COBOL User Manual』の修飾子に関する付録を参照してください。
VAX COBOLバージョン5.1(およびそれ以上)では, /STANDARD=OPENVMS_AXP修飾子オプションを指定して, 既存のVAX COBOLプログラムの中の,OpenVMS Alphaシステム上のDEC COBOLでは使用できない言語要素を識別する新しいフラグ付けシステムを利用することができます。
/STANDARD=OPENVMS_AXPを指定すると,VAX COBOLコンパイラはDEC COBOLでは使用できない言語構成体を通知する情報メッセージを生成します( これらのメッセージを表示するためには,同時に/WARNINGS=ALLまたは /WARNINGS=INFORMATIONALも指定する必要があります)。この情報を使用して, DEC COBOLを使用する前にプログラムを変更することができます。
省略時の/STANDARD=NOOPENVMS_AXPでは,これらの情報メッセージは表示されません。
この項では,VAX COBOLとDEC COBOLの動作の違いと,DEC COBOLに固有の動作について説明します。
DEC COBOLコンパイラは,到達不能コードやその他のロジック・エラーに関して, VAX COBOLコンパイラよりも詳細なメッセージを生成することがあります。
次の例に,サンプル・プログラムと,DEC COBOLコンパイラが発行するメッセージを示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. T1.
ENVIRONMENT DIVISION.
PROCEDURE DIVISION.
P0.
GO TO P1.
P2.
DISPLAY "This is unreachable code".
P1.
STOP RUN.
$ COBOL /ANSI/WARNINGS=ALL T1.COB
$
プログラムはコンパイルされます。VAX COBOLコンパイラはメッセージを出力しません。
$ COBOL/ANSI/OPTIMIZE/WARNINGS=ALL T1.COB
P2.
.......^
%COBOL-I-UNREACH, code can never be executed at label P2
at line number 7 in file DISK$YOURDISK:[TESTDIR]T1.COB;1
DEC COBOLは,どちらのオペレーティング・システム上でも最適化を行います。
最適化の1つの用途として,
呼び出されていないルーチンや到達不能な段落の分析を行うことができます。
コンパイラは,/NOOPTIMIZEを含むすべての最適化レベルで,
到達不能コードの分析を実行します(省略時には完全な最適化が行われるので,
上の例のようにコマンド行で修飾子やフラグを指定する必要はありません)。
VAX COBOLには/OPTIMIZE修飾子はありません。
VAX COBOLコンパイラと,OpenVMS Alphaシステム上のDEC COBOLコンパイラには, 出力されるプログラム・リスティングに違いがあります。
DEC COBOLでは,/NOOBJECT修飾子を指定すると, コンパイラはコード生成を抑止します。このため, リスティングでもオブジェクト・モジュールでも,マシン・コードは生成されません。 VAX COBOLでは,/NOOBJECTは.OBJの作成を抑止するだけです。この場合でも,VAX COBOLはオブジェクト・コードを生成するための作業を実行しますので, その結果をリスティングに出力することができます。 プログラム・リスティングにマシン・コードを出力したい場合は, /NOOBJECTを使用しないでください。
DEC COBOLでは,最初のプログラムの名前がコンパイル全体でのモジュール名になります。 VAX COBOLでは,モジュール名は個々のプログラムごとに変わります。
DEC COBOLコンパイラとVAX COBOLコンパイラは,COBOLプログラムのCOPY文の注釈を, 若干異なる形式で出力します。次の2つのコンパイラ・リスティングは,DEC COBOLとVAX COBOLでの,COBOLプログラムのリスティングにおける注釈の位置の違い( "L"という文字)を示しています。
DEC COBOLにおけるCOPY文のリスティング・ファイル:
1 IDENTIFICATION DIVISION.
2 PROGRAM-ID. DCOP1B.
3 *
4 * This program tests the copy library file.
5 * with a comment in the middle of it.
6 * It should not produce any diagnostics.
7 COPY
8 * this is the comment in the middle
9 LCOP1A.
L 10 ENVIRONMENT DIVISION.
L 11 INPUT-OUTPUT SECTION.
L 12 FILE-CONTROL.
L 13 SELECT FILE-1
L 14 ASSIGN TO "FILE1.TMP".
15 DATA DIVISION.
16 FILE SECTION.
17 FD FILE-1.
18 01 FILE1-REC PIC X.
19 WORKING-STORAGE SECTION.
20 PROCEDURE DIVISION.
21 PE. DISPLAY "***END***"
22 STOP RUN.
VAX COBOLにおけるCOPY文のリスティング・ファイル:
1 IDENTIFICATION DIVISION.
2 PROGRAM-ID. DCOP1B.
3 *
4 * This program tests the copy library file.
5 * with a comment in the middle of it.
6 * It should not produce any diagnostics.
7 COPY
8 * this is the comment in the middle
9 LCOP1A.
10L ENVIRONMENT DIVISION.
11L INPUT-OUTPUT SECTION.
12L FILE-CONTROL.
13L SELECT FILE-1
14L ASSIGN TO "FILE1.TMP".
15 DATA DIVISION.
16 FILE SECTION.
17 FD FILE-1.
18 01 FILE1-REC PIC X.
19 WORKING-STORAGE SECTION.
20 PROCEDURE DIVISION.
21 PE. DISPLAY "***END***"
22 STOP RUN.
DEC COBOLコンパイラとVAX COBOLコンパイラは, 複数のCOPY文が同じ行に含まれているCOBOLプログラムのリスティングでも, 若干異なる形式を使用します。次の2つのコンパイラ・リスティングは,DEC COBOLとVAX COBOLでの,COBOLプログラムの1つの行に複数の COPY文があったときの注釈の位置の違い("L"という文字)を示しています。
DEC COBOLにおける複数のCOPY文のリスティング・ファイル:
1 IDENTIFICATION DIVISION.
2 PROGRAM-ID. DCOP1J.
3 *
4 * Tests copy with three copy statements on 1 line.
5 *
6 ENVIRONMENT DIVISION.
7 DATA DIVISION.
8 PROCEDURE DIVISION.
9 THE.
10 COPY LCOP1J. COPY LCOP1J. COPY LCOP1J.
L 11 DISPLAY "POIUYTREWQ".
L 12 DISPLAY "POIUYTREWQ".
L 13 DISPLAY "POIUYTREWQ".
14 STOP RUN.
VAX COBOLにおける複数のCOPY文のリスティング・ファイル:
1 IDENTIFICATION DIVISION.
2 PROGRAM-ID. DCOP1J.
3 *
4 * Tests copy with three copy statements on 1 line.
5 *
6 ENVIRONMENT DIVISION.
7 DATA DIVISION.
8 PROCEDURE DIVISION.
9 THE.
10 COPY LCOP1J.
11L DISPLAY "POIUYTREWQ".
12C COPY LCOP1J.
13L DISPLAY "POIUYTREWQ".
14C COPY LCOP1J.
15L DISPLAY "POIUYTREWQ".
16 STOP RUN.
COPY文が行の途中に文を挿入するときのコンパイラ・リスティング・ファイルは, DEC COBOLプログラムとVAX COBOLプログラムで異なります。 次の2つのコンパイラ・リスティングで,LCOP5D.LIBは "O"というテキストを含んでいます。DEC COBOLコンパイラは行をそのまま残し, COPYファイルの内容をソース行の下に出力します。VAX COBOLコンパイラは, 元のソース行を2つの部分に分割します。
DEC COBOLにおけるCOPY文のリスティング・ファイル:
-----------------------------------------------------------
13 P0. MOVE COPY LCOP5D. TO ALPHA.
L 14 "O"
VAX COBOLにおけるCOPY文のリスティング・ファイル:
-----------------------------------------------------------
13 P0. MOVE COPY LCOP5D.
14L "O"
15C TO ALPHA.
COBOLソース文のREPLACEとDATE-COMPILEDに対する診断メッセージにより, コンパイラ・リスティング・ファイルにソース行の複数のインスタンスが含まれることになります。 DEC COBOLプログラムのREPLACE文では,DEC COBOLコンパイラが置換テキストに関するメッセージを発行する場合, そのメッセージは次のコンパイラ・リスティング・ファイルに示すように, プログラムの元のテキストに対応するものになります。
DEC COBOLにおけるREPLACE文のリスティング・ファイル:
18 P0. REPLACE ==xyzpdqnothere==
19 BY ==nothere==.
20
21 copy "drep3hlib".
L 22 display xyzpdqnothere.
...................1
%COBOL-F-UNDEFSYM, (1) Undefined name
LR 22 display nothere.
VAX COBOLプログラムでは,
コンパイラ・メッセージは次のコンパイラ・リスティング・ファイルに示すように,
置換後のテキストに対応するものになります。
VAX COBOLにおけるREPLACE文のリスティング・ファイル:
18 P0. REPLACE ==xyzpdqnothere==
19 BY ==nothere==.
20
21 copy "drep3hlib".
22LR display nothere.
1
%COBOL-F-ERROR 349, (1) Undefined name
次の2つのコンパイラ・リスティング・ファイルは,DEC COBOLとVAX COBOLで DATE-COMPILED文を使用した場合の違いを示しています。
DEC COBOLにおけるDATE-COMPILED文のリスティング・ファイル:
33 *
34 date-compiled
.............1
%COBOL-E-NODOT, (1) Missing period is assumed
34 date-compiled 16-Jul-1992.
35 security. none.
VAX COBOLにおけるDATE-COMPILED文のリスティング・ファイル:
33 *
34 date-compiled 16-Jul-1992.
1
%COBOL-E-ERROR 65, (1) Missing period is assumed
35 security. none.
REPLACE文とCOPY REPLACING文を使用したとき,
コンパイラ・リスティング・ファイルにおける行番号はDEC COBOLとVAX
COBOLで異なります。DEC COBOLは,
置換後の行番号を元のソース・テキストの行番号に対応させます。このため,
それ以降の行番号は食い違うことになります。VAX COBOLは行番号を連続的に付けます。
次のソース・プログラムは,プログラムをDEC COBOLとVAX COBOLのどちらでコンパイルするかによって, コンパイラ・リスティング・ファイルの最後の行番号が変わります。
REPLACE ==A VERY LONG STATEMENT== by ==EXIT PROGRAM==.
A
VERY
LONG
STATEMENT.
DISPLAY "To REPLACE or not to REPLACE".
DEC COBOLにおけるREPLACE文のリスティング・ファイル:
-----------------------------------------------------------------
1 REPLACE ==A VERY LONG STATEMENT== by ==EXIT PROGRAM==.
2 EXIT PROGRAM.
6 DISPLAY "To REPLACE or not to REPLACE".
VAX COBOLにおけるREPLACE文のリスティング・ファイル:
-----------------------------------------------------------------
1 REPLACE ==A VERY LONG STATEMENT== by ==EXIT PROGRAM==.
2 EXIT PROGRAM.
3 DISPLAY "To REPLACE or not to REPLACE".
/SEPARATE_COMPILATION修飾子を指定すると,リスティングが個別に生成されます。 /SEPARATE_COMPILATIONを指定せずに コンパイルされた分割コンパイル・プログラム(SCP)では, リスティングは以下のようになります。
DEC COBOLはVFU-CHANNELをサポートしていないので,VFUとVFP (Vertical Forms UnitユーティリティとVertical Forms Printing)を直接にはサポートしません。
DEC COBOLとVAX COBOLは, 似たような出力ファイル・フォーマッティングを実現するために, VFCファイルの中で異なる制御バイト・シーケンスを使用しなければならないことがあります。
DEC COBOLとVAX COBOLは,似たような画面フォーマッティングを実現するために, ACCEPTとDISPLAYで異なるエスケープ・シーケンスを使用しなければならないことがあります。
VFCフォーマットのREPORT WRITERまたはLINAGEファイルは,通常は TYPEコマンドを使用するか,プリントアウトして表示します。電子メールで送信したり, エディタで読み込んだりするためには,コンパイル・コマンド行で /NOVFCを指定してコンパイルを行います。
1つの.COBソース・ファイルでオープンされるすべてのREPORT WRITERおよび LINAGEファイルは,同じフォーマットを持つことになります(VFCまたは NOVFC)。省略時はVFCです。/NOVFC修飾子が指定されていると, 各ソース・ファイルに対してNOVFC条件が設定されます。次に例を示します。
$ COBOL A/NOVFC,B/VFC,C/NOVFC,D
この例で,ソース・ファイルBとDはVFCフォーマットでレポートを生成します
(ソース・ファイル・リスト項目がプラス(+)記号で区切られている場合には動作が異なります)。
以下のCOBOL文は,DEC COBOLとVAX COBOLで異なる動作をします。
プログラムの中でACCEPTまたはDISPLAYの拡張機能を使用していると, DEC COBOLとVAX COBOLの動作に違いが生じることがあります。この場合, DEC COBOLは以下のように動作します。
この違いは,最初のACCEPTまたはDISPLAY文がLINE句と COLUMN句を含んでいないときに明確になります。この場合, DEC COBOLはカーソルを画面の一番上に移動してから ACCEPTまたはDISPLAYを実行しますが,VAX COBOLはカーソルを移動しません。
呼び出されたプログラムの中のEXIT PROGRAMはPERFORM範囲をリセットしません。 VAX COBOLでは,EXIT PROGRAMで脱出した後にプログラムに再び入ったとき, 以前の実行におけるすべてのPERFORM範囲が満たされています。
DEC COBOLとVAX COBOLでは,LINAGE文で大きな値を扱ったときの動作が異なります。 WRITE文のADVANCING句の行カウントが127よりも大きいと,DEC COBOLは1行進みますが, VAX COBOLでの結果は定義されていません。
符号なし計算フィールドは, 符号付き計算フィールドよりも大きな値を含むことができます。ANSI COBOL規格に従い, 符号なし項目の値は必ず正の値として扱われなくてはなりません。しかし, DEC COBOLは符号なし項目を正の値として扱いますが,VAX COBOLはこれを符号付き項目として扱います。このため,稀ではありますが, MOVE文や算術文の中で符号なしデータ項目と符号付きデータ項目を混在させたときに, VAX COBOLとDEC COBOLで異なる結果が得られることがあります。 例 11-1では, VAX COBOLとDEC COBOLで異なる値が得られます。
IDENTIFICATION DIVISION.
PROGRAM-ID. SHOW-DIFF.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 A2 PIC 99 COMP.
01 B1 PIC S9(5) COMP.
01 B2 PIC 9(5) COMP.
PROCEDURE DIVISION.
TEST-1.
MOVE 65535 TO A2.
MOVE A2 TO B1.
DISPLAY B1 WITH CONVERSION.
MOVE A2 TO B2.
DISPLAY B2 WITH CONVERSION.
STOP RUN.
B1 = -1
B2 = -1
B1 = 65535
B2 = 65535
DEC COBOLとVAX COBOLバージョン5.0以上では,SEARCH文の中でEND-SEARCH句とNEXT SENTENCE句を同時に使用することはできません。一方を使用すると, もう一方は使用できません。この規則はANSI COBOL規格に則ったものですが, バージョン5.0よりも前のVAX COBOLには適用されません。
例 11-2は,DEC COBOLとVAX COBOLで異なる動作をする,規則に反するコーディングを示しています。 この動作の違いは,VAXアーキテクチャとAlphaアーキテクチャの, レジスタ・セットにおけるアーキテクチャ上の違いが原因です。 Alphaには浮動小数点データ型専用のレジスタのセットがあります。 例 11-2に示されているようなコーディング違反は, Alphaがサポートしているどの浮動小数点データ型にも影響を及ぼします。
IDENTIFICATION DIVISION.
PROGRAM-ID. BADCODING.
ENVIRONMENT DIVISION.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 FIELDS-NEEDED.
05 CYCLE-LOGICAL PIC X(14) VALUE 'A_LOGICAL_NAME'.
01 EDIT-PARM.
05 EDIT-YR PIC X(4).
05 EDIT-MO PIC XX.
01 CMR-RETURN-CODE COMP-1 VALUE 0.
LINKAGE SECTION.
01 PARM-REC.
05 CYCLE-PARM PIC X(6).
05 RETURN-CODE COMP-1 VALUE 0.
PROCEDURE DIVISION USING PARM-REC GIVING CMR-RETURN-CODE.
P0-CONTROL.
CALL 'LIB$SYS_TRNLOG' USING BY DESCRIPTOR CYCLE-LOGICAL,
OMITTED,
BY DESCRIPTOR CYCLE-PARM
GIVING RETURN-CODE.
IF RETURN-CODE GREATER 0
THEN
MOVE RETURN-CODE TO CMR-RETURN-CODE
GO TO P0-EXIT.
MOVE CYCLE-PARM TO EDIT-PARM.
IF EDIT-YR NOT NUMERIC
THEN
MOVE 4 TO CMR-RETURN-CODE, RETURN-CODE.
IF EDIT-MO NOT NUMERIC
THEN
MOVE 4 TO CMR-RETURN-CODE, RETURN-CODE.
IF CMR-RETURN-CODE GREATER 0
OR
RETURN-CODE GREATER 0
THEN
DISPLAY "***************************"
DISPLAY "** BADCODING.COB **"
DISPLAY "** A_LOGICAL_NAME> ", CYCLE-PARM, " **"
DISPLAY "***************************".
P0-EXIT.
EXIT PROGRAM.
例 11-2では, システム・サービス呼び出しの戻り値が,実際にはバイナリ(COMP) でなければならないのに誤ってF浮動小数点値と定義されています。このプログラマは, ルーチンからのすべての戻り値はレジスタR0に返されるという VAXアーキテクチャの動作を利用していました。VAXアーキテクチャでは, 整数と浮動小数点数のレジスタが別々に存在しているわけではありません。一方, Alphaアーキテクチャは,浮動小数点データとバイナリ・データについて, 別々のレジスタ・セットを定義しています。 浮動小数点値を返すルーチンはレジスタF0を使用し, バイナリ値を返すルーチンはレジスタR0を使用します。
DEC COBOLコンパイラには,外部ルーチンが返すデータ型を知る手段はありません。 プログラマは,CALL文のGIVING-VALUE項目に対して, 正しいデータ型を指定する必要があります。Alphaアーキテクチャでは, 浮動小数点データ項目に異なるレジスタのセットが使用されるため, 生成されるコードはR0ではなくF0をテストします。
サンプル・プログラムのコード・シーケンスにおけるF0の値は予測できません。 このコーディングでも期待される動作が得られることがありますが, ほとんどの場合は失敗します。
プログラミングに使用しているプラットフォームによって, いくつかの診断メッセージは異なる意味と結果を持っています。
%COBOL-E-EXITDECL, EXIT PROGRAM statement invalid in
GLOBAL DECLARATIVE
VAX COBOLと同じ動作をさせるためには,診断の原因となった問題を修正してください。
DIVIDE 0 INTO A, B, C.
ANSI COBOL規格に従い,
どちらのコンパイラも予期しない結果を生じないで実行を続けることができます。
VAXアーキテクチャとAlphaアーキテクチャでのD浮動小数点データの記憶形式の違いにより, 実行結果の評価の際に,若干異なる答えが得られます。この差は, 最終的な結果を出力するまで何回D-floatの演算を行うかに依存します。これは, COMP-2型のデータをファイルに出力し,OpenVMS Alphaシステム上で動作するプログラムが生成する出力を OpenVMS VAXシステムが生成する出力と比較しようとした場合に問題になることがあります。
浮動小数点データ型の記憶形式の詳細については,『Alpha Architecture Handbook』 を参照してください。
DEC COBOLはVAX COBOLよりも, データ項目のハイオーダー切り捨てが生じる可能性に敏感に反応します。次の例を /WARNINGS=ALL修飾子を指定してコンパイルした場合を考えます。
WORKING-STORAGE SECTION.
01 K4 PIC 9(9) COMP.
PROCEDURE DIVISION.
01-MAIN-SECTION SECTION.
01-MAIN.
DISPLAY K4 WITH CONVERSION.
DEC COBOLは,VAX COBOLとは異なり,次のメッセージを出力します。
DISPLAY K4 WITH CONVERSION.
............^
Possible high-order truncation ...
RELATIVEファイル操作でも,この診断が生成されることがあります。
ファイルをEXTENDモードでオープンし,これをREWRITEしようとすると,DEC COBOLとVAX COBOLは異なったファイル状態値を返します。この未定義の操作に対し, DEC COBOLはファイル状態49 (互換性のないオープン・モード)を返し,VAX COBOLはファイル状態43 (対応するREAD文がない)を返します。
OpenVMS Alphaでは,ISAMファイルに動的にアクセスする場合, 参照キーがセカンダリ・キーであると,WRITE,DELETE,または REWRITEを実行したときに, 参照キーがセカンダリ・キーからプライマリ・キーに変更されます。
プラットフォームによって,RMS特殊レジスタの動作が変わることがあります。
実行時に,DEC COBOLとVAX COBOLは, 一部の入出力操作でRMS特殊レジスタの値を違った形で更新します。DEC COBOLのランタイム・システムは,RMS操作を試みる前に, いくつかの入出力エラー条件のチェックを行います。エラー条件が発生していると, DEC COBOLのランタイム・システムはRMS操作を試みず, RMS特殊レジスタは以前の値をそのまま持ち続けます。VAX COBOLのランタイム・システムは,入出力操作のチェックを行わずに, すべてのRMS操作を実行します。このため, ランタイム・システムは入出力操作のたびに,RMS特殊レジスタの値を必ず更新します。
たとえば,ファイルのオープンに成功しなかった場合,それ以降のDEC COBOLレコード操作(READ,WRITE,START,DELETE,REWRITE,またはUNLOCK)は RMSを呼び出すことなく失敗します。このため,OPEN操作の失敗の際に RMS特殊レジスタに格納された値は, 同じファイルに対してレコード操作の失敗を重ねても,変更されずに残っています。 これと同じ操作をVAX COBOLで行うと,つねにRMSが呼び出されます。これにより, RMSは未定義の操作を試み,RMS特殊レジスタに新しい値を返します。
RMS特殊レジスタがDEC COBOLアプリケーションとVAX COBOLアプリケーションで異なる値を持つ場合がもう1つあります。 DEC COBOLファイルに対するRMS操作が成功すると,RMS特殊レジスタは必ず RMS完了コードを含んでいます。VAX COBOLファイルに対するRMS操作が成功すると, RMS特殊レジスタは通常はRMS完了コードを含んでいますが, COBOL固有の完了コードを含んでいることもあります。
DEC COBOLでは,VAX COBOLとは異なり, 以下に示すコンパイラ生成変数をユーザ変数として宣言することはできません。
DEC COBOLとVAX COBOLは, 共用可能イメージとしてインストールされた副プログラムを呼び出すときの動作が異なります。 DEC COBOLでは, CALL文で指定するプログラム名ではリテラルまたはデータ名が使用できます( CANCEL文でも同じです)。VAX COBOLでは,CALL文(またはCANCEL文) で指定するプログラム名はリテラルでなくてはなりません。また, 共用可能イメージとしてインストールされたVAX COBOLプログラムは, 外部ファイルを含むことができません(共用可能イメージの詳細については, 『OpenVMS Linker Utility Manual』を参照してください)。
複数のプロセスで共通ブロックを共用する場合には,DEC COBOLプログラムをリンクするときの問題を防ぐために,PSECT属性を SHRに設定します(省略時の値は,OpenVMS AlphaシステムではSHR,OpenVMS VAXシステムではNOSHRです)。また,次のように, 共用可能イメージのリンカ・オプション・ファイルにSYMBOL_VECTORを追加します。
SYMBOL_VECTOR = (psect-name = PSECT)
詳細については,『OpenVMS Linker Utility Manual』を参照してください。
DEC COBOLとVAX COBOLでは,プラットフォームによって, いくつかの算術演算の動作が異なります。
COMPUTE D = (A / B) / C.
. . . は次のように書くことができます。
COMPUTE TMP1 = A / B.
COMPUTE D = TMP1 / C.
A/B という計算に使用される精度は,TMP1の宣言によって決定されます。
-check decimalがあります。これらの機能は,
プログラムのDEC COBOLへの移行を行うときに特に便利です。
別のプログラミング言語で作成されたファイルは, 言語と文字セットの互換性がないために,特殊な処理が必要な場合があります。 最もよく見られる互換性上の問題は, データ型とデータ・レコードのフォーマットです。 以下の点に注意してください。
データ型はプログラミング言語およびユーティリティによって異なります。 たとえば,DEC Fortranはパックされた10進データ型をサポートしていないので, COBOLファイルの中のPACKED-DECIMALデータを簡単には利用できません。
データ型の互換性の問題を回避するためには,以下のテクニックが利用できます。
次の例では,入力ファイルはEBCDICで作成されています。この場合, OpenVMS Alphaオペレーティング・システム上では, COBOL以外のどの言語でも処理が難しいファイルが作成されてしまいます。
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. ALPHABET FOREIGN-CODE IS EBCDIC.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT-FILE ASSIGN TO "INPFIL"
CODE-SET IS FOREIGN-CODE.
.
.
.
以下に,DEC COBOLには含まれているが,VAX COBOLには含まれていない X/OPENの予約語を示します。
| AUTO | EXCLUSIVE | REQUIRED |
| AUTOMATIC | FOREGROUND-COLOR | RETURN-CODE |
| BACKGROUND-COLOR | FULL | REVERSE-VIDEO |
| BLINK | HIGHLIGHT | SECURE |
| EOL | LOWLIGHT | UNDERLINE |
| EOS | MANUAL |
コマンド行修飾子/RESERVED_WORDS=NOXOPENを指定すると, これらの予約語は予約語でない単語として扱われます。
DEC COBOLのデバッガ・サポートは,VAX COBOLといくつかの点で異なります。
%COBOL-I-DEBUGOPT, /NOOPTIMIZE is recommended with /DEBUG
このメッセージは,/DEBUGを指定したときに,
最適化に関する指定を何も行っていない場合に表示されます(
コンパイラの省略時の設定は/OPTIMIZEです)。
省略時にはオフになっている他の情報メッセージとは異なり,DEC
COBOLコンパイラでは,このメッセージは
/WARN=NOINFOが有効になっているときでもつねに表示されます。
メッセージをオフにするには,COBOLコマンド行上で修飾子
/[NO]OPTIMIZEを何らかの形式で指定します(/NOOPTIMIZE,/OPTIMIZE,
/OPTIMIZE=LEVEL=xなど)。
このVAX COBOLとの違いは,プログラムのデバッグに役立つことがあります。 これらのメッセージは情報メッセージなので, コンパイラはリンクと実行が可能なオブジェクト・ファイルを生成します。ただし, このメッセージが表示されたときには, プログラムの構造が意図と異なるものになっていると思われるので, 検出されないロジック・エラーが存在している可能性が高いといえます。
DEC COBOLはDECset/LSE Program Design Facility,/DESIGN修飾子, デザイン・コメント,および疑似コード・プレースホルダをサポートしていません。
DEC COBOLのOracle DBMSサポートには,プログラムをDEC COBOLとVAX COBOLのどちらで開発しているかに応じて,いくつかの違いがあります。 DEC COBOLでマルチストリームOracle DBMS DMLを使用する際には, 異なるソース・ファイルからは異なるスキーマまたはストリームにアクセスする必要があります。
この節では,Digital Fortran for OpenVMS AlphaシステムとDigital Fortran 77 for OpenVMS VAX Systems (以前の名前はVAX FORTRAN) の互換性について,次の分野に分けて説明します。
Digital Fortran for OpenVMS Alphaには,ANSI FORTRAN-77とISO/ANSI Fortran 9xの標準機能が含まれており,さらにこれらのFortran標準機能に対して, Digital Fortran 77 for OpenVMS VAX Systemsの拡張機能も含まれています。 たとえば,次の拡張機能が含まれています。
拡張機能と言語機能の詳細については, Fortran言語の参照マニュアルを参照してください。このマニュアルには, FORTRAN-77標準の拡張機能が示されています。
この節のこの後の部分では,Digital Fortran 77 for OpenVMS VAX Systemsと Digital Fortran for OpenVMS Alpha固有の言語機能,各言語で共用されるものの, 異なる方法で解釈される言語機能,Digital Fortran 77 for OpenVMS VAX Systemsには適用されないDigital Fortran for OpenVMS Alpha制限事項, データを移植する場合の検討事項について説明します。
- 注意
- Digital Fortran for OpenVMSでは,DEC Fortran for OpenVMS Alphaと ISO/ANSI Fortran 90標準でサポートされる FORTRAN-77言語の拡張機能の大部分がサポートされます。互換性については, 『DEC Fortran 90 User Manual for OpenVMS Alpha Systems』を参照してください。
次の言語機能はDigital Fortran for OpenVMS Alphaでは提供されますが, Digital Fortran 77 for OpenVMS VAX Systemsのバージョン6.4ではサポートされません。
Digital FortranはLIB$ESTABLISHをDEC Fortran RTL固有のエントリ・ポイントにするために宣言を変換します。
Digital Fortran言語機能についての説明は,『Fortran language reference manual』を参照してください。
- 注意
- Digital Fortran 90コンパイラを使用しているユーザに対する注意事項ですが, ANSI/ISO Fortran 90標準に準拠したいくつかの機能が Digital Fortran 77では使用できません。
次の言語機能はDigital Fortran 77 for OpenVMS VAX Systemsでは使用できますが, Digital Fortran for OpenVMS Alphaではサポートされません。
| ASSIGN CLOSE ERRSET |
ERRTST FDBSET IRAD50 |
RAD50 R50ASC USEREX |
既存のプログラムを移植する場合には,ASSIGN,CLOSE,および FBDSETの呼び出しは適切なOPEN文に変更しなければなりません(Digital Fortran for OpenVMS AlphaではDEFINE FILE文をサポートしますが, 同時にDEFINE FILE文の変換についても考慮しなければなりません)。
ERRSETおよびERRTSTのかわりにOpenVMSの条件処理を使用できます。Digital Fortran for OpenVMS AlphaはERRSNSサブルーチンをサポートします。
既存のプログラムを移植する場合には,radix-50定数とIRAD50,RAD50,および R50ASCルーチンは,CHARACTERとして宣言したデータを使用して, ASCIIでエンコーディングしたデータに変更しなければなりません。
Digital Fortran 77 for OpenVMS VAX Systemsの特定の機能は, Digital Fortran for OpenVMS Alphaでは使用が制限されているか, またはまったく提供されません。
SUBROUTINE F_INIT (A, N)
REAL A(N)
RETURN
ENTRY F_DO_IT (X, I)
A (I) = X ! No: A no longer visible
RETURN
END
特定の例外の処理方法は, OpenVMS VAXシステムとOpenVMS Alphaシステムとで異なります。 正確な例外ハンドラ制御の要求には, /SYNCHRONOUS_EXCEPTIONS修飾子を使用してください。
Alphaの命令セットでは,D浮動小数点REAL*8フォーマットがサポートされないため, D浮動小数点データは演算中にソフトウェアによってG浮動小数点に変換され,その後, D浮動小数点フォーマットに戻されます。したがって,VAXシステムと Alphaシステムとの間には,D浮動小数点の演算に違いがあります。
Alphaシステムで最適な性能を実現するには,VAX G浮動小数点またはIEEE T浮動小数点フォーマットでのREAL*8データの使用を考慮する必要があり, おそらくフォーマットを指定するために/FLOAT修飾子を使用します。 D浮動小数点データをG浮動小数点データまたは T浮動小数点フォーマットに変換するためのDigital Fortran for OpenVMS Alphaアプリケーション・プログラムを作成するには,『DEC Fortran Language Reference Manual』で説明するファイル変換方式を使用します。
ベクタ化は,/VECTOR修飾子とそれに関連する修飾子および CDEC$ INIT_DEP_FWDディレクティブも含めてサポートされません。Alphaプロセッサは, ベクタ化機能に類似した機能としてパイプライン機能や他の機能を提供します。
次の言語機能は,Digital Fortran 77 for OpenVMS VAX SystemsとDigital Fortran for OpenVMS Alphaとで異なる方法で解釈されます。
Digital Fortran for OpenVMS AlphaのRAN関数は,同じランダム・シードに対して Digital Fortran 77 for OpenVMS VAX Systemsの場合と異なる数値パターンを生成します( RAN関数とRANDU関数はDigital Fortran 77 for OpenVMS VAX Systemsとの互換性を維持するために提供されます)。
次のいずれかの場合には,Digital Fortran 77 for OpenVMS VAX SystemsとDigital Fortran for OpenVMS Alphaは異なる動作をします。
CHARACTER*(*) FMT2
PARAMETER (FMT2='(10Habcdefghij)')
READ (5, FMT2)
WRITE (6, FMT2)
READ (5, '(10Habcdefghij)')
WRITE (6, '(10Habcdefghij)')
Digital Fortran 77 for OpenVMS VAX Systemsでは, READ文によって読み込まれた値が大部分の出力になります。(FMT2は無視されます), Digital Fortran for OpenVMS Alphaでは,WRITE文の出力は"abcdefghij"になります( つまり,READ文によって読み込まれた値は WRITE文によって書き込まれる値に影響を与えません)。
Digital Fortran for OpenVMS AlphaとDigital Fortran 77 for OpenVMS VAX Systemsでは,大部分の修飾子が共通ですが, 一部の修飾子はどちらか一方のプラットフォームでしか使用できません。 この節では,Digital Fortran for OpenVMS Alphaと Digital Fortran 77 for OpenVMS VAX Systemsのコマンド行の修飾子の相違点を要約します。
Digital Fortran for OpenVMS Alphaのコンパイル・コマンドとオプションについての詳しい説明は, 『DEC Fortran User Manual for OpenVMS AXP Systems』を参照してください。 Digital Fortran 77 for OpenVMS VAX Systemsのコンパイル・コマンドとオプションについての詳しい説明は 『DEC Fortran User Manual for OpenVMS VAX Systems』を参照してください。
VAXシステムまたはAlphaシステムでコンパイルを開始するには, FORTRANコマンドを使用します。Alphaシステムでは,F90コマンドを使用してDigital Fortran 90コンパイラによるコンパイルを開始します。
表 11-7はDigital Fortran for OpenVMS Alphaコンパイラ修飾子のうち,Digital Fortran 77 for OpenVMS VAX Systemsのオプションがなく,Digital Fortran 77 for OpenVMS VAX Systemsのバージョン6.4でサポートされない修飾子を示しています。
この節では,Digital Fortran 77 for OpenVMS VAX Systemsコンパイラのオプションのうち, Digital Fortran for OpenVMS Alpha修飾子に対応するオプションがないものをまとめます。
表 11-8は,Digital Fortran 77 for OpenVMS VAX Systemsのバージョン6.4固有のコンパイル・オプションを示しています。
| Digital Fortran 77 for OpenVMS VAX Systems修飾子 |
説明 |
|---|---|
| /BLAS=(INLINE,MAPPED) | Digital Fortran 77 for OpenVMS VAX Systemsが Basic Linear Algebra Subroutines (BLAS)を認識し, これらをインラインまたはマッピングするかどうかを指定する。 Digital Fortran 77 for OpenVMS VAX Systemsの場合にのみ使用できる。 |
| /CHECK=ASSERTIONS | アサーション・チェックを許可または禁止する。 Digital Fortran 77 for OpenVMS VAX Systemsに対してのみ使用できる。 |
| /DESIGN=[NO]COMMENTS /DESIGN=[NO]PLACEHOLDERS |
設計情報を確認するためにプログラムを解析する。 |
| /DIRECTIVES=DEPENDENCE | 指定されたコンパイラ・ディレクティブがコンパイル時に使用されるかどうかを指定する。 Digital Fortran 77 for OpenVMS VAX Systemsに対してのみ使用できる。 |
| /PARALLEL=(MANUALまたは AUTOMATIC) |
並列処理をサポートする。 |
| /SHOW=(DATA_DEPENDENCIES, DICTIONARY,LOOPS) |
リスト・ファイルに次の情報を登録するかどうかを制御する。
|
| /VECTOR | ベクタ処理を要求する。 Digital Fortran 77 for OpenVMS VAX Systemsに対してのみ使用できる。 |
| /WARNINGS=INLINE | コンパイラが組み込みルーチンに対する参照のインライン・コードを生成できないときに, 情報診断メッセージを印刷するかどうかを制御する。Digital Fortran 77 for OpenVMS VAX Systemsに対してのみ使用できる。 |
要求された(手作業)分解に関連するすべてのCPAR$ディレクティブと特定の CDEC$ディレクティブ,およびそれに関連する修飾子またはキーワードも Digital Fortran 77 for OpenVMS VAX Systems固有です。『DEC Fortran Language Reference Manual』を参照してください。
Digital Fortran 77 for OpenVMS VAX Systems のコンパイル・コマンドとオプションに関する詳しい説明は『DEC Fortran User Manual for OpenVMS VAX Systems』を参照してください。
Digital Fortran for OpenVMS Alphaを使用すれば,イメージ起動時(実行時) にトランスレートされたイメージと相互操作可能なイメージを作成できます。
トランスレートされた共有可能イメージの使用を可能にするには, 次の操作を実行します。
プログラムでは,組み込み名を使用しなければならず(接頭辞を除く), 完全な名前(fac$xxxx)でルーチンを呼び出すわけではありません。
プログラムは,完全な( fac$xxxx)名前によってルーチンを呼び出すのではなく, 内部名(接頭辞を除く名前)を使用しなければなりません。ただし, fac$xxxxという名前を使用できる1つの例外があります。 トランスレートされたイメージ・プログラムでは,FOR$RABシステム関数を EXTERNALとして宣言できます。ネイティブなAlphaプログラムでは, FOR$RABを内部関数として使用しなければなりません。
レコード・タイプは,Digital Fortran 77 for OpenVMS VAX Systemsでも Digital Fortran for OpenVMS Alphaでも同じです。必要な場合には, EXCHANGEコマンドと/NETWORK修飾子および /TRANSFER=BLOCK修飾子を使用してデータを移植してください。 コピー操作でファイルをStream_LFフォーマットに変換するには, /TRANSFER=BLOCKのかわりに/TRANSFER=(BLOCK,RECORD_SEPARATOR=LF)を使用するか, またはEXCHANGEコマンドで/FDL修飾子を使用して, レコード・タイプや他のファイル属性を変更します。
フォーマッティングされていない浮動小数点データを変換しなければならない場合には, Digital Fortran 77 for OpenVMS VAX Systemsプログラム(VAXハードウェァ)が REAL*4またはCOMPLEX*8データをF浮動小数点フォーマットで格納し,REAL*8または COMPLEX*16データをD浮動小数点またはG浮動小数点フォーマットで格納し, REAL*16データをH浮動小数点フォーマットで格納することを念頭においてください。 Digital Fortran for OpenVMS Alphaプログラム( Alphaハードウェアで実行されるプログラム)は,REAL*4,REAL*8,COMPLEX*8, およびCOMPLEX*16データをそれぞれ, 表 11-9に示すフォーマットのいずれかで格納します。
| データ宣言 | VAXフォーマット | Alphaフォーマット |
|---|---|---|
| REAL*4とCOMPLEX*8 | VAX F浮動小数点フォーマット | IEEE S浮動小数点またはVAX F浮動小数点フォーマット |
| REAL*8とCOMPLEX*16 | VAX D浮動小数点またはG浮動小数点フォーマット | IEEE T浮動小数点,VAX D浮動小数点[1] またはVAX G浮動小数点フォーマット |
| REAL*16とCOMPLEX*32 | VAX H浮動小数点 | Digital Fortran for OpenVMS Alphaではサポートされない。 おそらくRTLルーチンCVT$CONVERT_FLOATを使用して変換しなければならない。 |
| [1] Alphaシステムでは,演算を実行するときに VAX D浮動小数点フォーマット使用することは望ましくない。このような場合には, Digital Fortran for OpenVMS Alphaの変換ルーチンを使用する変換プログラムで D浮動小数点フォーマットをIEEE T浮動小数点(またはVAX G浮動小数点)フォーマット に変換することを考慮しなければならない。 | ||
この節では,DEC Pascalと他のDECのPascalコンパイラを比較し, VAXシステムとAlphaシステムのDEC Pascalの違いを示します。 これらの機能の完全な説明については,『DEC Pascal Language Reference Manual』 を参照してください。
表 11-10は以前VAX Pascal では提供されていなかった機能を示します。
DEC Pascalでは,LIB$ESTABLISHの代わりに使用するために,ESTABLISHと REVERTという組み込みルーチンが提供されます。 LIB$ESTABLISHを宣言して使用しようとすると,コンパイル時に警告が出されます。
DEC Pascalでは,フィールド・アラインメントの位置や,POS,ALIGNED, DATA属性およびデータ・コンパイラ切り替えの位置を上書きすることが可能です。
互換性を維持するためにDEC Pascalは,表 11-11 に示されるあらかじめ宣言されている名前を含むプログラムをコンパイルすることができますが, 弊社では以下のように識別子を置き換えて使用されることをお勧めします。
| 識別子 | 望ましい使用法 |
|---|---|
| ADDR | ADDRESS機能をご使用ください |
| ALFA | TYPE ALFA = PACKED ARRAY [1..10]OFCHARと同じ |
| BITAND | UAND文と同じ |
| BITNOT | UNOT文と同じ |
| BITOR | UOR文と同じ |
| BITXOR | UXOR文と同じ |
| EXIT | BREAK文と同じ |
| FIRST,FIRSTOF | LOWER機能と同じ |
| HBOUND | UPPER機能と同じ |
| IN_RANGE | サブレンジ・チェックができない場合のみ有効。 IN_RANGE(X)は(X>LOWER(X))AND(X<UPPER(X))と同じ |
| INTSET | TYPE INTSET = SET OF 0 .. 255;と同じ |
| LAST, LASTOF | UPPER機能と同じ |
| LBOUND | LOWER機能と同じ |
| LSHFT | LSHIFT機能と同じ |
| MESSAGE | WRITELN(ERR,expression)と同じ |
| NEXT | CONTINUE文と同じ |
| NULL | empty文と同じ |
| REMOVE | DELETE_FILEプロシージャと同じ |
| RSHFT | RSHIFT機能と同じ |
| SIZEOF | SIZE機能と同じ |
| STLIMIT | コンパイルするが,エラーを返さない |
| UNIV_PTR | TYPE UNIV_PTR=POINTER;と同じ |
DEC Pascalはコンパイルされたプラットフォームと同じプラットフォーム( オペレーティング・システムとハードウェアの組み合わせ) でのみ環境ファイルを使用できます。
さらに,VAXシステムでのみサポートされるDEC Pascalの機能を以下に示します。
以下にAlphaシステムでのみサポートされるDEC Pascalの機能を示します。
この節では,サポートされてはいても使用が勧められない機能について説明します。 これらは,弊社の他のPascalコンパイラとの互換性のためにのみ提供されます。
/OLD_VERSION修飾子は,コンパイラにVAX Pascalバージョン1.0 の言語の定義を使用して,VAX Pascalバージョン1.0 とその後のバージョンの違いを解決させます。この修飾子を指定すれば, 既存のプログラムを引き続き使えます。
/G_FLOATING修飾子は,コンパイラにDOUBLE型の値に対して G_floatingの表現と命令を使用することを指定します。 [[NO]G_FLOATING]属性はOpenVMS VAXシステムでも OpenVMS Alphaシステムでも指定できます。
/G_FLOATING修飾子の使用が, ソース・プログラムやモジュール内で指定された倍精度属性と矛盾するときは, エラーとなります。 倍精度数の受け渡しを行うルーチンやコンパイル単位間で複数の浮動小数点フォーマットを混在させることはできません。 すべてのOpenVMS VAXプロセッサがG浮動小数点データ型をサポートするわけではありません。
これより前に,コンパイラが浮動小数点データ型を指定する方法だった, /FLOAT修飾子の説明も参照してください。/FLOAT修飾子は, AlphaシステムのみでサポートされるIEEE浮動小数点データ型も選択できます。
OVERLAID属性はコンパイル単位で宣言された変数へ, 記憶領域がどのように割り当てられるかを指定します。 コンパイル・ユニットでOVERLAIDが指定されると, プログラムやモジュール・レベルで宣言された変数は(STATICまたは PSECT属性を持たない限り),すべての他の上書きされたコンパイル・ユニットで, 静的変数の記憶領域を上書きします。
この属性は,VAX Pascalバージョン1.0 で提供された分割コンパイル機能を用いているプログラムでの使用のみを対象としています。