前へ | 次へ | 目次 | 索引 |
VAX COBOLは同じ働きをする2つの修飾子,/STANDARD=[NO]SYNTAX と /WARNINGS=[NO]STANDARD.を提供します。
DEC COBOL は/WARNINGS修飾子の [NO]STANDARDオプションをサポートしません。したがって,DEC COBOLコンパイラで/WARNING=ALLを指定してもDECの拡張機能に関する情報メッセージは出力されません。次のようなメッセージを出力するには,/STANDARD=SYNTAX を指定しなければなりません。
%COBOL-I-EXTENSION |
VAX COBOLとDEC COBOLにおいて,/FLAGGER[(option,...)] を指定したときにコンパイラが出力するDECの拡張機能に関するFIPSメッセージは,引き続き/WARNINGS=INFORMATIONオプションによって制御されます。 |
/TIE(Translated Image Environment)修飾子は,ネイティブなAXPイメージがトランスレートされたイメージを呼ぶこと,および,トランスレートされたイメージがネイティブなAXPイメージを呼ぶことを許可します。この修飾子は,AXPシステムでのみサポートされます。
/TIEを指定すると,コンパイルしたコードからトランスレートされたイメージを呼ぶことも,逆にトランスレートされたイメージからそのコードを呼ぶこともできるため,コンパイルしたコードをトランスレートされた共有イメージと共に使用できます。/TIEを指定したときには,LINKコマンドの/NONATIVE_ONLY修飾子を使ってオブジェクト・モジュールをリンクしなければなりません(/NONATIVE_ONLY修飾子に関して詳しくは,『OpenVMS Linker Utility Manual』を参照してください)。
/NOTIE(省略時設定)を指定すると,コンパイルされたコードはトランスレートされたイメージと関連を持ちません。
相互操作性について詳しくは,第 6 章 を参照してください。トランスレートされたイメージについては,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。
A.3.2.9 VAX COBOLからDEC COBOLへのプログラムの変換
VAX COBOL バージョン 5.1 は,/STANDARD=OPNVMS_AXPオプションにより,AXPの DEC COBOLでは有効でない,VAX COBOLプログラムの言語機能を判定する新しいフラグ・システムを提供します。
/STANDARD=OPENVMS_AXP(および /WARNINGS=ALLまたは/WARNINGS=INFORMATIONAL)を指定すると,VAX COBOLコンパイラはDEC COBOLでは有効でない言語機能にフラグを立てる情報メッセージを生成します。DEC COBOLでコンパイルする前にプログラムを変更するために,このメッセージを使用することができます。
情報メッセージを出さないときは,/STANDARD=NOOPENVMS_AXP(省略時設定)を使用してください。
A.3.2.10 プログラムの構造
いくつかの場合,DEC COBOLコンパイラは到達不能なコードまたは論理エラーについて,VAX COBOLコンパイラよりも完全なメッセージを生成します。
次の例はサンプル・プログラムとDEC COBOLコンパイラが出力するメッセージを示しています。
ソース・ファイル:
IDENTIFICATION DIVISION. PROGRAM-ID. T1. ENVIRONMENT DIVISION. PROCEDURE DIVISION. P0. GO TO P1. P3. GO TO P2. P2. DISPLAY "This is unreachable code". P1. STOP RUN. IDENTIFICATION DIVISION. PROGRAM-ID. T2. ENVIRONMENT DIVISION. PROCEDURE DIVISION. P0. DISPLAY "This is unreachable code". EXIT PROGRAM. END PROGRAM T2. END PROGRAM T1. |
VAX システムの場合:
$ COBOL /ANSI/WARNINGS=ALL T1.COB |
AXP システムの場合:
$ COBOL/ANSI/OPT/WARNINGS=ALL T1.COB PROGRAM-ID. T2. ...................^ %COBOL-I-UNCALLED, routine T2 can never be called at line number 14 in file DISK$YOURDISK:[TESTDIR]T1.COB;1 P2. ........^ %COBOL-I-UNREACH, code can never be executed at label P2 at line number 9 in file DISK$YOURDISK:[TESTDIR]T1.COB;1 |
同じプログラムに対し,VAX COBOLコンパイラは到達不能なラベルと到達不能なサブプログラムの両方を検出しても,メッセージを出しません。
DEC COBOLコンパイラに呼ばれていないルーチンの分析をさせるには,/OPTIMIZE修飾子を使用してください。コンパイラは,省略時の(簡単な)レベルの最適化をするために到達不能なコードの分析を行います。
このVAX COBOLとの違いは,プログラムをデバッグするときに役立ちます。これらのメッセージは情報メッセージなので,コンパイラはオブジェクト・ファイルを生成し,それをリンクおよび実行することができます。しかし,これらのメッセージは検出されていない論理エラーを示すこともあります(その場合,プログラムはおそらく期待した動作をしません)。
A.3.2.11 COPY 文とREPLACE 文
DEC COBOL コンパイラはCOBOLプログラムのCOPY文に対する注釈を表示するときに,異なった出力を生成します。
次の2つの例は,VAX COBOLコンパイラとDEC COBOLコンパイラでは,Lという文字の位置が異なるように,注釈の表示の位置に違いがあることを示しています。
VAX COBOL ソース・ファイル:
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 ソース・ファイル:
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. |
DEC COBOLコンパイラはまた,次の例に示すように複数のCOPY文を1行にしたCOBOL プログラムの表示では,異なった出力を生成します。コンパイラが置き換えられた行にメッセージを出すとき,メッセージ・ポインタは置きかわったテキストではなく,もとのテキストを呼び出します。
VAX COBOL ソース・ファイル:
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. |
DEC COBOL ソース・ファイル:
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. |
COBOLソースのREPLACE文とDATECOMPILED文の診断を行うと,コンパイラはソース・プログラムの一部の行を複数表示します。
DEC COBOLプログラムのREPLACE文では,置きかわったテキストにコンパイラがメッセージを出したときは,コンパイラ・メッセージがプログラム中のもとのテキストに対応します。VAX COBOLプログラムでは,しかし,コンパイラ・メッセージは置きかわったテキストに対応します。
以下の2つの例で示すように,COPY文が行の中央にテキストを挿入すると,DEC COBOLプログラムとVAX COBOLプログラムに対するコンパイラの表示は異なります。
DEC COBOL ソース・ファイル:
----------------------------------------------------------- 13 P0. MOVE COPY LCOP5D. TO ALPHA. L 14 "O" |
VAX COBOL ソース・ファイル:
----------------------------------------------------------- 13 P0. MOVE COPY LCOP5D. 14L "O" 15C TO ALPHA. |
LCOP5D.LIB は "O" というテキストを含んでいます。DEC COBOL コンパイラはその行をそのままにして,COPYファイルの内容をソース行の後に挿入します。VAX COBOLコンパイラはソース行を2行に分けます。
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 バージョン:
----------------------------------------------------------------- 1 REPLACE ==A VERY LONG STATEMENT== by ==EXIT PROGRAM==. 2 EXIT PROGRAM. 6 DISPLAY "To REPLACE or not to REPLACE". |
VAX COBOL バージョン:
----------------------------------------------------------------- 1 REPLACE ==A VERY LONG STATEMENT== by ==EXIT PROGRAM==. 2 EXIT PROGRAM. 3 DISPLAY "To REPLACE or not to REPLACE". |
符号なしのCOMPUTIONAL(COMP)ファイルは符号つきCOMPTIONAL(COMP)ファイルよりも大きな値を持つことができます。ANSI COBOL規格に従って,符号なし項目の値は正の値として扱われることになっています。しかし,DEC COBOLが符号なし項目を正の値として扱うのに対し,VAX COBOLは符号なし項目を符号つき項目として扱います。したがっていくつかの稀な場合,MOVE文や演算文の中の符号なしと符号付きのデータの混在は,VAX COBOLとDEC COBOLで異なった結果をもたらします。
次のサンプル・プログラムは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. |
VAX COBOL の結果:
B1 = -1 B2 = -1 |
DEC COBOL の結果:
B1 = 65535 B2 = 65535 |
プログラムでACCEPTかDISPLAYの拡張機能を使用する場合,DEC COBOLコンパイラは DEC SMG(Screen Manager)を使用します。DEC COBOLとVAX COBOLの動作の違いの目に見える部分は以下のとおりです。
DEC COBOLコンパイラとVAX COBOLコンパイラは,LINAGE文で大きな値を扱ったときに,動作の違いを表わします。WRITE文のADVANCING句の行カウントが127より大きいと,DEC COBOLは1行進みますが,VAX COBOLの結果は定義されていません。
A.3.2.15 ファイル状態の違い
EXTENDモードでファイルをオープンし,それをREWRITEしようとすると,DEC COBOLコンパイラとVAX COBOLコンパイラは異なったファイル状態コードを報告します。DEC COBOLは49(互換性のないオープン・モード)と報告し,VAX COBOLはエラーの43(対応するREAD文がない)と報告します。
DEC COBOL はSTARTが失敗した後でファイル状態コードを46にセットします。VAX COBOLはこのような結果を生成しません。
A.3.2.16 システム・サービス・コールからの戻り値
次の例はVAXシステムでは正しく動作してしまうが,AXPシステムでは同じ動作にならない,規則に反するコーディングです。この動作の違いはVAXアーキテクチャと Alpha AXPアーキテクチャ間の,レジスタ・セットにおけるアーキテクチャ的な違いを示しています。つまり,AXPシステムでの動作の違いは,浮動小数点データ型に使用されるレジスタ・セットの使用法の違いによるものです。
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. |
サンプル・プログラムの中では,プログラマが,バイナリ(COMP)であるべきシステム・サービスー・コールの戻り値を,F浮動小数点と間違って定義しています。プログラマは次のようなVAXのやり方に従っているのです。VAXアーキテクチャでは,ルーチンからのすべての戻り値がR0レジスタに返されます。VAXアーキテクチャには整数と浮動小数点に用途を特定したレジスタはありません。Alpha AXP アーキテクチャは浮動小数点データとバイナリ・データに別々のレジスタ・セットを定義します。特に,浮動小数点の値を返すルーチンはそれらをF0レジスタに返し,バイナリの値を返すルーチンはそれらをR0レジスタに返します。
DEC COBOLコンパイラは外部のルーチンが返したデータのデータ・タイプを決める方法を持っていません。CALL文のGIVING-VALUE項目には正しいデータ・タイプを指定しなければなりません。AXPシステムでは,浮動小数点データ項目に使われるレジスタ・セットが異なるので,生成されたコードはR0のかわりにF0をテストしています。
サンプル・プログラムでは,F0の値がコード・シーケンスのなかでは完全に不定値です。このコーディングの例は期待する動作を生成する場合もありますが,ほとんどの場合そうはなりません。
A.3.2.17 倍精度データ項目における記憶領域の違い
VAXアーキテクチャとAlpha AXPアーキテクチャでのD浮動小数点データの記憶領域の違いにより,実行結果の評価の際,わずかに異なった答えを生成します。この差は最終的な結果を出力するまで何回D_floatの演算を行うかによって大きくなります。COMP-2型のデータを出力する場合,OpenVMS AXPで動作するプログラムの出力がOpenVMS VAXでも同様に出力されると仮定したプログラムを作成した場合,大きな障害になる可能性があります。
浮動小数点データ型の記憶領域については,『Alpha Architecture Handbook』を参照してください。
前へ | 次へ | 目次 | 索引 |