PERFORM(実行)文

PERFORM(実行)文は、いくつかの手続きに制御を明示的に移し、その手続きの実行が終了した時点で、暗黙的に制御を戻すために使用する。

PERFORM文は、その有効範囲内にあるいくつかの無条件命令の実行を制御するためにも使用する。

NETPERFORM文は、配列の各要素を処理するために使用する。 

手続き部 - ENTER - INVOKEの章のEXIT(出口)文節を参照。

一般形式

形式 1

形式 2

形式 3

形式 4

形式 5

指令

  1. 予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。

    • PERFORM-TYPE - 重複するPERFORMの範囲の取扱いを制御する。

構文規則

すべての形式
  1. 手続き名-1を省略するときは、無条件文-1とEND-PERFORM指定を書く。手続き名-1を書くときは、無条件文-1とEND-PERFORM指定を書いてはならない。

    無条件文-1を書けば、END-PERFORM指定を省略してもよい。

    手続き名-1と無条件文-1を両方とも省略してもよい。

  2. 語THROUGHとTHRUは同義であり、どちらを書いてもよい。

  3. 手続き名-1と手続き名-2を両方書いたときに、どちらか一方が手続き部の宣言部分に含まれる手続き名を指しているならば、両方の手続きとも同じ宣言節内になければならない。
形式 2 および 4
  1. 各一意名は、データ部に記述された数字基本項目を表わす。形式 2 では、一意名-1は整数とする。

  2. 数字データ項目または定数を指定できるところでは、どこでも浮動小数点数のデータ項目または定数を使用できる。ただし、整数が要求される箇所には使用できない。
形式 3
  1. TEST指定を書いた場合、EXIT指定を書いてはならない。
形式 3 および 4
  1. TEST BEFORE指定もTEST 指定も書かないと、TEST BEFORE指定を書いたものとみなされる。

  2. 条件-1、条件-2などは任意の条件式であってよい。 (手続き部の章の条件式節を参照。)
形式 4
  1. 形式 4 では、手続き名-1を省略するときは、AFTER指定を書いてはならない。

    この制限は適用されない。

  2. 各定数は、数字定数を表わす。

  3. VARYING指定またはAFTER指定の中に指標名を指定する場合は、下記のようにする。

    1. 対応するFROM指定およびBY指定の中の一意名は、整数データ項目とする。

    2. 対応するFROM指定の中の定数は、正の整数とする。

    3. 対応するBY指定の中の定数は、ゼロでない整数とする。

  4. FROM指定の中に指標名を指定する場合は、下記のようにする。

    1. 対応するVARYING指定またはAFTER指定の中の一意名は、整数データ項目とする。

    2. 対応するBY指定の中の一意名は、整数データ項目とする。

    3. 対応するBY指定の中の定数は、整数とする。

  5. BY指定の中の定数は、ゼロであってはならない。

  6. 形式 4では、AFTER指定を2つ書ける。

    形式 4では、AFTER指定を6つ書ける。

    この制限は、15にまで拡大されている。

形式 5
  1. NET
    一意名-9は、コレクション・クラス、つまり、以下の型を返すGetEnumerator メソッドを有するクラスのインスタンスでなければならない:
    1. パラメータをまったく持たないMoveNextと呼ばれるパブリック・インスタンスを含む型。
    2. カレント(Current)とよばれるパブリック・インスタンス・ゲット・プロパティ(public instance get property)を含む型。このプロパティの型は一意名-9の要素型として知られている。
    System.Collections.IEnumerableインターファイスを実行するクラスはすべて、上記の規則に従うゆえに、コレクション・クラスを満足させる。すべての.NET配列は、.NETフレームワークの中で定義されている様々の辞書およびリスト・クラスと同様のコレクション・クラスである。
  2. NET一意名-9の要素型から 一意名-8の型へのキャスティング・オペレーションの実行が可能でなければならない。

一般規則

すべての形式
  1. 手続き名-1を指定したPERFORM文を「外PERFORM文」という。

    手続き名-1を省略したPERFORM文を「内PERFORM文」という。

  2. 外PERFORM文の手続き名-1(手続き名-2が指定されていれば手続き名-2まで)の範囲内に含まれている文、

    または、内PERFORM文自体の中に含まれている文

    を「指定された文の組」という。

  3. END-PERFORM指定は、内PERFORM文の範囲を区切る。(COBOL言語の概念の章の明示範囲符と暗黙範囲符節を参照。)

  4. 内PERFORM文は、基本的には、外PERFORM文用の下記の規則に従って機能する。両者の違いは、外PERFORM文では、手続き名-1(手続き名-2が指定されていれば手続き名-2まで)の範囲内に含まれている文が実行されるのに対して、内PERFORM文ではそのPERFORM文自体の中に含まれている文が実行されることである。以降の記述において、特に「内」または「外」と明示しないかぎり、外PERFORM文に当てはまる一般規則は、すべて内PERFORM文にも当てはまるものとする。

  5. PERFORM文が実行されると、制御は指定された文の組の最初の文に移される(一般規則8b、8c、8dに示す場合を除く)。この制御の移行は、PERFORM文が実行されるたびに1回だけ発生する。 >指定された文の組へ制御が移されると、PERFORM文の末尾に戻るための制御の暗黙移行が、下記のように用意される。

    1. 手続き名-1が段落名であり手続き名-2は指定されていない場合、手続き名-1の最後の文が実行されると、制御はPERFORM文の末尾に戻る。

    2. 手続き名-1が節名であり手続き名-2は指定されていない場合、手続き名-1の最後の段落の最後の文が実行されると、制御はPERFORM文の末尾に戻る。

    3. 手続き名-2が指定されておりそれが段落名である場合、その段落の最後の文が実行されると、制御はPERFORM文の末尾に戻る。

    4. 手続き名-2が指定されておりそれが節名である場合、その節内の最後の段落の最後の文が実行されると、制御はPERFORM文の末尾に戻る。

    5. 内PERFORM文の実行は、 その中に含まれる最後の文が実行された後で完了する。

    6. 内PERFORM文において、その中のすべての文の実行が終わる前に処理を終了させるために、EXIT PROGRAM文を使用できる。

  6. 手続き名-1と手続き名-2の間には、関連がある必要はない。ただ、手続き名-1から始まって手続き名-2で終わるように実行すればよい。手続き名-1と手続き名-2の終わりの間に、GO TO文やPERFORM文があってもよい。手続き名-1から手続き名-2の終わりに至る間にいくつかの論理経路が存在する場合は、手続き名-2を段落名とし、その中にEXIT文だけを置いて、すべての経路をそこに至らせるとよい。

  7. 指定された文の組への制御の移行がPERFORM文以外の手段で行われると、その文の組の末尾から次の実行文に制御が移される。つまり、PERFORM文がその文の組を参照していないように扱われる。

  8. PERFORM文は、下記のように機能する。

    1. 形式 1が基本的なPERFORM文である。この形式のPERFORMによって参照される指定された文の組が1回実行され、その後で制御はこのPERFORM文の末尾に戻る。

    2. 形式 2 は、 PERFORM ... TIMES指定で、一定の回数だけ繰り返すPERFORM文である。指定された文の組が、整数-1または一意名-1のデータ項目の初期値によって示される回数だけ実行される。PERFORM文を実行するときに、一意名-1のデータ項目の値がゼロまたは負である場合は、制御はPERFORM文の末尾に移される。指定された文の組が指定された回数実行された後で、制御はPERFORM文の末尾に移される。

      PERFORM文の実行中は、一意名-1は指定された次の実行回数を、一意名-1のデータ項目の初期値によって示される回数から変えることはできない。

      整数-1はゼロまたは正でなければならない。符号を付けてもよい。

    3. 形式 3 はPERFORM ... UNTIL指定で、条件が満たされるまで繰り返すPERFORM文である。指定された文の組が、UNTIL指定に書かれた条件が真になるまで繰り返し実行される。条件が真になると、制御はPERFORM文の末尾に移される。PERFORM文に入ったときに条件が真であり、

      TEST BEFOREが指定、または暗黙に指定されていると、

      制御は手続き名-1へ移行されず、PERFORM文の末尾に移される。

      TEST AFTERが指定されている場合も、PERFORM文はTEST BEFOREが指定されているのと同じように機能する。ただし、終了条件の判定が行われるのは、指定された文の組が実行されてからとなる。条件-1中に指定された作用対象に関連する添字付けまたは部分参照は、条件が検査されるたびに評価される。

      UNTIL EXITを指定すると、指定された文の組は、その中のどれかの文によって終了させられるまで、繰り返し実行される。外PERFORM文の場合は、この繰り返しを終了させられる文は、EXIT PROGRAMおよびSTOP RUNだけである。内PERFORM文の場合は、EXIT PERFORM文およびGO TO文によっても、この繰り返しを終了させることができる。

    4. 形式 4 は、PERFORM ... VARYING指定で、関連する要素の値を変化させながら条件が満たされるまで繰り返すPERFORM文である。この形のPERFORM文は、実行中にいくつかの一意名や指標名の値を、規則的に変化させるときに使用する。以下の記述において、VARYING、AFTER、FROMの各指定の作用対象としての一意名に関して述べることは指標名にも当てはまる。

      指標名-1を指定する場合、PERFORM文の実行を開始する時点での一意名-3、指標名-2、定数-1の値は、指標名-1を用いている表の中の要素の出現番号と対応させる。指標名-3を指定する場合、PERFORM文の実行を開始する時点での一意名-6、指標名-4、定数-3の値は、指標名-3を用いている表の中の要素の出現番号と対応させる。

      下に述べるように、指標名-1または指標名-3を増加させていく際に、指標の値は対応する表の範囲を超えてはならない。ただし、PERFORM文の実行が終了する際には、指標の値は対応する表の範囲から1増分または1減分だけ外れることがある。

      一意名-2または一意名-5に添字が付けられている場合、これらの一意名のデータ項目の内容が設定または増加されるたびに、その添字が評価される。一意名-3、一意名-4、一意名-5、一意名-6に添字が付けられている場合、これらの一意名のデータ項目の内容が設定または増加の処理に使用されるたびに、その添字が評価される。条件-1または条件-2の中に指定されている作用対象に添字または部分参照が適用されていると、条件が検査されるたびにその添字または部分参照が評価される。

      以降に、形式 4のPERFORM文がどのように機能するかを示す例を掲げる。

      1. TEST BEFOREを明示的または暗黙的に指定した場合

        1つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。UNTIL指定の条件-1が偽であれば、指定された文の組が1回実行される。次いで、一意名-2のデータ項目の値が指定された値(定数-2または一意名-4のデータ項目の値)だけ増分または減分されて、条件-1が再び評価される。この処理が、条件-1が真になるまで繰り返される。PERFORM文の実行開始時点で条件-1が真である場合は、制御はPERFORM文の末尾に移される。 図 15-1を参照。



        図 15-1: PERFORM文の機能の流れ図 - VARYING, TEST BEFORE, 1つの条件

        2つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。また、一意名-5のデータ項目の内容が、定数-3または一意名-6のデータ項目の現在の値に設定される。図 15-2を参照。

        これから条件-1が評価される。この結果が真である場合は、制御はPERFORM文の末尾に移される。この結果が偽である場合は、条件-2が評価される。この結果が偽であれば、指定された文の組が1回実行される。次いで、一意名-5のデータ項目の値が、定数-4または一意名-7のデータ項目の現在の値だけ増分または減分される。それから条件-2が再び評価される。

        この処理が、条件-2が真になるまで繰り返される。条件-2が真になると、一意名-2のデータ項目の値が、定数-2または一意名-4のデータ項目の現在の値だけ増分され、一意名-5のデータ項目の内容が、定数-3または一意名-6のデータ項目の現在の値に設定され直される。この後、条件-1が再び評価される。条件-1が真である場合は、PERFORM文の実行は終了する。そうでなければ、条件-1が真になるまで、この処理が繰り返される。

        PERFORM文の実行が終了した時点では、一意名-5のデータ項目には定数-3または一意名-6のデータ項目の現在の値が入っている。一意名-2のデータ項目には、増分または減分によって最後に設定された値が入っている。ただし、PERFORM文の実行が開始された時点で条件-1が真であった場合には、一意名-2のデータ項目には、定数-1または一意名-3のデータ項目の現在の値が入っている。



        図 15-2: PERFORM文の機能の流れ図 - VARYING, TEST BEFORE, 2つの条件

      2. TEST AFTERを指定した場合

        1つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。そして、指定された文の組が1回実行される。それから、UNTIL指定の条件-1が検査される。この結果が偽であれば、一意名-2のデータ項目の値が指定された値(定数-2または一意名-4のデータ項目の値)だけ増分または減分されて、指定された文の組が再び実行される。この処理が、条件-1の検査結果が真になるまで繰り返される。条件-1の検査結果が真になると、制御はPERFORM文の末尾に移される。図 15-3を参照。



        図 15-3: PERFORM文の機能の流れ図 - VARYING, TEST AFTER, 1つの条件

        2つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。また、一意名-5のデータ項目の内容が、定数-3または一意名-6のデータ項目の現在の値に設定される。そして、指定された文の組が1回実行される。それから条件-2が評価される。この結果が偽であれば、一意名-5のデータ項目の値が、定数-4または一意名-7のデータ項目の現在の値だけ増分または減分されて、指定された文の組が再び実行される。この処理が、条件-2の評価結果が真になるまで繰り返される。条件-2が真になると、今度は条件-1が評価される。この結果が偽である場合は、一意名-2のデータ項目の値が、定数-2または一意名-4のデータ項目の現在の値だけ増分または減分され、一意名-5のデータ項目の内容が、定数-3または一意名-6のデータ項目の現在の値に設定し直される。この後、指定された文の組が再び実行される。この処理が、条件-1の評価結果が真になるまで繰り返される。条件-1が真になると、制御はPERFORM文の末尾に移される。図 15-4を参照。

        PERFORM文の実行が完了すると、AFTER指定またはVARYING指定によって変えられた各データ項目には、指定された文の組が最後に実行されたときの内容が入っている。



        図 15-4: PERFORM文の機能の流れ図 - VARYING, TEST AFTER, 2つの条件

        PERFORM文に指定された文の組が実行されている間に、VARYING変数(一意名-2のデータ項目および指標名-1)、BY変数(一意名-4のデータ項目)、AFTER変数(一意名-5のデータ項目および指標名-3)、FROM変数(一意名-3のデータ項目および指標名-2)の変化が考慮に入れられて、以降のPERFORM文の実行に影響を及ぼす。

        2つの一意名のデータ項目を変化させる場合、一意名-2のデータ項目が変化するたびに、一意名-5のデータ項目は変化の全過程(FROM, BY, UNTIL)を経る。3つ以上の一意名のデータ項目の内容を変化させる場合も、その仕組みは基本的には2つの場合と同じである。ただし、AFTER指定によって変化させるデータ項目は、その前にあるAFTER指定の作用対象が増分または減分されるたびに、変化の全過程を経る。

  9. PERFORM文の範囲は、論理的には、その開始によって明示的に制御を移されて実行される文に始まり、そのPERFORM文に制御が戻されるまでに実行される、すべての文に及ぶ。したがって、PERFORM文の範囲の中には、その中に含まれるCALL, GO TO, PERFORMなどの文によって制御を移されて実行される文もすべて含まれる。また、PERFORM文の範囲内の文を実行することによって実行される宣言手続き中の文もすべて含まれる。PERFORM文の範囲内に含まれる文が、原始要素内で連続して現れる必要はない。

  10. 次の場合、EXIT PROGRAM文を実行したことによって制御が移されて実行される文は、PERFORM文の範囲内にあるとはみなされない。

    1. PERFORM文が指定されているのと同じプログラム中に指定されたEXIT PROGRAM文。

    2. PERFORM文の範囲内にあるEXIT PROGRAM文。

  11. あるPERFORM文の範囲内に別のPERFORM文が含まれる場合、含まれる方のPERFORM文に連なる一連の手続きは、最初のPERFORM文によって参照される一連の手続きに完全に含まれるか、完全にその外にあるかの、どちらかでなければならない。したがって、あるPERFORM文の範囲内にあるPERFORM文は他のPERFORM文の出口に制御を渡してはならない。さらに、2つ以上のPERFORM文が、出口を共有してはならない。

    これらの制限は強制しない。PERFORM文を入れ子にすることも、再帰させる(あるPERFORM文の手続きの中にそのPERFORM文を含める)ことも許される。現在実行されているPERFORM文の最も内側の出口だけが認識される。これらの規則はPERFORM-TYPEコンパイラ指令を使用することによって変更できる。

    PERFORM文の正しい構成の例を、下に示す。

  12. 独立区分外の節内にあるPERFORM文の範囲内には、その範囲内から呼ぶ宣言節の他に、下記のどちらか1つを含めることができる。

    1. 1つ以上の非独立区分に完全に含まれる節または段落

    2. 単一の独立区分に完全に含まれる節または段落

    これらの制限は適用しない。

  13. 独立区分内にあるPERFORM文の範囲内には、その範囲内から呼ぶ宣言節の他に、下記のどれか1つを含めることができる。

    1. 1つ以上の非独立区分に完全に含まれる節または段落

    2. 該当するPERFORM文と同じ独立区分に完全に含まれる節または段落

    これらの制限は適用しない。

形式 4
  1. 一意名-4および一意名-7のデータ項目は、値がゼロであってはならない。

  2. VARYING指定またはAFTER指定の中で指標名を使用し、対応するFROM指定の中で一意名を使用する場合、この一意名のデータ項目の値は、正でなければならない。