1. PERFORM

PERFORM statement는 프로그램 실행 중에 프로그램의 제어를 명시적으로 하나 이상의 다른 procedure로 넘길때 사용하는 statement이다. PERFORM으로 제어가 넘어간 위치에서 procedure가 종료되면 프로그램의 제어는 PERFORM statement 다음으로 넘어가게 된다.

PERFORM statement를 사용하는 방식에는 다음과 같은 2가지 방식이 있다.

  • out-of-line PERFORM statement

    out-of-line PERFORM statement는 PERFORM statement 안에 statement를 기술하는 것이 아니라 기술되어 있는 procedure를 호출하는 방식이다. 따라서, 처리할 procedure name을 반드시 지정해야 한다.

  • in-line PERFORM statement

    in-line PERFORM statement는 procedure-name을 지정하지 않고 PERFORM statement 내에 statment를 직접 사용한 경우를 말한다. 따라서, statement의 끝을 표현하기 위해서 END-PERFORM phrase를 반드시 지정해야 한다.

PERFORM statement에는 다음과 같은 4가지 유형이 있다.

Basic PERFORM statement

PERFORM statement의 가장 기본이 되는 유형으로 PERFORM에서 호출한 procedure를 한 번 실행하는 statement이다. PERFORM에서 호출한 procedure가 종료되면 PERFORM statement 이후의 statement가 순서대로 처리된다. 단, PERFORM statement에서 자기 자신의 procedure를 호출해서는 안된다.

figure pd perform format1
Basic PERFORM Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • procedure-name-1, procedure-name-2

    • procedure-name-1과 procedure-name-2는 모두 Procedure division 내에서 사용하는 procedure name이어야 한다.

    • procedure-name1과 2 모두 사용되는 경우, 둘 중 하나가 declarative procedure내에 정의된 procedure라면, 나머지 하나또한 declarative procedure 내에 정의된 procedure이어야 한다.

    • procedure-name-1이 사용된 경우 imperative-statement-1과 END-PERFORM을 지정할 수 없다.

    • procedure-name-1을 생략한 경우 imperative-statement-1과 END-PERFORM을 반드시 지정해야 한다.

  • imperative-statement-1

    • PERFORM에 의해서 실행될 statement이다.

프로그램을 실행할 때 out-of-line PERFORM statement를 만나게 되면 프로그램의 제어는 procedure-name-1의 첫 번째 statement로 넘어간다. 그리고 procedure-name-1이 모두 수행이 되면 프로그램의 제어는 PERFORM statement 다음의 statement로 제어가 넘어간다.

procedure를 수행한 후 리턴하는 시점은 다음과 같다.

  • procedure-name-1이 paragraph이고 procedure-name-2는 지정하지 않은 경우 procedure-name-1의 마지막 statement를 수행한 후 PERFORM statement로 리턴한다.

  • procedure-name-1이 section이고 procedure-name-2는 지정하지 않은 경우 procedure-name-1 section내의 마지막 paragraph의 마지막 statement를 수행한 후 PERFORM statement로 리턴한다.

  • procedure-name-2가 pargraph인 경우 procedure-name-2 paragraph의 마지막 statement를 실행한 후 리턴한다.

  • procedure-name-2가 section인 경우 procedure-name-2 section 내의 마지막 paragraph의 마지막 statement를 수행한 후 리턴한다.

procedure-name-1과 procedure-name-2를 모두 지정한 경우에는 PERFORM은 procedure-name-1에서 시작해서 procedure-name-2까지 수행한다. 따라서, 프로그램의 순서 역시 procedure-name-1이 먼저 나오고 procedure-name-2가 이후에 나와야 한다.

PERFORM statement는 PERFORM statement에 의해 실행된 프러시저 안에 나올 수 있다.

TIMES phrase를 사용하는 PERFORM statement

PERFORM statement의 두 번째 유형은 TIMES phrase에 지정한 identifier나 integer 횟수만큼 프러시저를 호출하거나 imperative-statement를 실행하는 유형이다.

PERFORM statement가 종료하게 되면 프로그램의 제어는 PERFORM statement 다음 문장으로 넘어간다. procedure-name-1을 지정한 경우 imperative-statement-1과 END-PERFORM이 나올 수 없다.

figure pd perform format2
TIME phrase를 사용하는 PERFORM Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1

    • integer 항목을 가르켜야 한다.

    • identifier-1이 양수가 아닌 0이나 음수인 경우에는 PERFORM statement는 수행되지 않고 PERFORM statement 다음 문장이 수행된다.

    • PERFORM statement가 수행된 후에는 identifier-1을 변경하더라도 프러시저의 실행 횟수는 바뀌지 않는다.

  • integer-1

    • 양의 정수이여야 한다.

PERFORM with UNTIL phrase

PERFORM statement의 3번째 유형은 UNTIL phrase가 TRUE가 될 때까지 procedure나 imperative-statement를 실행하는 유형이다.

UNTIL phrase에서 지정한 조건이 TRUE인 경우에는 프로그램의 제어는 PERFORM statement의 다음 문장으로 넘어간다. procedure-name-1을 지정한 경우 imperative-statement-1과 END-PERFORM를 지정할 수 없다.

figure pd perform format3
UNTIL phrase를 사용하는 PERFORM Statement Format
figure pd perform format3 phrase1
UNTIL phrase를 사용하는 PERFORM Statement Format : phrase

다음은 statement의 각 설정 항목에 대한 설명이다.

  • condition-1

    • OFCOBOL에서 사용하는 모든 조건이 될 수 있다.

    • 해당 문장의 조건이 true가 되면 PERFORM statement는 수행하지 않는다.

TEST BEFORE phrase를 지정한 경우 statement를 수행하기 전에 해당하는 조건을 체크한다. TEST AFTER phrase를 지정한 경우에는 조건문을 수행하기 전에 최소한 1번은 statement를 실행한다. TEST BEFORE나 TEST AFTER를 지정하지 않은 경우에는 TEST BEFORE phrase가 지정된 것으로 간주한다. condition이 TRUE라면, PERFORM statment의 다음 실행가능한 statement가 실행된다.

PERFORM with VARYING phrase

PERFORM statement의 4번째 유형은 하나 이상의 변수를 이용하여 해당하는 변수를 증가 또는 감소를 시키면서 해당 변수가 지정한 조건이 TRUE가 될 때까지 procedure나 imperative statement를 수행하는 유형이다.

procedure-name-1을 지정한 경우 imperative-statement-1과 END-PERFORM이 나올 수 없다. 만약, procedure-name-1이 생략되면 AFTER phrase를 지정할 수 없다.

figure pd perform format4
VARYING phrase를 사용하는 PERFORM Statement Format
figure pd perform format4 phrase1
VARYING phrase를 사용하는 PERFORM Statement Format : phrase1
figure pd perform format4 phrase2
VARYING phrase를 사용하는 PERFORM Statement Format : phrase2
figure pd perform format4 phrase3
VARYING phrase를 사용하는 PERFORM Statement Format : phrase3

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-2 through identifier-7

    • numeric 데이터 항목이어야 한다.

    • floating-point data item도 가능하다.

  • literal-1 through literal-4

    • numeric literal이어야 한다.

    • floating-point data item도 가능하다.

  • condition-1, condition-2

    • OFCOBOL에서 사용하는 모든 condition이 될 수 있다.

    • 해당 문장의 조건이 TRUE가 되면 PERFORM statement는 수행하지 않는다.

Varying identifiers

TEST BEFORE phrase를 지정하였거나 지정하지 않은 경우에는, statement를 수행하기 전에 해당하는 조건을 체크한다. TEST AFTER phrase를 지정한 경우에는 조건문을 수행하기 전에 최소한 1번은 statement를 실행한다. TEST BEFORE나 TEST AFTER를 지정하지 않은 경우에는 TEST BEFORE phrase가 지정된 것으로 가정한다.

  • Varying Identifier가 1개인 경우

    • identifier-2나 identifier-5가 subscript가 된 경우에는 데이터 항목이 설정되거나 변경될 때마다 값을 계산한다.

    • identifier-3, identifier-4, identifier-6, identifier-7이 subscript된 경우에도 각 데이터 값을 설정하거나 변경할 때마다 값을 계산한다.

    • 다음 그림은 TEST BEFORE phrase를 사용하는 PERFORM statement의 흐름도이다.

      figure pd perform varying1
      TEST BEFORE phrase를 사용한 PERFORM statement 흐름도
    • 다음 그림은 TEST AFTER phrase를 사용하는 PERFORM statement의 흐름도이다.

      figure pd perform varying2
      TEST AFTER phrase를 사용한 PERFORM statement 흐름도
  • Varying Identifier가 2개인 경우

    • 다음과 같은 PERFORM statement가 있다고 하였을 경우 OFCOBOL에서는 아래와 같은 순서로 PERFORM statement를 체크한다.

      figure pd perform varying5

      1. IDENTIFIER-2는 IDENTIFIER-3로, IDENTIFIER-5는 IDENTIFIER-6로 각각 값이 초기화된다.

      2. CONDITION-1의 결과에 따라 다음과 같이 처리한다.

        • CONDITION-1이 TRUE인 경우 PERFORM statement를 종료하고 PERFORM statement 이후의 문장을 수행한다.

        • CONDITION-1이 FALSE인 경우 아래의 3에서 7까지의 STEP을 진행한다.

      3. CONDITION-2의 결과에 따라 다음과 같이 처리한다.

        • CONDITION-2가 TRUE인 경우, IDENTIFIER-2에 IDENTIFIER-4를 더하고, IDENTIFIER-5가 현재 IDENTIFIER-6값으로 설정된다. 그리고 STEP 2가 반복된다.

        • CONDITION-2가 FALSE인 경우 아래의 4에서 6까지의 STEP을 진행한다.

      4. PROCEDURE-NAME-1에서 PROCEDURE-NAME-2까지의 procedure를 실행한다.

      5. IDENTIFIER-5에 IDENTIFIER-7을 더한다.

      6. CONDITION-2가 TRUE가 될 때까지 3에서 5까지의 STEP을 반복한다.

      7. CONDITION-1이 TRUE가 될 때까지 2에서 6까지의 STEP을 반복한다.

        PERFORM statement가 끝났을 때 IDENTIFIER-5는 끝난시점의 IDENTIFIER-6 값을 갖고있는다. IDENTIFIER-2는 가장 마지막에 증가된 또는 감소된 값을 갖게된다.

    • 다음 그림은 TEST BEFORE phrase를 사용하는 PERFORM statement의 흐름도이다.

      figure pd perform varying3
      TEST BEFORE phrase를 사용한 PERFORM statement 흐름도
    • 다음 그림은 PERFORM statement가 TEST AFTER phrase를 갖는 VARYING phrase를 갖는 흐름도이다.

      figure pd perform varying4
      TEST AFTER phrase를 사용한 PERFORM statement 흐름도
  • Varying Identifier가 3개 이상인 경우

    • identifier를 3개 사용하는 PERFORM statement에서의 처리는 identifier를 2개 사용하는 PERFORM statement에서의 처리와 유사하게 동작한다. 단, IDENTIFIER-5가 IDENTIFIER-7만큼 증가할 때 IDENTIFIER-8에 IDENTIFIER-10을 더한 후에 CONDITION-3을 체크하는 과정이 추가된다.

      figure pd perform varying6

    • PERFORM statement가 끝났을 때 IDENTIFIER-5과 IDENTIFIER-8은 끝난 시점의 IDENTIFIER-6과 IDENTIFIER-9 값을 갖게 된다. IDENTIFIER-2는 가장 마지막에 증가되거나 감소된 값을 갖게된다.

    • 3개 이상인 경우 위의 예제에서 AFTER phrase가 추가된 경우를 생각하면 된다.

Varying phrase는 PERFORM statement에서는 identifier의 개수와는 상관없이 다음과 같은 규칙이 적용된다.

  • VARYING이나 AFTER phrase에서 index-name을 명시한 경우

    • index-name에 대한 초기화 및 값을 가감하는 것은 OFCOBOL의 index-name 규칙에 따른다.

    • FROM phrase에서 identifier나 literal은 양의 정수이어야 한다.

    • BY phrase에서 identifier는 정수이어야 하며, literal은 0이 아닌 정수이어야 한다.

  • FROM phrase에서 index-name을 명시한 경우

    • VARYING이나 AFTER phrase에서 identifier는 반드시 정수여야 한다. identifier는 내부적으로 SET statement를 통해 초기화되는 방식으로 초기화된다.

    • BY phrase에서 identifier는 양의 정수이어야 하며 literal은 0이 아닌 정수이어야 한다.

  • BY phrase에서 identifier와 literal은 반드시 0이 아닌 값을 나타내어야 한다.

  • VARYING, FROM이나 BY phrase에서 identifier나 index-name의 값을 변경하는 것은 PERFROM statement의 procedure를 실행하는 횟수를 변경하게 된다.