前へ | 次へ | 目次 | 索引 |
/SEPARATE_COMPILATION修飾子を指定すると,リスティングが個別に生成されます。/SEPARATE_COMPILATIONを 指定せずにコンパイルされた分割コンパイル・プログラム(SCP)では,リスティングは以下のようになります。
/SEPARATE_COMPILATIONを指定したときの結果は以下のようになります。
これは VAX COBOL が生成するリスティングと同じであることに注意してください。
11.3.3.3 出力のフォーマッティング
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フォーマットでレポートを生成します (ソース・ファイル・リスト項目がプラス(+)記号で区切られている場合には動作が異なります)。
11.3.3.4 DEC COBOL と VAX COBOL の文の違い
以下の COBOL 文は,DEC COBOL と VAX COBOL で異なる動作をします。
プログラムの中でACCEPTまたはDISPLAYの拡張機能を使用していると,DEC COBOL と VAX COBOL の動作に違いが生じることがあります。この場合,DEC COBOL は以下のように動作します。
呼び出されたプログラムの中のEXIT PROGRAMはPERFORM範囲をリセットしません。VAX COBOL では,EXIT PROGRAMで脱出した後にプログラムに再び入ったとき,以前の実行におけるすべてのPERFORM範囲が満たされています。
11.3.3.4.3 LINAGE句
DEC COBOL と VAX COBOL では,LINAGE文で大きな値を扱ったときの動作が異なります。WRITE文のADVANCING句の行カウントが 127よりも大きいと,DEC COBOL は1行進みますが,VAX COBOL での結果は定義されていません。
11.3.3.4.4 MOVE文
符号なし計算フィールドは,符号付き計算フィールドよりも大きな値を含むことができます。ANSI COBOL 規格に従い,符号なし項目の値は必ず正の値として扱われなくてはなりません。しかし,DEC COBOL は符号なし項目を正の値として扱いますが,VAX COBOL はこれを符号付き項目として扱います。このため,稀ではありますが,MOVE文や算術文の中で符号なしデータ項目と符号付きデータ項目を混在させたときに,VAX COBOL と DEC COBOL で異なる結果が得られることがあります。
例 11-1 では,VAX COBOL と DEC COBOL で異なる値が得られます。
例 11-1 符号付きと符号なしの違い |
---|
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 |
11.3.3.4.5 SEARCH文
DEC COBOL と VAX COBOL バージョン5.0以上では,SEARCH文の中でEND-SEARCH句とNEXT SENTENCE句を同時に使用することはできません。一方を使用すると,もう一方は使用できません。この規則はANSI COBOL 規格に則ったものですが,バージョン5.0よりも前の VAX COBOL には適用されません。
11.3.3.5 システムの戻りコード
例 11-2 は,DEC COBOL と VAX COBOL で異なる動作をする,規則に反するコーディングを示しています。この動作の違いは,VAX アーキテクチャと Alpha アーキテクチャの,レジスタ・セットにおけるアーキテクチャ上の違いが原因です。Alpha には浮動小数点データ型専用のレジスタのセットがあります。
例 11-2 に示されているようなコーディング違反は,Alpha がサポートしているどの浮動小数点データ型にも影響を及ぼします。
例 11-2 戻り値の誤ったコーディング |
---|
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の値は予測できません。このコーディングでも期待される動作が得られることがありますが,ほとんどの場合は失敗します。
11.3.3.6 診断メッセージ
プログラミングに使用しているプラットフォームによって,いくつかの診断メッセージは異なる意味と結果を持っています。
%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』を参照してください。
11.3.3.8 データ項目のハイオーダー切り捨て
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ファイル操作でも,この診断が生成されることがあります。
11.3.3.9 ファイルの状態値
ファイルをEXTENDモードでオープンし,これをREWRITEしようとすると,DEC COBOL と VAX COBOL は異なったファイル状態値を返します。この未定義の操作に対し,DEC COBOL はファイル状態 49 (互換性のないオープン・モード)を返し,VAX COBOL はファイル状態 43 (対応する READ 文がない)を返します。
11.3.3.10 参照キー
OpenVMS Alpha では,ISAMファイルに動的にアクセスする場合,参照キーがセカンダリ・キーであると,WRITE,DELETE,またはREWRITEを実行したときに,参照キーがセカンダリ・キーからプライマリ・キーに変更されます。
11.3.3.11 RMS特殊レジスタ
プラットフォームによって,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 とは異なり,以下に示すコンパイラ生成変数をユーザ変数として宣言することはできません。
RMS_STS
RMS_STV
RMS_CURRENT_STS
RMS_CURRENT_STV
DEC COBOL と VAX COBOL は,共用可能イメージとしてインストールされた副プログラムを呼び出すときの動作が異なります。DEC COBOL では,CALL文で指定するプログラム名ではリテラルまたはデータ名が使用できます(CANCEL文でも同じです)。VAX COBOL では,CALL文(またはCANCEL文)で指定するプログラム名はリテラルでなくてはなりません。また,共用可能イメージとしてインストールされた VAX COBOL プログラムは,外部ファイルを含むことができません(共用可能イメージの詳細については,『OpenVMS Linker Utility Manual』を参照してください)。
前へ | 次へ | 目次 | 索引 |