COBOL2002 使用の手引 手引編


31.2.1 そとPERFORM文のインライン展開

そとPERFORM文のインライン展開の規則について説明します。

なお,PERFORM文については,マニュアル「COBOL2002 言語 標準仕様編」 「10.8.31 PERFORM文」を参照してください。

〈この項の構成〉

(1) 対象となる節,段落

手続き部分で定義された節と段落であることが必要です。宣言節で定義された節,段落はインライン化の対象となりません。

(2) THRU指定のあるPERFORM文

THRU指定のあるPERFORM文の場合,次のどちらかの条件を満たしていなければなりません。

例1のPERFORM文は,SECT-1が節,PARG-2-1が段落であるため,インライン化の対象となりません。

(例1)
           :
       PROCEDURE DIVISION.
           :
           PERFORM SECT-1 THRU PARG-2-1.
           SECT-1 SECTION.
           PARG-1-1.
           :
           SECT-2 SECTION.
           PARG-2-1.
           :

例2のPERFORM文は,SECT-2がSECT-1の直後に定義されています。

(例2)
               :
       PROCEDURE DIVISION.
               :
           PERFORM SECT-1 THRU SECT-2.
           SECT-1 SECTION.
           PARG-1-1.
               :
           SECT-2 SECTION.
           PARG-2-1.
               :

例3のPERFORM文は,PARG-1-3がPARG-1-1の直後に定義された段落ではないため,インライン化の対象となりません。

(例3)
            :
       PROCEDURE DIVISION.
            :
           PERFORM PARG-1-1 THRU PARG-1-3.
           SECT-1 SECTION.
           PARG-1-1.
            :
           PARG-1-2.
            :
           PARG-1-3.
            :

(3) 呼ばれる節と段落

呼ばれる節と段落が次の(a)(b)の条件を満たしていることが必要です。

(a) THRU指定がある場合

  • 手続き名1と手続き名2が節の場合,節または節に従属する段落を分岐文や複数のPERFORM文で参照してはなりません。

  • 手続き名1と手続き名2が段落の場合,段落を分岐文や複数のPERFORM文で参照してはなりません。

例1のPERFORM文は,PARG-2-1がGO TO文によって参照されているため,インライン化の対象となりません。

(例1)
             :
       PROCEDURE DIVISION.
             :
           PERFORM SECT-1 THRU SECT-2.
             :
           GO TO PARG-2-1.
             :
           SECT-1 SECTION.
           PARG-1-1.
             :
           SECT-2 SECTION.
           PARG-2-1.
             :

例2の(1)のPERFORM文は,PARG-1-2とPARG-1-3が(2)のPERFORM文と(3)のGO TO文によって参照されているため,インライン化の対象となりません。

(例2)
            :
       PROCEDURE DIVISION.
            :
           PERFORM PARG-1-2 THRU PARG-1-3. …(1)
            :
           PERFORM PARG-1-1 THRU PARG-1-4. …(2)
            :
           GO TO SECT-1. …(3)
            :
           SECT-1 SECTION.
           PARG-1-1.
            :
           PARG-1-2.
            :
           PARG-1-3.
            :
           PARG-1-4.
            :

(b) THRU指定がない場合

  • 手続き名1が節の場合,節または節に従属する段落を分岐文や複数のPERFORM文で参照してはなりません。

  • 手続き名1が段落の場合,段落を分岐文や複数のPERFORM文で参照してはなりません。

例1のPERFORM文は,PARG-1-2がGO TO文によって参照されているため,インライン化の対象となりません。

(例1)
            :
       PROCEDURE DIVISION.
            :
           PERFORM SECT-1.
            :
           GO TO PARG-1-2.
            :
           SECT-1 SECTION.
           PARG-1-1.
            :
           PARG-1-2.
            :
           SECT-2 SECTION.
            :

例2の(1)のPERFORM文は,PARG-1-2が(2)のPERFORM文と(3)のGO TO文によって参照されているため,インライン化の対象となりません。

(例2)
            :
       PROCEDURE DIVISION.
            :
           PERFORM PARG-1-2. …(1)
            :
           PERFORM PARG-1-1 THRU PARG-1-3. …(2)
            :
           GO TO SECT-1. …(3)
            :
           SECT-1 SECTION.
           PARG-1-1.
            :
           PARG-1-2.
            :
           PARG-1-3.
            :
           PARG-1-4.
            :

(4) PERFORM文の位置

PERFORM文が記述されている位置が次の(a)(b)の条件を満たしていることが必要です。

(a) THRU指定がある場合

  • 手続き名1と手続き名2が節の場合,節または節に従属する段落の中に呼び出し元のPERFORM文があってはなりません。

  • 手続き名1と手続き名2が段落の場合,段落の中に呼び出し元のPERFORM文があってはなりません。

例1のPERFORM文は,SECT-2の中に書かれているため,インライン化の対象となりません。

(例1)
            :
       PROCEDURE DIVISION.
            :
           SECT-1 SECTION.
            :
           SECT-2 SECTION.
           PARG-2-1.
            :
           PERFORM SECT-1 THRU SECT-2.
            :
           SECT-3 SECTION.
            :

例2のPERFORM文は,PARG-1-2中に書かれているため,インライン化の対象となりません。

(例2)
            :
       PROCEDURE DIVISION.
            :
           SECT-1 SECTION.
           PARG-1-1.
            :
           PARG-1-2.
            :
           PERFORM PARG-1-1 THRU PARG-1-2.
            :
           PARG-1-3.
            :

(b) THRU指定がない場合

  • 手続き名1が節の場合,節または節に従属する段落の中に呼び出し元のPERFORM文があってはなりません。

  • 手続き名1が段落の場合,段落の中に呼び出し元のPERFORM文があってはなりません。

例1のPERFORM文はSECT-1中に書かれているため,インライン化の対象となりません。

(例1)
           :
       PROCEDURE DIVISION.
           :
           SECT-1 SECTION.
           PARG-1-1.
           :
           PERFORM SECT-1.
           :
           SECT-2 SECTION.
           :

例2のPERFORM文はPARG-1-1中に書かれているため,インライン化の対象となりません。

(例2)
            :
       PROCEDURE DIVISION.
            :
           SECT-1 SECTION.
           PARG-1-1.
            :
           PERFORM PARG-1-1.
            :
           SECT-2 SECTION.
            :

(5) 呼ばれる節と段落までの間にある文

呼び出し元のPERFORM文または手続き部先頭から(「(7) 注意事項」を参照),呼ばれる節と段落までの間にある文が次の二つの条件を満たしていることが必要です。

  1. 最上位レベルのSTOP RUN文(「(7) 注意事項」を参照)など,プログラムの実行を終了する文がなければなりません。

    例1では,STOP RUN文が文のレベルの最上位でないため,インライン化の対象とはなりません。

    (例1)

                :
           PROCEDURE DIVISION.
                :
               PERFORM SECT-1.
                :
               IF FLAG = 'ON' THEN
               STOP  RUN.
                :
               SECT-1 SECTION.
                :
  2. 文のレベルに関係なく,ENTRY文があってはなりません。

    例1ではENTRY文があるため,インライン化の対象となりません。

    (例1)

                :
           PROCEDURE DIVISION.
                :
               PERFORM SECT-1.
                :
               IF FLAG = 'ON' THEN
               ENTRY 'SUB01'.
                :
               SECT-1 SECTION.
                :

(6) 呼ばれる節と段落までの間にある節と段落

呼び出し元のPERFORM文または手続き部先頭から(「(7) 注意事項」を参照),呼ばれる節と段落までの間にある節と段落がGO TO文とALTER文の飛び先で参照されてはなりません。

例のPERFORM文は,1.のGO TO文によってSECT-1が参照されているため,インライン化の対象となりません。

(例)
            :
       PROCEDURE DIVISION.
            :
           GO TO SECT-1.  *> 1.
            :
           PERFORM SECT-2.
            :
           SECT-1 SECTION.
            :
           SECT-2 SECTION.
            :

(7) 注意事項