日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 1 章:移行プロセスの概要
第 2 章:移行方法の選択
第 3 章:アプリケーションの移行
第 4 章:再コンパイルと再リンクの概要
第 5 章:ページ・サイズの拡大に対するアプリケーションの対応
第 6 章:共有データの整合性の維持
第 7 章:アプリケーション・データ宣言の移植性の確認
第 8 章:アプリケーション内の条件処理コードの確認
第 9 章:アプリケーションのトランスレート
第 10 章: ネイティブなイメージとトランスレートされたイメージの間の相互操作性の確認
第 11 章:OpenVMS Alpha コンパイラ
付録 A :アプリケーション評価チェックリスト
用語集
索引
PDF
OpenVMS ホーム
OpenVMS Alpha オペレーティング・システム | HPE 日本

OpenVMS Alpha
オペレーティング・システム
OpenVMS VAX から OpenVMS Alpha へのアプリケーションの移行


目次 索引



以下の COBOL 文は, DEC COBOL と VAX COBOL で異なる動作をします。

  • ACCEPT

  • DISPLAY

  • EXIT PROGRAM

  • LINAGE

  • MOVE

  • SEARCH

11.3.3.4.1 ACCEPTおよびDISPLAY文

プログラムの中でACCEPTまたはDISPLAYの拡張機能を使用していると, DEC COBOL と VAX COBOL の動作に違いが生じることがあります。この場合, DEC COBOL は以下のように動作します。

  • 1つのプログラムの中でANSI ACCEPT文と拡張ACCEPT文を混在させると,拡張ACCEPT文が使用する編集キーが,ANSI ACCEPT文でも使用されます

  • VAX COBOL は,画面管理でのVT52端末をサポートしていますが, DEC COBOL はサポートしていません

  • 端末がラップなしモードに設定されているときに,文字が画面の終わりを越える項目を表示すると,一番右の列以降の文字はすべて切り捨てられます。たとえば,80カラムの画面の 79カラム目に"1234"を表示するように指定すると, DEC COBOL は"12"と表示します。一方, VAX COBOL は一番右のカラムの文字を上書きします。この例では, VAX COBOL は"14"と表示します。

  • アプリケーションがACCEPTまたはDISPLAY文の 日本DECによる拡張機能を使用している場合, DEC COBOL は最初のACCEPTまたはDISPLAY文を実行する前に,画面の左上のコーナーにカーソルを置きます。
    この違いは,最初のACCEPTまたはDISPLAY文がLINE句とCOLUMN句を含んでいないときに明確になります。この場合, DEC COBOL はカーソルを画面の一番上に移動してからACCEPTまたはDISPLAYを実行しますが, VAX COBOL はカーソルを移動しません。

11.3.3.4.2 EXIT PROGRAM句

呼び出されたプログラムの中の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. 
 
 

VAX COBOL の結果:


               B1 =  -1 
               B2 =  -1 
 
 

DEC COBOL の結果:


               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-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の値は予測できません。このコーディングでも期待される動作が得られることがありますが,ほとんどの場合は失敗します。

プログラミングに使用しているプラットフォームによって,いくつかの診断メッセージは異なる意味と結果を持っています。

  • DEC COBOL は,次の診断の受信時に, VAX COBOL と同じランタイム・エラー回復動作を行いません。


          %COBOL-E-EXITDECL, EXIT PROGRAM statement invalid in 
            GLOBAL DECLARATIVE 
    

  • VAX COBOL はGLOBAL USEプロシージャの中のEXIT PROGRAMをつねに無視します。 DEC COBOL は,GLOBAL USEが現在のプログラム単位とは別のプログラム単位から呼び出されている場合にのみEXIT PROGRAMを無視します。
    VAX COBOL と同じ動作をさせるためには,診断の原因となった問題を修正してください。

  • 比較に使われているオペランドのいずれかが不正であると, VAX COBOL と DEC COBOL はどちらもエラー・メッセージを発行します。 VAX COBOL はこの条件を含んでいる文の分析を続けますが, DEC COBOL は次の文に進みます(このため,その文の中のエラーはこれ以上発見されません)。

  • ソース文に複数の除算が含まれており,分母がリテラルのゼロ,数値としてのゼロ,または値がゼロの変数である場合, DEC COBOL はゼロによる除算のランタイム診断を1つだけ発行しますが, VAX COBOL は文の中のゼロによる除算すべてについて同じ診断を発行します。たとえば,次のコードでは, VAX COBOL では3つの診断が, DEC COBOL では1つの診断が発行されます。


    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 固有の完了コードを含んでいることもあります。

VAX 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』を参照してください)。

複数のプロセスで共通ブロックを共用する場合には, 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 では,プラットフォームによって,いくつかの算術演算の動作が異なります。

  • 数値および整数の組み込み関数の結果は,最下位の桁が VAX COBOL と異なることがあります。また,DISPLAY文によるフォーマットも異なることがあります。

  • OpenVMS VAX と OpenVMS Alpha はCOMP-2項目を異なる方法で扱います。このため,USAGE COMP-2データ項目の下位の桁をDISPLAYで表示したときの結果は, OpenVMS VAX 上の VAX COBOL でデータ項目の下位の桁をDISPLAYで表示したときと異なることがあります。

  • DEC COBOL は, VAX COBOL よりも多くの状況で ALL_LOST(すべての桁が失われた)警告診断を発行します。

  • ANSI COBOL規格は,SIZE ERROR句のない算術文でオーバフローが生じたときの結果は予測不可能と定めています。 VAX COBOL は,このような場合でも,一般に予想される下位の桁を返しますが, DEC COBOL は返しません。

  • 中間結果の精度が VAX COBOL と DEC COBOL では異なります。これは除算が含まれたCOMPUTE操作でよく生じます。中間結果で特定の精度が必要な場合は,希望の精度を持つ一時変数を使用するようにしてください。次に例を示します。


            COMPUTE D = (A / B) / C. 
    

    ...は次のように書くことができます。


            COMPUTE TMP1 = A / B. 
            COMPUTE D = TMP1 / C. 
    


    A / B という計算に使用される精度は,TMP1の宣言によって決定されます。

  • VAX COBOL と DEC COBOL では,無効な10進データが与えられたときの数値比較の結果は定義されていません。 DEC COBOL には,無効な10進データの詳細な分析を行うための/CHECK=DECIMALと -check decimalがあります。これらの機能は,プログラムの DEC COBOL への移行を行うときに特に便利です。


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項