데이터 관리

본 장에서는 OpenFrame PL/I의 데이터 타입과 속성, 선언 및 사용에 대해서 설명한다.

1. 데이터 원소

본 절에서는 PL/I 프로그램에서 사용하는 데이터의 종류와 그 속성에 대해 설명한다.

1.1. 데이터 항목

데이터 항목은 변수 또는 상수의 값이다. 데이터 항목은 스칼라(scalar)라 불리는 한 개의 항목이 될 수 있고, 또는 데이터 집합체(Data aggregate)라 불리는 여러 데이터 항목들의 집합이 될 수도 있다.

데이터 집합체의 종류에는 배열과 구조체가 있다.

  • 변수(Variable)

    변수는 값을 가지며, 이 값은 프로그램 실행 도중 바뀔 수 있다. 변수는 이름과 속성을 선언함으로써 사용될 수 있다.

    변수의 참조는 다음중 하나를 따른다.

    • 선언된 변수 이름

    • 다음 중 하나 이상을 통해 유도된 참조

      • Pointer qualification

      • Structure qualification

      • Subscripting

    다음은 변수를 참조하는 예이다.

      DCL X(3) CHAR(10);
      DCL 1 A,
            3 B CHAR(10);
      DCL Y(3) CHAR(10) BASED(P);
      DCL P PTR;
    
      X(1) = 'TEST';      /* subscripting - X(1) */
      A.B = 'MEMBER';     /* structure qualifiacation을 사용하여 참조 - A.B*/
      P = ADDR( X );      /* 변수 이름 참조 - P, X */
      DISPLAY( P->Y(1) )  /* ->기호를 통한 pointer qualifiaction 과 subscripting을 같이 사용하여 참조 - P->Y(1) */
  • 상수(Constant)

    상수는 프로그램 실행 도중 값이 바뀌지 않는다.

  • Punctuating 상수(Constant)

    읽기 편하도록 숫자, bit, hexadecimal 상수는 언더바(_) 문자를 사용할 수 있다.

      43_345_842    ==>  45345842
      1100_0011B    ==>  11000011B
      '1001_0011'B  ==> '10010011'B
      'C_A'B4       ==> 'CA'B4

1.2. 데이터 타입과 속성

PL/I 프로그램에 사용되는 데이터에는 Computational data와 Program-control data가 있다.

  • Computational data

    • 연산에 사용되어 결과를 만들어낼 수 있는 값이다. 산술 데이터(Arithmetic data)와 문자열 데이터로 구성된다.

    • 산술 데이터는 Coded arithmetic data와 Numeric picture data가 있다.

    • Coded arithmetic data의 항목은 수를 값으로 사용한다. 그것은 base(BINARY 또는 DECIMAL), scale(FLOAT 또는 FIXED), precision의 속성을 지닌다.

    • Numeric picture data는 문자형태로 저장된다. 자세한 설명은 Picture specification을 참고한다.

  • Program-control data

    • 프로그램의 실행을 제어하는 값이다.

    • Area, Entry, Label, File, Format, Pointer, Offset과 같은 데이터 타입들로 구성된다.

다음 예는 Computational data의 산술 데이터를 나타낸다. VAR1, VAR2는 Computational data의 산술 변수(Coded Arithmetic variable)이고, 숫자 2와 3.14는 산술 상수(Coded Arithmetic constant)이다.

VAR1 = (VAR2**2) * 3.14

Program-control data의 상수는 컴파일러에 의해 결정된다.

다음의 예에서 LAB1은 Program-control data의 label 상수이다. LAB1의 값은 "statement X = Y + 3;"의 주소값이다.

LAB1: X = Y + 3;
      A = B || C;

데이터 항목을 사용하기 위해서 PL/I은 데이터 타입을 알아야 하고 어떻게 동작하는지 알아야한다. 속성(Attribute)이 이런 정보를 제공한다.

속성의 종류에는 Data attribute와 Nondata attribute가 있다.

  • Data attribute

    Computational data, Program-control data의 특성을 갖는 속성들이다.

    AREA      BINARY    BIT         CHARACTER   DECIMAL   DIMENSION   ENTRY
    FILE      FIXED     FLOAT       FORMAT      GRAPHIC   LABEL       NONVARYING
    PICTURE   POINTER   PRECISION   RETURNS     SIGNED    STRUCTURE   UNSIGNED
    VARYING
    • CHARACTER는 Computational data의 문자열 타입을 지정하기 위한 데이터 속성이다.

    • FILE은 Program-control data의 파일 타입을 지정하기 위한 데이터 속성이다.

  • Nondata attribute

    Nondata element(예를 들면, 내장함수)에 대한 속성들이나 다른 데이터 속성에 추가적인 속성들이다.

    ALIGNED     AUTOMATIC    BASED       BUILTIN    BYADDR    BYVALUE      CONDITION
    CONTROLLED  DEFIEND      DIRECT      EXTERNAL   GENERIC   INITIAL      INTERNAL
    LIKE        LIST         PARAMETER   POSITION   RECORD    SEQUENTIAL   STATIC
    STEAM       UNALIGNED    VARIABLE
    • INTERNAL scope attribute는 데이터 항목이 선언된 블록에서만 사용할 수 있다.

1.3. Computational data types과 attributes

본 절에서는 Computational data의 타입을 분류하고, 연관된 속성에 대해 설명한다.

1.3.1. Coded arithmetic data와 attributes

Coded arithmetic 문법은 다음과 같다.

figure syntax coded arithmetic
Attribute 약어

BINARY

BIN

DECIMAL

DEC

PRECISION

PREC

  • BINARY와 DECIMAL attributes

    • Coded arithmetic data의 base가 10진 또는 2진임을 지정한다.

    • DECIMAL이 default이다.

  • FIXED와 FLOAT attributes

    • Coded arithmetic data의 소수점이 고정 소수점인지 부동소수점인지 지정한다.

  • PRECISION attributes

    • Coded arithmetic data의 Number of digits와 Scaling factor를 지정한다(Scaling factor는 Fixed point 데이터 항목에만 지정한다).

    • Number of digits는 데이터 항목의 값이 전체 몇 자리인지를 정수값으로 기술한다.

    • Fixed point 데이터 항목은 숫자 값의 2진 혹은 10진의 자릿수 전체를 기술한다.

    • Floating point 데이터 항목은 가수(mantissa) 부분의 자릿수를 지정한다.

    • Scaling factor은 소수부분 자릿수를 기술한다.

  • SIGNED와 UNSIGNED attributes

    • FIXED BINARY 변수에만 적용될 수 있다.

    • SIGNED 속성이 기술되면 변수 값이 음수가 될 수 있다. UNSIGNED는 오직 양수 값만 가질 수 있다. SIGNED, UNSIGNED 속성은 스토리지 크기에도 영향을 미친다.

      precision precision Storage size

      FIXED BINARY SIGNED data storage size

      p <= 7

      1

      7 < p <= 15

      2

      15 < p <= 31

      4

      31 < p <= 63

      8

      FIXED BINARY UNSIGNED data storage size

      p <= 8

      1

      8 < p <= 16

      2

      16 < p <= 32

      4

      32 < p <= 64

      8

  • Binary fixed-point data

    • 다음 예를 보면 변수 VAR1은 20bits의 binary fixed point 데이터 항목이다. 오른쪽 2bits는 binary point(2진 소수점)을 표현하기 위해 사용된다.

      DECLARE VAR1 FIXED BINARY (20,2);

      위의 경우 20bits는 low-order position에 위치한다. 따라서 여분의 high-order position bits가 존재하고 이들은 연산 과정에서 사용되기도 한다. 이 여분의 high-order bit position으로 overflow가 발생한다면 SIZE 조건이 사용가능한 상태일 때 SIZE 조건을 발생시킨다.

  • Binary fixed-point constant

    • 0, 1로 구성된 2진 상수에 B 문자가 마지막에 붙는다. 이 상수는 그 값에 의해 precision(p,q)를 갖는다.

    • 예를 들면 다음과 같다.

      Constant Precision

      1011_0B

      (5,0)

      1011_111B

      (7,0)

      1001.010B

      (7,3)

  • XN(hexa) binary fixed-point constant

    • XN 상수는 SIGNED REAL FIXED BINARY 데이터 속성을 갖는 16진수 숫자로 이루어진 상수이다.

    • 마지막에 XN을 기술한다. 각 16진 숫자는 4bit를 표현한다.

    • 상수가 8 이하 digit일 경우 precision은 31을 갖고, 그 이상일 경우 precision은 63을 갖는다.

    • 문법은 다음과 같다.

      figure syntax xn constant
    • '100’XN은 256과 같다.

  • XU(hexa) binary fixed-point constant

    • XU 상수는 UNSIGNED REAL FIXED BINARY 데이터 속성을 갖는 16진수 숫자로 이루어진 상수이다.

    • 마지막에 XU을 기술한다. 각 16진 숫자는 4bit를 표현한다.

    • 상수가 8이하 digit일 경우 precision은 31을 갖고, 그 이상일 경우 precision은 63을 갖는다.

    • 문법은 다음과 같다.

      figure syntax xu constant
    • '8000’XU는 32,768과 같다.

  • Decimal fixed-point data

    • 다음은 설정 예이다.

      DECLARE VAR1 FIXED DECIMAL (7,3);

      변수 VAR1은 7자리의 Decimal fixed point 데이터 항목이다. 오른쪽의 3자리는 소수 자릿수이다. Decimal fixed point data는 packed decimal 형태로 저장된다. 즉, 1byte로 2digit를 저장하고, 제일 오른쪽 4bit에는 sign 부호값이 저장된다.

  • Decimal fixed-point constant

    • 소수점이 있을 수 있는 10진(숫자 0 ~ 9) 숫자들로 구성된 상수이다. 이 상수는 그 값에 의해 precision(p,q)를 갖는다.

    • 예를 들면 다음과 같다.

      Constant Precision

      43.436

      (5,3)

      12.453154

      (8,6)

      0043

      (4,0)

  • Binary floating-point data

    • 다음은 설정 예이다.

      DECLARE VAR1 BINARY FLOAT (16);

      변수 VAR1은 16binary digits를 유효숫자로 갖는 binary floating point 데이터 항목이다. precision이 21보다 작거나 같으면 4bytes 크기의 스토리지를 갖는 float 타입의 데이터 항목이고, 53보다 작거나 같으면 스토리지의 크기가 8bytes인 double 타입의 데이터 항목이 된다. 그 이상의 precision은 지원하지 않는다.

  • Binary floating-point constant

    • 가수(mantissa), 지수(exponent)로 구성된 상수의 뒤에 문자 B가 붙는다. 지수 문자는 E, S, D를 가질수 있다. S, D는 각각 float, double 타입의 데이터 항목에 대한 precision의 최댓값을 precision으로 사용한다.

      Constant Precision

      1101011E+4B

      (7)

      1101.011E-6B

      (7)

      101.0E-12

      (4)

      1S0B

      (21)

      1D0B

      (53)

  • Decimal floating-point data

    • 다음은 설정 예이다.

      DECLARE VAR1 DECIMAL FLOAT (5);

      변수 VAR1은 유효숫자 5자리의 decimal floating-point 데이터 항목이다. precision이 6보다 작거나 같으면 4bytes 크기의 스토리지를 갖는 float 타입의 데이터 항목이고, 16보다 작거나 같으면 스토리지의 크기가 8bytes인 double 타입의 데이터 항목이 된다. 그 이상의 precision은 지원하지 않는다.

  • Decimal floating-point constant

    • 가수(mantissa), 지수(exponent)로 구성된 상수이다. 지수 문자는 E, S, D를 가질수 있다. S, D는 각각 float, double 타입의 데이터 항목에 대한 precision의 최댓값을 precision으로 사용한다.

      Constant Precision

      435E-1

      (3)

      435E+1

      (3)

      3.235E-4

      (4)

      1S0

      (6)

      1D0

      (16)

1.3.2. String data와 attributes

여러 종류의 문자열 데이터 타입과 그 속성들을 설명한다.

  • BIT, CHARACTER, GRAPHIC, WIDECHAR attribute

    • BIT 속성은 비트 문자열을 지정하는 속성이다.

    • CHARACTER 속성은 Character 문자열을 지정한다. Character 문자열은 PICTURE 속성을 사용해서도 선언될 수 있다.

    • GRAPHIC 속성은 DBCS(Double-byte Character Set) 문자열을 지정한다.

    • WIDECHAR 속성은 UTF-16 문자열을 지정한다.

    • 문법은 다음과 같다.

      figure syntax string attribute
      Attribute 약어

      CHARACTER

      CHAR

      GRAPHIC

      G

      WIDECHAR

      WCHAR

      NONVARYING

      NONVAR

      VARYING

      VAR

    • 문자열의 길이는 length 위치에 지정한다 . VARYING 속성이 있을 경우 가변 길이의 문자열이 되는데 이때, length 위치에 지정한 길이는 최댓값이 된다.

    • 파라미터일 경우 문자열의 길이를 애스터리스크(*)로 지정할 수 있다. 이때, 실제의 길이는 argument로부터 구한다.

    • REFER에 대한 자세한 내용은 "REFER attribute"를 참고한다.

  • VARYING와 NONVARYING attributes

    • NONVARYING 속성은 문자열의 길이가 선언될 때의 길이로 항상 일정하다.

    • VARYING 속성을 가지면 문자열의 길이는 가변적이다. VARYING 속성을 가지면 스토리지 크기는 선언된 길이보다 2bytes 더 크다. 가장 왼쪽의 2bytes는 현재 문자열의 길이정보를 담고 있다.

  • PICTURE attribute(약어: PIC)

    • 데이터 항목의 각 자리에 해당하는 Picture 문자에 따라 데이터가 저장된다. 기본적으로 문자열을 저장하게 된다.

    • 다음 그림에서 picture-specification은 "Picture specification"에서 자세히 설명한다.

      figure syntax picture attribute
    • Numeric character data에 대해서 비록 저장은 문자열 형태로 되어있지만 해당 데이터는 산술 값을 가진다. 산술 연산을 수행하기 전에 Coded arithmetic으로 변환된다.

  • Character data

    • 1byte의 문자를 저장하는 데이터 항목이다.

    • ASCII 코드를 문자 코드로 사용한다.

  • Character constant

    • 캐릭터 상수(Character constant)는 작은따옴표(' ')나 큰따옴표(" ")로 둘러싸인 문자열이다.

    • 문법은 다음과 같다.

      figure syntax char constant
    • 'Conan Doyle''s "Sherlock Holmes"'이 character constant의 내용은 다음과 같은 31문자로 이루어진 문자열이다.

      Conan Doyle’s "Sherlock Holmes"는 작은따옴표가 구분자로 문자열의 양 끝을 둘러싸고 있다. 이때 Doyle 뒤의 연속된 작은따옴표는 구분자가 아니라 문자열 내용으로 작은따옴표가 사용됨을 표기한다. 따라서 실제 문자열의 내용은 Doyle''s ==> Doyle’s가 된다.

      작은따옴표가 구분자로 사용되었으므로 큰따옴표는 문자열의 내용으로 처리된다.

    • 상수에 반복자를 사용할 수 있다. (2)'TEST’라고 기술하면 'TESTTEST’와 동일하다.

  • X(hexa) character constant

    • X 캐릭터 상수는 짝수 개의 16진수 숫자로 이루어진 문자열이다.

    • 작은따옴표(' ') 또는 큰따옴표(" ")로 둘러싸여져 있고, 각 쌍은 하나의 문자열을 나타낸다. 마지막에 문자 X로 종료된다.

      figure syntax x constant
    • 'od0A’X의 길이는 2이다.

  • Bit data

    • BIT 속성을 가진 데이터는 비트 문자열을 처리할 수 있다.

  • Bit constant

    • 0, 1의 2진 숫자로 이루어진 연속적인 문자열이다.

    • 작은따옴표(' ') 또는 큰따옴표(" ")로 둘러싸여져 있고, 마지막에 문자 B로 종료된다.

    • 문법은 다음과 같다.

      figure syntax bit constant
    • '1101’B는 bit constant로 1101B와는 다르다. 후자는 Coded arithmetic data이다.

  • B4(hexa) bit constant

    • B4 비트 상수는 작은따옴표(' ') 또는 큰따옴표(" ")로 둘러싸여진 16진수 숫자로 이루어진 문자열이다.

    • 마지막에 B4를 기술한다. 각 16진 숫자는 4bit를 표현한다. BX는 B4와 동의어이다.

    • 문법은 다음과 같다.

      figure syntax b4 constant
    • 'CA’B4는 '11001010’B와 같다.

  • B3(octal) bit constant

    • B3 비트 상수는 작은따옴표(' ') 또는 큰따옴표(" ")로 둘러싸여진 8진수 숫자로 이루어진 문자열이다.

    • 마지막에 B3를 기술한다. 각 8진 숫자는 3bit를 표현한다.

    • 문법은 다음과 같다.

      figure syntax b3 constant
    • '22’B3은 '010010’B와 같다.

  • Graphic data

    • 그래픽 데이터는 DBCS 문자를 포함할 수 있다.

    • 하나의 DBCS 문자는 2bytes를 차지한다.

  • Graphic constant

    • 작은따옴표(' ') 또는 큰따옴표(" ")로 둘러싸인 DBCS 문자열이다.

    • 마지막에 G를 기술한다. 작은따옴표, 큰따옴표 또는 G 문자는 DBCS 문자를 사용할 수 있다.

  • GX(hexa) Graphic constant

    • GX 그래픽 상수는 작은따옴표(' ') 또는 큰따옴표(" ")로 둘러싸여진 16진수 숫자로 이루어진 문자열이다.

    • 마지막에 GX를 기술한다. 각 4개의 hexa digit은 하나의 DBCS 문자를 표현한다.

    • 문법은 다음과 같다.

      figure syntax gx constant
  • Widechar data

    • 와이드캐릭터 데이터는 UTF-16 문자를 포함할 수 있다.

    • 하나의 UTF-16 문자는 2bytes를 차지한다.

  • WX(hexa) widechar constant

    • WX 와이드캐릭터 상수는 작은따옴표(' ') 또는 큰따옴표(" ")로 둘러싸여진 16진수 숫자로 이루어진 문자열이다.

    • 마지막에 WX를 기술한다. 각 4개의 hexa digit은 하나의 UTF-16 문자를 표현한다.

    • 문법은 다음과 같다.

      figure syntax wx constant

1.3.3. Picture specification

Picture specification은 작은따옴표(' ') 또는 큰따옴표(" ")로 둘러싸인 Picture 문자들로 구성된다. Picture 문자는 그 문자 위치에 해당 하는 데이터 내용에 대한 정보를 담고 있다.

Picture specification은 데이터 항목이 Character 문자열 데이터 항목인지 numeric 데이터 항목인지를 지정한다. Picture 문자 A 또는 X가 존재한다면, Character picture specification이 되고, 그렇지 않으면 Numeric character picture specification이 된다.

  • Picture repetition factor

    • Picture 문자 앞에 반복 회수를 괄호로 써 넣을 수 있다.

    • 예를 들면 PIC '(4)9V(2)9’는 PIC '9999V99’와 동일하다.

  • Picture characters for character data

    • Character data를 표현하기 위한 Picture 문자는 X, A, 9가 있다.

      picture 문자 의미

      X

      1Byte의 어떤 문자라도 가능하다.

      A

      알파벳 문자와 #, @, $ 문자 및 공백 문자가 가능하다.

      9

      숫자 또는 공백 문자가 가능하다.

    • 다음은 Picture 문자를 사용하는 예이다.

       DCL PIC_DATA PICTURE 'AAA99X';

      위와 같은 선언이 있을 때 다음의 값들은 PIC_DATA의 값으로 유효하다. b는 공백이다.

      'ABC12M'
      'bbb09/'
      'XYZb13'

      아래의 값들은 유효하지 않다.

      'AB123M'  ==> 3번째 문자 '1'이 picture 문자 A에 해당하는 위치로 잘못되었다.
      'ABC1/2'  ==> 5번째 문자 '/'가 picture 문자 9에 해당하는 위치로 잘못되었다.
      'Mb#A5;’ ==> 4번째 문자 'A'가 picture 문자 9에 해당하는 위치로 잘못되었다.
  • Picture characters for numeric character data

    • Numeric Character data는 산술 값을 표현한다. Picture specification은 X, A의 문자를 포함할 수 없다.

    • Numeric Character data는 그 쓰임에 따라 arithmetic value, character value 양쪽 중 하나로 처리된다.

      구분 설명

      Arithmetic value

      Picture 데이터 항목의 arithmetic value는 다음의 상황에 사용된다.

      • 변수가 Coded arithmetic value 또는 bit value의 결과를 가지는 표현식에 사용되었을 때

      • 변수가 Coded arithmetic, Numeric character 또는 bit 변수로 할당될 때

      • Edited-directed I/O에서 C, E, F, B, P(numeric) 형식으로 쓰일 때

      Numeric character 변수의 Arithmetic value는 내부적으로 Coded arithmetic value로 변환된다.

      Character value

      Picture 데이터 항목의 Character value는 다음의 상황에 사용된다.

      • 변수가 Character 표현식에 사용되었을 때

      • Character 변수로 지정될 때

      • List-directed 또는 Data-directed output으로 출력될 때

      • Edited-directed output에 A 또는 P(character) 형식으로 출력될 때

  • Digits와 decimal points

    • picture 문자 9, V는 Fixed point decimal value를 나타내는데 사용된다.

      Picture 문자 설명

      9

      해당되는 위치에 데이터 항목은 10진 숫자가 저장된다.

      V

      소수점 위치를 지정한다. 데이터에서 스토리지를 할당하지 않는다.

    • 다음은 예이다.

      Source Attributes Source Data Picture Specification Character value

      FIXED(5)

      12345

      99999

      12345

      FIXED(5)

      12345

      99999V

      12345

      FIXED(5)

      12345

      999V99

      undefined(SIZE 조건 발생)

      FIXED(5)

      12345

      V99999

      undefined(SIZE 조건 발생)

      FIXED(7)

      1234567

      99999

      undefined(SIZE 조건 발생)

      FIXED(3)

      123

      99999

      00123

      FIXED(5,2)

      123.45

      999V99

      12345

      FIXED(7,2)

      123.45.67

      9V9

      undefined(SIZE 조건 발생)

      FIXED(5.2)

      123.45

      99999

      00123

  • Zero suppression

    • Picture 문자 Z, 애스터리스크(*)는 Leading zero를 공백이나 애스터리스크(*)로 처리한다.

      Leading zero는 데이터 항목이 가지고 있는 숫자 값보다 왼쪽에 있는 자릿수들이다. Leading zero가 아닌 경우 위치에 해당하는 숫자가 저장된다.

      Picture 문자 설명

      Z

      Leading zero를 공백으로 대체한다.

      *

      Leading zero를 애스터리스크(*)로 대체한다.

    • 다음은 예이다.

      Source Attributes Source Data Picture Specification Character value

      FIXED(5)

      12345

      ZZZ99

      12345

      FIXED(5)

      00100

      ZZZ99

      bb100

      FIXED(5)

      00100

      ZZZZZ

      bb100

      FIXED(5)

      00000

      ZZZZZ

      bbbbb

      FIXED(5,2)

      123.45

      ZZZ99

      bb123

      FIXED(5,2)

      001.23

      ZZZV99

      bb123

      FIXED(5)

      12345

      ZZZV99

      undefined(SIZE 조건 발생)

      FIXED(5)

      000.08

      ZZZVZZ

      bbb08

      FIXED(5.2)

      000.00

      ZZZVZZ

      bbbbb

      FIXED(5)

      00100

      *****

      **100

      FIXED(5)

      00000

      *****

      *****

      FIXED(5.2)

      000.01

      ***V**

      ***01

      FIXED(5.2)

      95

      $**9.99

      $**0.95

      FIXED(5.2)

      12350

      $**9.99

      $123.50

  • Insertion characters

    • Picture 문자 comma (,), point(.), slash(/), B는 해당 위치에 Picture에 해당하는 값을 삽입한다.

      항목 설명

      comma (,), point(.), slash(/)

      Zero suppression이 발생하지 않으면, Picture 문자에 해당하는 문자를 삽입한다. Zero suppression이 발생하면, 다음의 경우에만 문자 삽입이 이루어진다.

      • Leading zero가 아닌 숫자 자리가 해당 picture 문자 위치의 왼쪽에 있을 때

      • 해당 Picture 문자 V가 왼쪽에 있고, 소수부 자리가 0이 아닐 때

      • 해당 Picture 문자가 제일 처음 위치일 때

      다른 경우에는 앞의 위치에 있는 문자로 Zero suppression 처리된다.

      B

      해당 Picture 문자 위치에 무조건 공백을 삽입한다.

    • 다음은 예이다.

      Source Attributes Source Data Picture Specification Character value

      FIXED(4)

      1234

      9,999

      1,234

      FIXED(6,2)

      1234.56

      9,999V.99

      1,234.56

      FIXED(4,2)

      12.34

      ZZ.VZZ

      12.34

      FIXED(4,2)

      00.03

      ZZ.VZZ

      bbb03

      FIXED(4,2)

      00.03

      ZZV.ZZ

      bb.03

      FIXED(4,2)

      12.34

      ZZ.VZZ

      12.34

      FIXED(4,2)

      00.00

      ZZZV.ZZ

      bbbbb

      FIXED(9.2)

      1234567.89

      9,999,999V.99

      1,234,567.89

      FIXED(7.2)

      12345.67

      **,999V.99

      12.345.67

      FIXED(7,2)

      00123.45

      **,999V.99

      ***123.45

      FIXED(9.2)

      1234567.89

      9.999.999V,99

      1.234.567,89

      FIXED(6)

      123456

      99/99/99

      12/34/56

      FIXED(6)

      123456

      99.9/99.9

      12.3/45.6

      FIXED(6)

      001234

      ZZ/ZZ/ZZ

      bbb12/34

      FIXED(6)

      000012

      ZZ/ZZ/ZZ

      bbbbbb12

      FIXED(6)

      000000

      ZZ/ZZ/ZZ

      bbbbbbbb

      FIXED(6)

      000000

      **/**/**

      ********

      FIXED(6)

      000000

      **B**B**

      **b**b**

      FIXED(6)

      123456

      99B99B99

      12b34b56

      FIXED(3)

      123

      9BB9BB9

      1bb2bb3

      FIXED(2)

      12

      9BB/9BB

      1bb/2bb

  • Signs와 Currency symbols

    • Picture 문자 S, +, -는 sign 부호를 나타낸다.

      Picture 문자 설명

      $, \

      해당 위치에 통화기호를 표시한다. Leading zero이면 Zero suppression으로 처리된다.

      S

      데이터 항목의 arithmetic value가 0보다 크거나 같으면 '+', 0보다 작으면 '-'를 저장한다. Leading zero이면 Zero suppression으로 처리된다.

      +

      데이터 항목의 arithmetic value가 0보다 크거나 같으면 '+', 0보다 작으면 공백을 저장한다. Leading zero이면 Zero suppression으로 처리된다.

      -

      데이터 항목의 arithmetic value가 0보다 크거나 같으면 공백, 0보다 작으면 '-'를 저장한다. Leading zero이면 Zero suppression으로 처리된다.

    • 다음은 예이다.

      Source Attributes Source Data Picture Specification Character value

      FIXED(5,2)

      123.45

      $999V.99

      $123.45

      FIXED(5,2)

      012.00

      99$

      12$

      FIXED(5,2)

      001.23

      $ZZZV.99

      $bb1.23

      FIXED(5,2)

      000.00

      $ZZZV.ZZ

      bbbbbbb

      FIXED(1)

      0

      $$$.$$

      bbbbbb

      FIXED(5,2)

      123.45

      $$$9V.99

      $123.45

      FIXED(5,2)

      001.23

      $$$9V.99

      bb$1.23

      FIXED(2)

      12

      $$$,999

      bbb$012

      FIXED(4)

      1234

      $$$,999

      b$1,234

      FIXED(5,2)

      2.45

      SZZZV.99

      +bb2.45

      FIXED(5)

      214

      SS,SS9

      bb+214

      FIXED(5)

      -4

      SS,SS9

      bbbb-4

      FIXED(5.2)

      -123.45

      +999V.99

      b123.45

      FIXED(5.2)

      -123.45

      -999V.99

      -123.45

      FIXED(5.2)

      123.45

      999V.99S

      123.45+

      FIXED(5.2)

      001.23

      ++B+9V.99

      bbb+1.23

      FIXED(5.2)

      001.23

      ---9V.99

      bbb1.23

      FIXED(5.2)

      -001.23

      SSS9V.99

      bb-1.23

  • Overpunched characters

    • Picture 문자 T, I, R은 음수, 양수에 따라 숫자 0 ~ 9를 다른 문자로 치환한다.

    • 치환되는 문자는 다음과 같이 정의된다.

      figure overpunch table
    • 다음은 예이다.

      Source Attributes Source Data Picture Specification Character value

      FIXED(4,2)

      21.05

      ZZV9T

      210E

      FIXED(3,2)

      -0.07

      ZZV9T

      bb0P

      FIXED(4,2)

      21.05

      ZZV9I

      210E

      FIXED(3,2)

      -0.07

      ZZV9I

      bb07

      FIXED(3)

      132

      R99

      132

      FIXED(3)

      -132

      R99

      J32

      FIXED(5,2)

      001.23

      $ZZZV.99

      $ 1.23

  • Zero replacement

    • Picture 문자 Y는 해당 위치에 0이 있으면 무조건 공백으로 치환한다.

      Source Attributes Source Data Picture Specification Character value

      FIXED(5)

      00100

      YYYYY

      bb1bb

      FIXED(5)

      10203

      9Y9Y9

      1b2b3

      FIXED(5,2)

      000.04

      YYYVY9

      bbbb4

  • Exponent characters

    • Picture 문자 K, E는 floating point 를 표현하기 위한 지수 문자이다.

      Picture 문자 설명

      K

      해당 위치 오른쪽에 floating point value의 지수 부분이 표시됨을 기술한다.

      문자 K는 정보만 표시할 뿐 데이터의 스토리지를 차지하지는 않는다.

      E

      해당 위치 오른쪽에 floating point value의 지수 부분이 표시됨을 기술한다.

      문자 E는 스토리지를 차지한다.

    • 다음은 예이다.

      Source Attributes Source Data Picture Specification Character value

      FLOAT(5)

      0.12345E06

      V.99999E99

      .12345E06

      FLOAT(5)

      0.12345E-06

      V.99999ES99

      .12345E-06

      FLOAT(5)

      0.12345E+06

      V.99999KS99

      .12345+06

      FLOAT(5)

      -123.45E+12

      S999V.99ES99

      -123.45E+12

      FLOAT(5)

      001.23E-01

      SSS9.V99ESS9

      123.00Eb-3

      FLOAT(5)

      001.23E+04

      ZZZV.99KS99

      123.00E+02

      FLOAT(5)

      001.23E+04

      SZ99V.99ES99

      +123.00E+02

      FLOAT(5)

      001.23E+04

      SSSSV.99E-99

      +123.00Eb02

2. 데이터 변환

본 절에서는 Computational data의 변환에 대해 설명한다.

PL/I에서는 일련의 속성을 가진 하나의 데이터 항목이 다른 속성를 가진 데이터 항목으로 저장될 때 데이터를 변환한다. Computational data의 값의 변환은 수학적인 수를 표현하기 위한 precision이나 문자열 표현을 위한 길이 정보에 대한 내부적인 속성값을 변환시킬수 있다.

다음은 데이터 변환(Data Conversion)을 발생시키는 경우에 대한 설명이다.

Case Target Attributes

Assignment

Assignment의 대상이 되는 변수의 속성이다.

Operand in expression

표현식을 evaluation하는 규칙에 의해 결정한다.

Stream input(GET statement)

Receiving field의 속성이다.

Stream output(PUT statement)

Edited-directed stream인 경우 지정된 format에 의해 결정된다. 그렇지 않을 경우는 문자열로 변환한다.

Argument to PROCEDURE or ENTRY

대응되는 파라미터의 속성이다.

Argument to builtin-function or pseudovariable

내장함수(Built-in function)나 의사변수(pseudo variable)의 종류에 따라 다르다.

RETURN statement expression

PROCEDURE에 기술된 RETURNS attributes이다.

문자열 길이를 제외한 source와 target 데이터 항목의 모든 속성들은 컴파일할 때 결정되어야 한다. 변환은 특별한 처리를 필요로 한다.

다음은 변환의 예이다.

    DCL A FIXED DEC(3,2) INIT(1.23);
    DCL B FIXED BIN(15,5);
    B = A

1.23의 DECIMAL 표현(packed decimal)이 BINARY(11,7)의 표현인 1.0011101B 로 변환되고, 다음으로 precision 변환이 수행되어서 결과가 BINARY(15,5)인 1.00111B가 된다.

2.1. 문자열 길이 변환

source 문자열은 왼쪽에서 오른쪽의 순서로 차례대로 target 문자열로 저장된다. source 문자열의 길이가 target 문자열의 길이보다 길면 초과하는 부분은 무시되고, STRINGSIZE 조건이 발생한다.

저장될 target 문자열의 길이 고정 길이이고 source 문자열의 길이보다 길면 모자라는 부분만큼 다음의 문자로 채워진다.

  • CHARACTER 문자열일 때 공백문자

  • BIT 문자열일 때는 '0’B 문자

  • GRAPHIC 문자열일 때는 DBCS 공백문자

2.2. Precision 변환

source의 산술적인 값이 target의 precision을 제외한 다른 속성이 동일하면, precision 변환이 필요하다. Fixed point data에 대해서 precision 변환 중에 소수점에 대한 정렬은 항상 맞춰진다. 따라서, 앞뒤에서 필요한 자릿수만큼 첨가되거나 넘치는 자릿수만큼 잘라내기도 한다. floating-point data에 대해 뒤에서 0이 첨가되거나 삭제된다.

2.3. 다른 데이터 속성 변환

다음 데이터 속성을 갖는 데이터 항목 변환에 대한 Source to Target 변환 규칙이 존재한다. 이에 대한 자세한 내용은 Source to Target 변환 규칙을 참고한다.

  • Coded arithmetic

    • FIXED BINARY

    • FIXED DECIMAL

    • FLOAT BINARY

    • FLOAT DECIMAL

  • Arithmetic character PICTURE

  • CHARACTER

  • BIT

  • GRAPHIC

decimal 표현과 binary 표현법에 따라 값이 변할 수 있다. decimal 표현과 binary 표현은 3.32라는 값을 통해 변환이 이루어진다.

  • n 자리의 decimal 자릿수는 CEIL( n * 3.32) 자리의 binary 자릿수로 변경된다.

  • n 자리의 binary 자릿수는 CEIL( n / 3.32 ) 자리의 decimal 자릿수로 변경된다.

2.4. Source to Target 변환 규칙

본 절에서는 각각의 타입별로 변환이 어떻게 이루어지는지 설명한다.

2.4.1. Target: Coded Arithmetic

  • Source: FIXED BINARY, FIXED DECIMAL, FLOAT BINARY, FLOAT DECIMAL

    • 각 타입별로 아래에서 따로 논의한다.

  • Source: Arithmetic char PICTURE

    • 데이터는 우선 PICTURE.attribute에 기술된 내용에 따라 scale 및 precision이 결정되고, 이에 해당하는 FIXED DECIMAL 또는 FLOAT DECIMAL 값으로 변경된다. 이 Decimal 값은 다시 target의 속성에 따라 변환된다.

  • Source:CHARACTER

    • Source CHARACTER 문자열은 올바른 산술 값 상수를 표현할 수 있어야 한다. 상수는 sign 부호로 시작할 수 있다. sign 부호와 상수 사이에 공백이 있어서는 안된다.

    • 상수는 base, scale, mode, precision을 가진다. 값을 할당할 때 이 속성들은 target의 속성에 맞게 변환된다.

    • 연산식(Operational expression)의 evaluation과 같은 처리에서 중간 결과 값이 필요한 경우 (N, 0)의 precision을 가지는 Decimal fixed point 값을 중간 값으로 갖는다. 문자열의 소수점 아래 부분은 상실된다.

  • Source:BIT

    • 연산식의 evaluation 중에 변환이 발생하면, 비트 문자열은 부호없는 FIXED BINARY(M,0)로 변환된다. 이후 target의 속성에 따라 변환된다.

    • source 비트 문자열의 길이가 precision의 최댓값을 얻는다면, 왼쪽의 비트들은 무시된다. 이때, 0이 아닌 비트 값이 무시되면, SIZE 조건이 발생한다.

  • Source:GRAPHIC

    • GRAPHIC 문자열은 먼저 CHARACTER로 변환된다. 이후 CHARACTER 변환 규칙에 따라 변환된다.

2.4.2. Target: FIXED BINARY(p2, q2)

  • Source: FIXED DECIMAL(p1, q1)

    • 다음은 결과 precision이다.

      p2 = min(M, 1+ CEIL(p1 * 3.32)) ,
      q2 = CEIL(ABS(q1 * 3.32)) * SIGN(q1)
  • Souece: FLOAT BINARY(p1)

    • 다음은 결과 precision이다.

      p2 = p1

      q2는 실제 소수점 자릿수가 계산되어 정해진다.

  • Source: FLOAT DECIMAL(p1)

    • 결과 Precision은 FIXED DECIMAL to FIXED BINARY와 동일한 공식을 사용한다.

    • p1은 선언된 값을 가지고, q1은 실제 소수점 자릿수가 계산되어 정해진다.

  • Source: Arithmetic character PICTURE

  • Source: CHARACTER

  • Source: BIT

  • Source: GRAPHIC

2.4.3. Target: FIXED DECIMAL(p2, q2)

  • Source: FIXED BINARY(p1, q1)

    • 다음은 결과 precision이다.

      p2 = 1 + CEIL(p1 / 3.32),
      q2 = CEIL(ABS(q1 / 3.32)) * SIGN(q1)
  • Source: FLOAT BINARY(p1)

    • 다음은 결과 precision이다.

      p2 = p1

      p1은 선언된 값이고, q1은 실제 소수점 자릿수가 된다.

  • Source: FLOAT DECIMAL (p1)

    • 다음은 결과 precision이다.

      p2 = p1

      q2은 실제 소수점 자릿수가 계산되어 정해진다.

  • Source: Arithmetic character PICTURE

  • Source: CHARACTER

  • Source: BIT

  • Source: GRAPHIC

2.4.4. Target: FLOAT BINARY(p2)

  • Source: FIXED BINARY(p1, q1)

    • 다음은 결과 precision이다.

      p2 = p1
  • Source: FIXED DECIMAL(p1,q1)

    • 다음은 결과 precision이다.

      p2 = CEIL(p1 * 3.32)
  • Source: FLOAT DECIMAL(p1)

    • 다음은 결과 precision이다.

      p2 = CEIL(p1 * 3.32)
  • Source: Arithmetic character PICTURE

  • Source: CHARACTER

  • Source: BIT

  • Source: GRAPHIC

2.4.5. Target: FLOAT DECIMAL(p2)

  • Source: FIXED BINARY(p1, q1)

    • 다음은 결과 precision이다.

      p2 = CEIL( p1 / 3.32 )
  • Source: FIXED DECIMAL(p1, q1)

    • 다음은 결과 precision이다.

      p2 = p1
  • Source: FLOAT BINARY(p1)

    • 다음은 결과 precision이다.

      p2 = CEIL(p1 / 3.32)
  • Source: Arithmetic character PICTURE

  • Source: CHARACTER

  • Source: BIT

  • Source: GRAPHIC

2.4.6. Target: Arithmetic character PICTURE

Arithmetic character PICTURE 데이터 항목은 fixed point 또는 floating point decimal 값의 문자 표현이다.

다음은 source가 Arithmetic character PICTURE 데이터 항목으로 변환될 때 앞, 뒤의 자릿수 손실없이 변환되는 규칙을 설명한다.

  • Source: FIXED BINARY(p1, q1)

    • target은 반드시 다음을 의미적으로 함축하고 있어야 한다.

      fixed decimal(1 + x + q - y, q)
      또는
      float decimal(x)

      이때, x >= CEIL(p1 / 3.32), y = CEIL(q1 /3.32)이고 q >= y이다.

  • Source: FIXED DECIMAL(p1, q1)

    • target은 반드시 다음을 의미적으로 함축하고 있어야 한다.

      fixed decimal(x + q - q1, q)
      또는
      float decimal(x)

      이때, x >= p1이고 q >= q1이다.

  • Source: FLOAT BINARY(p1)

    • target은 반드시 다음을 의미적으로 함축하고 있어야 한다.

      fixed decimal(p, q)
      또는
      float decimal(p)

      이때, p >= CEIL(p1 / 3.32)이다.

  • Source: FLOAT DECIMAL(p1)

    • target은 반드시 다음을 의미적으로 함축하고 있어야 한다.

      fixed decimal(p, q)
      또는
      float decimal(p)

      이때, p >= p1이다.

  • Source: CHARACTER

  • Source: BIT(n)

    • target은 반드시 다음을 의미적으로 함축하고 있어야 한다.

      fixed decimal(1 + x + q, q)
      또는
      float decimal(x)

      이때, x >= CEIL(n / 3.32)이고 q >= 0이다.

  • Source: GRAPHIC

2.4.7. Target: CHARACTER

  • Source: FIXED BINARY(p1, q1)

    • 우선 변환 규칙에 따라 FIXED DECIMAL로 먼저 변환된다. 이후 또다시 FIXED DECIMAL to CHARACTER 변환 규칙에 따라 변환된다.

  • Source: FIXED DECIMAL(p1, q1)

    • 문자열 상수로 변환된다.

    • p1 >= q1 >= 0라면 길이 p1 + 3(3은 있을지도 모르는 - 부호, 소수점, 소수점 앞에 있을 수 있는 leading 0에 필요)을 가지고, 우측 정렬된다.

      • leading 0는 공백으로 변경된다. 단, 정수부 값이 0인 경우 소수점 앞의 0은 제외한다.

      • '-' 부호는 음수값인 경우 음수의 첫 번째 자릿수 앞에 놓여진다. 양수의 경우는 부호가 없다.

      • q1 = 0인 경우 소수점은 나타나지 않는다.

    • p1 < q1 또는 q1 < 0이면 scaling factor가 제일 우측에 붙는다.

      scaling factor의 문법은 다음과 같다.

      F{+|-}nn

      {+|-}nn은 -q1의 값이다. 문자열 상수의 길이는 p1+k+3이 된다. k는 scaling factor의 F와 '+', '-' 부호를 제외한 길이이다.

    • 다음은 변환의 예이다.

      Precision Value String

      ( 6, 0 )

      4352

      'bbbbb4352'

      ( 3, 1 )

      -43.2

      'b-43.2'

      ( 4, -3 )

      -4352000

      '-4352F+3'

  • Source: FLOAT BINARY(p1)

    • 우선 변환 규칙에 따라 FLOAT DECIMAL로 먼저 변환된다. 이후 또다시 FLOAT DECIMAL to CHARACTER 변환 규칙에 따라 변환된다.

  • Source: FLOAT DECIMAL(p1)

    • Decimal floating point source는 E-format item에 의해 변환된다.

    • 문자열의 길이는 p1 + 8이고, 소수점 이하 자릿수는 p1 - 1, 유효자릿수는 p1이 된다.

    • 다음은 변환의 예이다.

      Precision Value String

      ( 6)

      4384*10**5

      'b4.38400E+0008'

      ( 6 )

      -.005832

      '-5.83200E-0003'

      ( 4 )

      1

      'b1.000E+0000'

  • Source: Arithmetic character PICTURE

    • Arithmetic character PICTURE 데이터 항목은 산술 값을 문자열 형태로 저장하므로 저장된 문자열 데이터가 그대로 Character 문자열이 된다.

    • Character data로 값이 할당되는 경우 문자열 길이 변환 규칙에 따른다.

  • Source: BIT

    • Bit 0은 문자 0으로, bit 1은 문자 1로 된다.

    • Null 비트 문자열은 Null character 문자열이 된다.

  • Source: GRAPHIC

    • DBCS에 대응되는 SBCS(Single-byte Character Set)가 있을 경우에 SBCS로 변환된다. 그렇지 않을 경우 CONVERSION 조건이 발생한다.

2.4.8. Target: BIT

  • Source: FIXED BINARY, FIXED DECIMAL, FLOAT BINARY, FLOAT DECIMAL

    • 산술 값이 바이너리로 변환된다. sign과 소수점 아래 자리는 무시된다. 결과 바이너리 값은 비트 문자열로 간주된다.

    • 우선 변환 규칙에 따라 FIXED DECIMAL로 먼저 변환된다. 이후 또다시 FIXED DECIMAL to CHARACTER 변환 규칙에 따라 변환된다.

  • Source: FIXED BINARY(p1, q1)

    • 중간 결과 비트 문자열의 길이이다.

      min(M, p1 - q1)

      만약 p1 - q1 <= 0이면 결과는 null 비트 문자열이 된다.

    • 다음은 변환의 예이다.

      Precision Value String

      ( 1)

      1

      '1’B

      ( 3)

      -5

      '101’B

      ( 4, 2 )

      2.43

      '10’B

  • Source: FIXED DECIMAL(p1, q1)

    • 중간 결과 비트 문자열의 길이이다.

      min(M, CEIL( (p1 - q1) * 3.32))

      만약 p1 - q1 <= 0이면 결과는 null 비트 문자열이 된다.

    • 다음은 변환의 예이다.

      Precision Value String

      ( 1)

      1

      '00001’B

      ( 2, 1)

      -1.8

      '0001’B

  • Source: FLOAT BINARY(p1)

    • 중간 결과 비트 문자열의 길이이다.

      min(M, p1)
  • Source: FLOAT DECIMAL(p1)

    • 중간 결과 비트 문자열의 길이이다.

      min(M, p1 * 3.32)
  • Source: Arithmetic character PICTURE

    • 저장된 산술 값을 DECIMAL 값으로 해석하여 FIXED DECIMAL 또는 FLOAT DECIMAL to BIT 변환 규칙이 적용된다.

  • Source: CHARACTER

    • 문자 0은 bit 0으로, 문자 1은 bit 1로 된다. 0과 1 이외의 다른 문자는 CONVERSION 조건이 발생한다.

    • Null Character 문자열은 null 비트 문자열이 된다.

  • Source: GRAPHIC

    • DBCS 0은 bit 0으로 DBCS 1은 bit 1로 된다. 다른 DBCS 문자는 CONVERSION 조건이 발생한다.

    • Null 문자열은 null 비트 문자열이 된다.

2.4.9. Target: GRAPHIC

Graphic source가 아닌 것은 우선 CHARACTER로 변환된다. 결과 문자열이 DBCS 문자열로 변환된다.

3. 데이터 선언

PL/I 프로그램이 실행될 때 여러 가지 타입을 가진 다양한 데이터 항목을 다룬다. 이름이 없는 상수를 제외한 데이터 항목은 속성과 이름 등의 데이터 정보를 선언(declaration)해야 사용할 수 있다. 데이터 항목, 타입, 속성의 자세한 내용은 데이터 원소를 참고한다.

본 절에서는 명시적 또는 묵시적인 선언, 스칼라, 배열, 구조체의 선언, 변수 이름의 scope, data alignment, default 속성에 대해 설명한다.

3.1. 명시적인 선언

데이터 항목의 이름은 다음과 같은 상황에서 명시적으로 선언된다. 명시적으로 선언된 데이터 항목의 범위(Scope)는 선언을 포함하는 블록이다.

  • DECLARE statement에 기술될 때 DECLARE statement는 데이터 항목의 이름과 속성을 명시적으로 선언한다.

  • Entry 상수로 선언한다. PROCEDURE, ENTRY statement의 label로 사용된 이름은 Entry 상수로 명시적인 선언이다.

  • Format 상수로 선언한다. FORMAT statement의 label로 사용된 이름은 명시적으로 Format 상수를 선언한다.

  • Label 상수로 선언한다. label로 사용된 이름은 명시적으로 label을 선언한다.

다음 그림은 명시적 선언의 범위를 보여주는 예이다. B와 B’은 동일한 이름인 B의 다른 선언을 구분하기 위해 사용되었다. C와 C’도 동일하다.

figure scope
명시적 선언 범위 예

3.1.1. DECLARE statement

DECLARE statement는 데이터 항목의 이름과 일부 또는 모든 속성을 기술할 수 있다. 명시적으로 속성이 기술되지 않고, 문맥적으로 속성을 결정할 수 없는 경우 default 속성이 적용된다.

figure syntax declare
항목 설명

*

스칼라, level-1 데이터의 이름으로 기술될 수 없다.

attributes

선언되는 데이터의 속성을 기술한다. 기술하는 순서는 관계없다. 자세한 내용은 데이터 타입과 속성을 참고한다.

level

양수인 정수이어야 한다. 스칼라, 배열 데이터를 선언할 때는 기술할 필요가 없고 level-1이 된다.

name

선언되는 데이터 이름을 기술한다. level-1 이름은 같은 블록 안에서 중복되어서는 안된다.

Condition prefix와 level은 DECLARE statement에 기술되어서는 안된다.

3.2. 묵시적인 선언

데이터 항목의 이름이 프로그램에서 쓰여졌는데 명시적으로 선언되지 않았다면 묵시적으로 선언된다. 해당 항목 이름이 사용된 External PROCEDURE statement 다음에 선언이 기술었을 때와 같은 scope를 가진다. 묵시적으로 선언된 데이터 항목의 일부 속성은 문맥에 의해 결정된다. 이를 문맥적 선언이라 부르는데 다음과 같다.

  • Built-in function 이름이다.

  • PROCEDURE, ENTRY statement에 parameter list로 기술된 데이터 항목은 PARAMETER 속성을 가진다.

  • 파일 이름이 사용되어야 하는 곳에 기술된다면 FILE 속성을 가진다.

  • ON CONDITION, SIGNAL CONDITION, REVERT CONDITION statemnt에 기술된 데이터 항목은 CONDITION 속성을 가진다.

  • BASED 속성에 기술된 이름이거나, locator qualification 기호의 왼쪽에 기술되면 POINTER 속성을 가진다.

묵시적으로 선언될 때 속성들이 문맥적 선언으로 결정되지 않으면 default 속성은 Default for attributes로 결정된다. 문맥적 선언은 명시적 선언 범위 내에 존재하지 않는다. 때문에 명시적 선언을 문맥적으로 판단하여 속성을 추가하는 것은 불가능하다.

3.3. 선언 범위(Scope of declarations)

대부분의 경우 선언된 데이터 항목의 범위는 프로그램 안에서 선언된 위치에 의해 결정된다. 묵시적인 선언은 External procedure의 PROCEDURE statement 다음에 DECLARE statement가 기술된 것과 같은 범위를 가진다.

어떤 블록에 명시적으로 선언된 이름은 오직 해당 블록 안에서만 의미를 지닌다. 해당 블록 밖에서는 바깥쪽 블록에 동일한 이름으로 선언되지 않은 이상 그 이름은 알려지지 않는다. 해당 블록 밖에서 동일한 이름으로 선언된다면, 바깥쪽 블록에서는 안쪽 블록과는 다른 데이터 항목을 참조하게 된다. 이 특성은 프로그램에서 local defination을 기술할 수 있게 된다.

다음의 예에서 PUT statement에 의한 결과 A는 C.A를 참조하게 되어 'FUNC1’이고, 결과 B는 프러시저 TEST에 선언된 'TEST '가 된다.

    TEST: PROC OPTIONS(MAIN);
      DCL (X,Y) CHAR(5) INIT('TEST ');
      CALL FUNC1;

      FUNC1: PROC ;
        DCL 1 C,
              3 A CHAR(5) INIT('FUNC1');
        PUT DATA( A, B );
       END FUNC1;
    END TEST;

3.3.1. INTERNAL과 EXTERNAL attributes(약어: INT, EXT)

INTERNAL과 EXTERNAL 속성은 참조 범위를 정의한다.

figure syntax scope attribute

INTERNAL은 Internal procedure의 Entry name과 모든 다른 변수에 default 속성이다. 단, Entry 상수, 파일 상수, 사용자 정의 조건들은 제외한다. INTERNAL은 선언된 블록 내로만 참조 범위를 지정한다.

EXTERNAL은 파일 상수, Internal procedure를 제외한 Entry 상수, 사용자 정의 조건의 default 속성이다. EXTERNAL 속성을 지닌 이름은 다른 External procedure에서 여러 번 선언될 수 있다. 모든 선언은 같은 데이터를 참조하기 위해 EXTERNAL 속성을 지닌 동일한 이름을 갖는다.

    TEST1: PROC;
      DCL 1 X EXTERNAL,
          3 A.
          3 B;
    ...
    END TEST1;

    TEST2: PROC;
      DCL 1 X EXTERNAL,
          3 A.
          3 Y;
    ...
    END TEST2;

TEST1에서 X.A가 변경되면, TEST2의 X.A도 변경된다. TEST1의 X.B가 변경되면, TEST2의 X.Y도 변경된다. 구조체의 멤버는 항상 INTERNAL 속성을 갖는다. EXTERNAL으로 선언들은 같은 데이터를 참조하므로, 그 선언들은 같은 속성들을 가지고 있어야 한다.

3.4. Data alignment

컴퓨터는 byte, halfword, fullword, 또는 doubleword 단위로 접근한다. halfword는 2개의 연속적인 bytes이고, fullword는 4개의 연속적인 bytes이다. doubleword는 8개의 연속적인 bytes이다. 따라서, halfword alignment는 2의 배수, fullword alignment는 4의 배수, fullword는 8의 배수 주소에 접근하게 된다.

PL/I는 이런 word 단위의 Data alignment를 지원한다. 이렇게 되는 경우 연속적인 데이터 항목 사이에 사용하지 않는 bytes가 존재하게 될 수도 있다. 이는 부가적인 스토리지를 더 필요로 하게 된다.

ALIGNED와 UNALIGNED 속성을 통해 이런 word 단위의 Data alignment를 사용할지 여부를 선택할 수 있다.

3.4.1. ALIGNED와 UNALIGNED attributes

ALIGNED 속성은 데이터 항목의 데이터 타입에 따른 범위에 데이터가 정렬되도록 지정한다.

UNALIGNED 속성은 다음 byte에 데이터가 정렬되도록 지정한다. 단, 고정길이의 비트 문자열은 다음 bit에 정렬된다.

figure syntax alignment attribute
Variable Type Storage size(Bytes) Alignment for ALIGNED Data Alignment for UNALIGNED Data

BIT(n)

ALIGNED: CEIL(n / 8) UNALIGNED: n bits

Byte

Bit

CHARACTER(n)

n

Byte

Byte

GRAPHIC(n)

2n

Byte

Byte

PICTURE

PICTURE 문자의 수(V, K, F제외)

Byte

Byte

DECIMAL FIXED(p,q)

CEIL((p + 1) / 2)

Byte

Byte

BINARY FIXED(p, q) SIGNED 1 <= p <= 7 UNSIGNED 1 <= p <= 8

1

Byte

Byte

CHARACTER(n) VARYING

n + 2

Halfword

Byte

BINARY FIXED(p, q) SIGNED 8 <= p <= 15 UNSIGNED 9 <= p <= 16

2

Halfword

Byte

BINARY FIXED(p, q) SIGNED 16 <= p <= 31 UNSIGNED 17 <= p <= 32

4

Fullword

Byte

BINARY FLOAT(p) 1 <= p <= 21

4

Fullword

Byte

DECIMAL FLOAT(p) 1 <= p <= 6

4

Fullword

Byte

POINTER

8 for 64bit

Doubleword

Byte

FILE

8 for 64bit

Doubleword

Byte

ENTRY

8 for 64bit

Doubleword

Byte

LABEL

8 for 64bit

Doubleword

Byte

FORMAT

8 for 64bit

Doubleword

Byte

BINARY FIXED(p, q) SIGNED 32 <= p <= 63 UNSIGNED 33 <= p <= 64

8

Doubleword

Byte

BINARY FLOAT(p) 22 <= p <= 53

8

Doubleword

Byte

DECIMAL FLOAT(p) 7 <= p <= 16

8

Doubleword

Byte

3.5. Default for attributes

PL/I 프로그램에서 모든 이름은 완전한 속성의 집합이 필요하다. 프러시저에 전달된 인자는 프러시저의 매개 변수와 일치하는 속성을 가져야 하며, 함수에 의해 반환되는 값은 예상되는 특성을 가져야 한다. 그러나 지정한 속성들은 거의 완전한 속성의 집합을 포함하는걸 필요로 하지 않는다.

다음에 대한 속성의 집합은 Language-specified defaults를 사용하거나, DEFAULT statement을 사용해서 Language-specified defaults를 수정해서 새로운 완전한 디폴트 집합을 구현해야 완전해진다.

  • 명시적으로 선언된 이름

  • 문맥적으로나 암시적으로 선언된 이름

  • 매개 변수 기술에 포함된 속성

  • 함수 프러시저로부터 반환된 값

디폴트로 적용되는 속성은 명시적 또는 문맥적 선언된 이름에 적용되는 속성을 재정의할 수 없다.

3.5.1. Language-specified defaults

변수가 어떤 데이터 속성으로 선언되지 않은 경우 디폴트로 산술 속성이 주어진다.

mode, scale, base가 DECLARE나 DEFAULT statement으로 지정되지 않은 경우, 컴파일러에서 제공하는 DEFAULT는 다음과 같은 속성을 결정한다.

  • DEFAULT가 적용되는 경우에 문자 I와 N 사이로 시작하는 이름을 가진 변수는 REAL FIXED BINARY(15,0)의 속성을 갖게 된다.

  • 그 외의 이름을 갖는 변수는 REAL FLOAT DECIMAL(6)의 속성을 갖게 된다.

만약 scaling factor가 정밀도 속성에 지정된 경우 FIXED 속성은 다른 속성이 적용되기 전에 적용된다. 그러므로 BINARY(p,q) 속성을 가진 선언은 항상 FIXED BINARY(p,q)의 속성을 가진 것과 동일하다.

정밀도가 산술 선언에 지정되지 않은 경우에는 컴파일러에서 제공하는 DEFAULT 규칙에 따라서 다음 표에 나타낸 것과 같이 정밀도를 결정한다.

속성 DEFAULT(IBM)

FIXED DECIMAL

(5,0)

FIXED BINARY

(15,0)

FLOAT DECIMAL

(6)

FLOAT BINARY

(21)

ENTRY 선언에 어떠한 기술(description)도 주어지지 않다면, 인자의 속성은 호출되는 프러시저에서 해당하는 매개 변수에 지정된 속성과 일치해야 한다.

다음의 예를 살펴본다.

DECLARE X ENTRY;
CALL X(1);

인자는 REAL FIXED DECIMAL(1, 0)의 속성을 갖는다. 만약 다음과 같이 프러시저 X가 다른 속성을 갖는 매개 변수를 선언했다면 오류가 된다.

X: PROC(Y);
 DECLARE Y BINARY FIXED(15);

ENTRY 선언이 모든 매개 변수의 속성을 지정한다면, 이러한 잠재적인 문제는 쉽게 피할 수 있다.

3.5.2. DEFAULT statement(약어: DFT)

DEFAULT statement는 속성 집합이 완전하지 않을 때 data-attribute default를 정의한다.

암시적인 선언과 문맥적인 선언 또는 부분적으로 완전한 명시적인 선언에 대해 DEFAULT statement가 적용되지 않는 속성은 Language-specified default에 의해 제공된다.

DEFAULT statement는 ENTRY나 FILE 속성으로 선언된 이름을 제외하고 모든 다른 속성 사양을 재정의한다. 하지만 VARIABLE를 암시하는 속성이 없는 이름은 DEFAULT statement가 적용되기 전에 PL/I에 의해 암시적으로 CONSTANT 속성이 제공된다. structure와 union의 요소는 qualified element의 이름이 아니라 요소의 이름에 따라서 디폴트 속성이 적용된다.

figure default stmt1

identifier:

image

항목 설명

RANGE(identifier)

같은 문자로 시작하는 이름들에 적용된다.

RANGE(identifier : identifier)

두 identifier로 지정된 문자로 시작하는 이름이나 두 알파벳 순서 사이에 있는 이름에 적용된다.

RANGE(*)

DEFAULT statement의 범위 안에 있는 모든 이름에 적용된다.

DESCRIPTORS

명시적 Entry 선언의 매개 변수 기술 목록에서 해당하는 매개 변수 기술에 포함되는 속성에 적용된다. 적어도 하나의 속성은 존재하여야 하고 NULL 기술에는 적용되지 않는다. RANGE() 위치에 RANGE() 대신 사용한다.

attribute_specification

  • attribute-list

    오로지 데이터 항목의 선언의 완성을 위해 필요한 속성들이다. FILE에 사용된다면 VARIABLE과 INTERNAL 속성들이 가능하다. 차원 속성은 속성 사양의 첫 번째 항목에서 정의할 수 있다. bound는 산술 상수 또는 표현식으로 지정될 수 있고, REFER 옵션을 포함할 수도 있다. 차원 속성은 오로지 명시적으로 선언된 이름에 대해서 디폴트 값을 적용할 수 있다. INITIAL 속성도 적용가능하다.

  • VALUE

    attribute_specification에 포함되는 VALUE 속성은 차원 속성 위치 전에 사용하는 것을 제외하고 속성 사양 내 어디든 나타낼 수 있다.

    VALUE는 영역 크기, 문자열 길이, 숫자 정밀도에 대한 디폴트 규칙을 정의한다. VALUE 구에 있는 크기, 길이, 정밀도는 시스템 디폴트 속성이 적용된 후가 아니라 크기, 길이, 정밀도에 대한 시스템 디폴트가 적용되기 전에 적용된다.

    다음의 예를 살펴보자.

    DEFAULT RANGE(I) VALUE(FIXED DECIMAL(7,3));
    I = 2;

    명시적으로 선언하지 않은 경우 I는 Language-specified default에 의해 FIXED BINARY(15,0) 속성을 갖게된다. 위의 DEFAULT statement은 오로지 FIXED DECIMAL의 속성을 가진 이름에 대해 디폴트 정밀도를 (7,3)으로 지정한 것이기 때문에 I는 DEFAULT statement에 영향을 받지 않는다.

블록 내에 DEFAULT statement은 여러 개가 올 수 있다.

DEFAULT statement가 적용되는 범위는 DEFAULT statement가 선언된 블록이다. 또, 같은 범위를 가지는 또다른 DEFAULT statement를 포함하지 않으면서, 같은 범위를 가지는DEFAULT statement가 있는 블록 안에 포함되지도 않은 모든 블록이 DEFAULT statement가 적용되는 범위이다. 즉, 같은 범위에 대한 DEFAULT statement가 선언된 블록이 있고, 블록 안에 있는 블록에서는 블록 내에서 선언된 같은 범위에 대한 DEFAULT statement의 속성이 먼저 그 블록 범위 내에서 적용이 된다.

내부 블록에서 DEFAULT statement은 명시적으로 선언된 이름에만 영향을 준다. 왜냐하면, 암시적 선언은 외부 프러시저의 ROCEDURE 문 다음에 이름이 기재되었을 때 DECLARE 문으로 선언된 것 처럼 암시적으로 선언 범위가 결정되기 때문이다.

다음의 예를 살펴보자.

 X: PROC;
 LABEL1: DEFAULT RANGE(AB) FLOAT;
  Y: BEGIN;
 LABEL2: DEFAULT RANGE(ABC) FIXED;
 END X;

LABEL1의 DEFAULT statement의 범위는 프러시저 X와 프러시저 안에 포함된 begin-block Y이다. LABEL1의 DEFAULT statement에서 지정한 범위는 프러시저 X와 begin-block Y에 선언된 문자열 AB로 시작하는 모든 이름이다. 단, begin-block Y에서는 문자열 ABC로 시작하는 이름들은 제외한다. 문자열 ABC로 시작하는 이름들은 begin-block Y 내에서 적용된다.

3.5.3. Restoring language-specified defaults

다음의 DEFAULT statement은 포함하는 블록 내에서 설립된 프로그래머가 정의한 default 규칙에 따라 모든 이름에 대해 재정의 한다. 이것은 포함된 블록들에 대해 language-specified default를 복원하는데 사용될 수 있다.

DEFAULT RANGE(*) SYSTEM;

3.6. 배열

배열은 동일한 속성을 가진 element들의 n차원 집합체이다. 배열의 각 항목은 배열 내의 위치를 기반으로 참조(subscript를 사용하여 참조)할 수 있다. REFER 인자로 사용되지 않았다면, 배열은 모든 차원에서 적어도 1개의 element를 가져야 한다.

3.6.1. DIMENSION attribute(약어: DIM)

DIMENSION 속성은 차원의 수와 상한(upper bound), 하한(lower bound)를 기술한다. Extent는 상한과 하한 사이에 있는 원소의 수이다.

figure syntax dimension attribute

DIMENSION 키워드가 생략되면 DIMENSION 속성는 반드시 선언되는 데이터 항목 이름 뒤에 와야 한다.

Bound의 기술은 다음에 따른다.

  • upper-bound만 기술한 경우 lower-bound는 default로 1이 된다.

  • lower-bound는 반드시 upper-bound보다 작거나 같아야 한다.

  • lower-bound나 upper-bound에 애스터리스크(*)가 기술된 경우 해당 파라미터에 대응되는 인자로부터 얻을 수 있다.

3.6.2. subscript

다음은 extent가 7개이고 bound가 -2:4인 배열이 선언된 예이다.

DCL X(-2:4) FIXED DEC(7);

여기에 1, 2, 3, 4, 5, 6, 7의 값이 할당된다고 가정하면, 각 element의 값은 다음과 같다.

X(-2) = 1
X(-1) = 2
X(0)  = 3
X(1)  = 4
X(2)  = 5
X(3)  = 6
X(4)  = 7

배열의 각 element를 참조하기 위해 괄호안에 기술된 숫자 -2 ~ 4를 subscript라고 한다.

3.7. 구조체

구조체, 배열, 또는 스칼라 변수인 멤버 element들의 집합체이다. 구조체 이름은 구조체의 전체 데이터를 참조할때 사용된다. 배열과는 다르게 구조체의 멤버들이 각기 다른 속성과 이름을 가질 수 있다. 참조되지 않는 멤버에 대해서는 애스터리스크(*)를 이름으로 기술 할 수 있다.

구조체는 레벨을 가진다. Level-1에 기술된 이름은 major structure라고 한다. 하위 레벨에 있는 구조체를 minor structure라고 한다. 말단 레벨에 있는 항목은 elementary variable이다.

구조체는 DECLARE statement에서 level-number를 선언될 변수 이름 앞에 기술함으로써 선언할 수 있다. level-number는 정수이다.

다음은 구조체를 선언하는 예이다.

 DCL 1 EMPLOYEE,                     /* major structure name */
      3 NAME,                        /* minor structure name */
        5 LAST CHAR(20),             /* elementary name */
        5 FIRST CHAR(20),            /* elementary name */
      3 EMP_NO FIXED DEC(7);         /* elementary name */

구조체의 멤버 이름이 유일하다면 멤버 이름만으로 구조체의 멤버를 참조할 수 있다. 하지만 동일한 이름이 다른 멤버 이름으로 사용된다면, 멤버 이름만으로는 어떤 멤버에 대한 참조인지 알 수 없다. 이런 모호성을 없애기 위해서 정확한 멤버를 참조하려면 Qualifier를 통한 참조 필요하다.

Qualifier는 하나 이상의 부모 멤버의 이름을 point(.)로 연결하여 사용한다. 위의 예에서 LAST를 참조하려면 Qualifier를 통한 참조는 EMPLOYEE.LAST 또는 EMPLOYEE.NAME.LAST로 참조할 수 있다. Qualifier는 반드시 레벨 순서로 기술되어야 한다.

 DCL Y FIXED INIT(1);
 BEGIN;
   DCL 1 X,
       3 Y FIXED INIT(10);

    DISPLAY (Y);
 END;

PL/I에서는 변수 선언의 scope가 블록 단위로 처리되므로, 위의 예에서 DISPLAY statement에서 참조하는 변수 Y는 먼저 Begin-block에 선언된 변수를 확인한다.

Begin-block 안에서 Y에 대한 모호성이 발생하지 않기 때문에 Y는 Begin-block 안의 X 구조체의 멤버 변수 Y를 참조하게 되어 10을 출력하게 된다. 첫 번째에 있는 Y의 변수 선언(초기화 값을 1로 가지는)이 Begin-block 안에 선언되어있다면, DISPLAY statement에서 참조하는 변수 Y는 구조체의 멤버가 아닌 스칼라 변수 Y를 참조하게 되어 출력값이 1이 된다.

 DCL 1 A,
       5 B,
       5 C,
         10 D,
       5 D;

위의 예에서 D는 두 곳에 선언이 되어 있다. A.D는 두 번째 D, 즉 레벨 숫자 5에 해당하는 D를 참고한다. A.D는 두 번째 D의 Qualification에 정확하게 일치하기 때문에 그렇게 된다. 첫 번째 D를 참조하려면 A.C.D 로 참조해야 한다.

 DCL 1 A,
       5 B,
         10 C,
       5 D,
         10 C;

위의 예에서 A.C는 두 개의 C 중 어떤 것을 참조해야 하는지 모호하다.

 DCL 1 A,
       5 A.
         10 A;

위의 예에서 A는 첫 번째 A를 참고한다. A.A는 두 번째 A를 참고한다. A.A.A는 세 번째 A를 참고한다.

 DCL X;
 DCL 1 Y,
       5 X.
         10 Z.
         10 A.
       5 Y,
         10 Z,
         10 A;

X는 첫 번째 X를 참고한다. Y.Z는 어느 것을 참조해야 할지 모호하다. Y.X.Z는 첫 번째 Z, Y.Y.Z는 두 번째 Z를 참고한다.

3.8. LIKE attribute

다른 구조체의 논리적인 구조를 동일하게 사용하기위해 선언하는 변수에 LIKE 속성이 기술될 수 있다. 대상이 되는 변수의 멤버 변수의 이름과 속성들이 선언되는 변수의 멤버로 동일하게 선언된다. 멤버 변수의 이름과 속성만 동일하게 선언될 뿐 대상이 되는 변수의 속성과 이름은 무시된다.

figure syntax like attribute

새로운 멤버는 구조체에 추가될 수 없다.

 DCL 1 A(10) ALIGNED STATIC,
       3 B CHAR(10),
       3 C CHAR(10);
 DCL 1 X LIKE A;

위와 같은 선언은 다음과 동일하다.

 DCL 1 A(10) ALIGNED STATIC,
       3 B CHAR(10),
       3 C CHAR(10);
 DCL 1 X,
       3 B CHAR(10),
       3 C CHAR(10);

변수 A의 속성 DIM(10), ALIGNED, STATIC은 LIKE에 의해 적용되지 않았다.

4. 스토리지 관리

모든 변수는 스토리지가 필요하다. 본 절에서는 PL/I에서 스토리지를 관리하는 방법에 대해서 설명한다.

스토리지 클래스 속성

스토리지는 automatic, static, controlled, based 4가지 클래스가 있다.

class 설명

automatic

변수가 선언된 블록이 활성화될 때 할당(allocation)되고, 해당 블록이 비활성화되면 스토리지는 해제(release)된다. 자세한 내용은 AUTOMATIC attribute(약어: AUTO)를 참고한다.

static

프로그램이 로딩될 때 할당(allocation)된다. 프로그램 실행이 종료될 때까지 스토리지는 해제(free)되지 않는다. 자세한 내용은 STATIC attribute를 참고한다.

controlled

ALLOCATE, FREE statement를 사용해서 스토리지 할당과 해제가 이루어진다. 같은 피제어 변수(Controlled variable)에 여러 번 할당이 이루어진다면 변수의 스토리지가 스택에 쌓이게 되어 세대 관리가 된다. 이전 세대에 대한 변수를 참조하려면 나중 세대의 변수를 해제해야만 한다. 자세한 내용은 CONTROLLED attribute(약어: CTL)를 참고한다.

based

ALLOCATE, FREE statement를 사용해서 스토리지 할당과 해제가 이루어진다. 피제어 변수와 달리 스택에 쌓이지 않는다. 자세한 내용은 BASE attribute를 참고한다.

스토리지 클래스 속성은 element, array, major structure에 명시적으로 기술될 수 있다. 단, 다음에는 기술되어서는 안된다.

  • CONDITION 조건

  • Defined data item

  • Entry constant

  • File constant

  • Format constant

  • Label constant

  • 구조체의 멤버

4.1. AUTOMATIC attribute(약어: AUTO)

Automatic 변수는 변수가 선언된 블록이 시작할 때 할당(allocation)되고, 블록이 끝날 때 해제(release)된다.

figure syntax automatic attribute

AUTOMATIC은 default 속성이다. Automatic 변수는 항상 Internal 변수이다.

Automatic 변수의 extent는 제한된 표현식으로 기술 될 수 있다. 단, 다른 변수를 참조하는 표현식은 사용할 수 있는데, 반드시 참조되는 변수 선언에 초기화 값이 존재해야 한다.

 DCL N FIXED BIN (31) INIT(15),
     X CHAR(N);

위의 예에서 변수 X의 문자열 길이는 변수 N으로 기술되었다. 변수 N은 초기화 값 15를 가지므로 X는 길이 15의 문자열 변수가 된다.

4.2. STATIC attribute

Static 변수는 프로그램이 실행되기 전에 할당(allocation)되고, 해당 스토리지는 프로그램이 종료될 때까지 남아있게 된다.

figure syntax static attribute

STATIC은 External 변수에는 default로 적용된다. 하지만 Internal 변수들도 STATIC 속성을 지정할 수는 있다. 또한 프러시저 밖에서 선언된 변수는 STATIC 속성을 갖는다.

 P: PACKAGE;
    DCL A CHAR(10);

    FUNC1: PROC OPTIONS(MAIN);
        FUNC2: PROC;
            DCL B STATIC INTERNAL;
        END FUNC2;
    END FUNC1;


    FUNC3: PROC;
        Y = 'TEST';
    END FUNC3;
 END P;

위의 예에서 변수 B는 STATIC 스토리지를 가지게 되고, 프로그램이 시작할 때 할당된다. 단, B에 대한 참조는 선언 B를 포함한 블록 FUNC2 안에서만 가능하다. 변수 A는 STATIC 속성을 가지게 되어 STATIC 스토리지를 가진다.

Static 변수가 INITIAL 속성을 사용해서 초기화하면, 초기화 값은 반드시 제한된 표현식(Restricted expression)이어야 한다. 배열의 Extent도 반드시 제한된 표현식으로 기술되어야 한다. 제한된 표현식은 컴파일 시간에 상수 값이 결정되는 표현식이다.

4.3. CONTROLLED attribute(약어: CTL)

CONTROLLED 속성으로 선언된 변수는 ALLOCATE statement를 통해 할당(allocation)되고, 해당 변수는 FREE statement를 통해 해제(free)되거나 프로그램이 종료될 때 해제된다. 할당되지 않은 피제어 변수를 대한 참조하면 에러가 발생한다.

피제어 변수가 아닌 변수를 피제어 변수를 파라미터로 갖는 프러시저를 호출할 때 사용할 수 없다.

figure syntax controlled attribute

다음은 피제어 변수를 사용하는 예이다.

  FUNC1: PROC;
      DCL X(M,N) CONTROLLED;
      DCL M FIXED, N FIXED;
      ...
      CALL FUNC2;
      FUNC2: PROC;
        GET LIST(M,N);
        ALLOCATE X;
        GET LIST(X);
        ...
      END FUNC2;
      ...
      FREE X;
  END FUNC1;
피제어 변수의 세대 관리

ALLOCATE statement가 실행되면 피제어 변수에 대해 스토리지를 할당하고 스택에 넣는다. 따라서, 이전에 할당되었고 해제되지 않은 스토리지는 스택의 아래쪽으로 내려가게 된다. 이런 stacking은 변수에 대한 새로운 세대를 생성하게 된다.

새로 생성된 세대는 이제 현재의 세대가 되고, 이전 세대는 현재 세대가 해제되지 않는 한 직접 접근할 수 없다. FREE statement 가 실행되면 스택에서 현재 세대의 스토리지를 꺼내오고, 할당을 해제한다. 따라서 바로 이전 세대가 이제는 현재 세대가 된다.

4.3.1. 피제어 변수의 ALLOCATE statement

ALLOCATE statement는 피제어 변수(Controlled variable)에 대한 스토리지를 할당한다. Controlled 파라미터들도 할당될 수 있다. ALLOCATE statement에 피제어 변수의 배열의 bound, 문자열 길이를 기술할 수 있다.

figure syntax allocate controlled

배열의 bound와 문자열의 길이는 ALLOCATE statement가 실행되는 시점에서 evaluated된다.

  • ALLOCATE statement 나 DECLARE또는 DEFAULT statement에 필요한 크기 정보와 문자열 길이 정보가 기술되어 있어야 한다.

  • ALLOCATE statement에서 DIMENSION 속성이나 문자열 길이가 기술된다면, 변수 선언에 기술된 속성을 대신한다.

  • ALLOCATE statement에서 bound, 문자열 길이가 애스터리스크(*)로 기술되어 있다면, 현재 세대의 정보를 사용한다. 만약 현재 세대의 변수가 없다면 해당 정보는 undefined가 되고 프로그램은 에러가 된다.

  • ALLOCATE statement에서 기술된 DIMENSION 속성은 선언된 dimension의 차원 숫자에 맞게 기술되어야 한다. 즉, 1차원 배열이면 DIMENSION 속성이 1개 기술되어야 하고, 2차원 배열이면 2개, ..., n 차원 배열이면 n개의 DIMENSION 속성이 기술되어야 한다.

  • BIT, CHARACTE, GRAPHIC 속성은 반드시 DECLARE statement에 기술된 속성과 같아야 한다.

다음은 ALLOCATE statement를 사용한 예이다.

  DCL X(M,N) CHAR(L) CTL;
  M = 10;
  N = 5;
  L = 100;
  ALLOCATE X(5,5) CHAR(200);

4.3.2. 피제어 변수의 FREE statement

피제어 변수(Controlled variable)의 할당된 스토리지를 해제한다.

figure syntax free controlled

4.3.3. 애스터리스크 표기

ALLOCATE statement에서 dimension, 문자열 길이가 애스터리스크(*)로 기술되면, 그 값은 현재 세대의 값을 사용한다. 배열에 대해서 애스터리스크(*)는 반드시 dimension 수만큼 기술되어야 한다.

  DCL X(M,N) CHAR(L) CTL;
  M = 10;
  N = 5;
  L = 100;
  ALLOCATE X;
  ALLOCATE X(5,5) CHAR(200) ;
  ALLOCATE X(*,*) CHAR(*);

위의 예에서 변수 X의 첫 번째 세대는 dimension (10,5) , 문자열 길이 100을 가진다. 두 번째와 세 번째 세대는 dimension (5,5), 문자열 길이 200을 가진다.

4.3.4. Extent의 조정

Controlled 스칼라, 배열, 구조체의 멤버는 배열의 Extent와 문자열의 길이를 세대별로 조절할 수 잇다.

다음 예에서 구조체가 ALLOCATE statement를 통해 할당이 되면, X.Y는 1에서 8의 bound를 가진 배열이 되고, X.Z는 길이 4를 가진 가변 문자열이 된다.

  DCL 1 X CTL,
        3 Y(M:N).
        3 Z CHAR(*) VARYING;
  M = -4;
  N = 4;
  ALLOC 1 X, 3 Y(1:8), 3 Z CHAR(4);
  FREE A;

4.4. BASE attribute

기저부 변수(Based variable)의 선언은 필요한 스토리지의 크기와 속성들에 대한 기술이다. Locator를 통해 스토리지의 위치를 식별한다. 할당되지 않은 기저부 변수에 대해 참조를 하면 에러가 발생한다.

스토리지는 ALLOCATE statement를 통해 할당하고, FREE statement를 통해 해제한다.

figure syntax based attribute

기저부 변수는 EXTERNAL 속성을 가질 수 없다. Locator 참조는 어떤 변수에 대해서도 가능하다.

기저부 변수(Based variable) 선언에서 Extent 기술

REFER 옵션을 사용하지 않는다면 BASED 선언에서 Extent 기술은 다음의 예외를 제외하면 제한된 표현식이 되어야 한다.

  • 상수가 아닌 배열의 Extent를 사용하려면 다음 조건에 맞아야 한다.

    • 1차원 배열이어야 한다.

    • lower bound는 상수이다.

    • 구조체의 일부일 때 다른 모든 멤버의 Extent는 상수이고, 해당 배열 멤버나 부모 구조체의 다음 멤버가 없어야 한다.

  • 상수가 아닌 CHARACTER 문자열 Extent를 사용하려면 다음 조건에 맞아야 한다.

    • 구조체의 마지막 멤버이다.

    • 부모들이 배열이어서는 안된다.

    • UNALIGNED, NONVARYING 중 하나의 속성을 가져야 한다.

  • 다음은 상수가 아닌 Extent를 가질 수 있다.

    • BIT extent

    • GRAPHIC extent

4.4.1. Locator 변수

Locator 변수는 기저부 변수의 스토리지 위치를 가리킨다. 현재 PL/I에서는 Locator 변수로 Pointer 변수만 지원한다.

다음의 예에서 X에 대한 참조는 X의 스토리지 주소를 가리키는 Locator 변수 P를 사용해서 이루어진다.

 DCL X CHAR(10) BASED (P);

기저부 변수가 Locator 없이 선언이 된다면, 기저부 변수 참조는 다음의 예와 같이 명시적으로 locator-qualifier를 사용해야 한다.

 DCL X CHAR(5) BASED ;
 DCL Y CHAR(10);
 DCL Z CHAR(20);
 DCL P PTR;
 P = ADDR(Y);

 Z = P->X;

다음의 예에서 배열 A와 C는 같은 스토리지를 갖는다. B와 C(2,1)도 같은 스토리지를 가진다.

 DCL A(3,2) CHAR(5) BASED (P);
 DCL B CHAR(5) BASED(Q);
 DCL C(3,2) CHAR(5);
 P = ADDR(C);
 Q = ADDR(A(2,1));

4.4.2. Locator qualification

Locator qualification은 '->' 기호를 통해 하나 이상의 qualifier를 기술한다.

figure syntax locator qualification

다음의 예에서 X는 기저부 변수, P는 Locator 변수, Q는 Based locator 변수가 된다.

 P->Q->X

이 참조는 Locator P의 값은 Based locator Q의 주소이다. 이 주소에 있는 Q의 값은 기저부 변수 X의 주소이다. 따라서, X에 대한 참조는 이 주소를 참조함으로써 이루어진다.

Based 변수에 대한 참조는 또한 묵시적으로 Qualified될 수 있다.

다음의 예에서 ALLOCATE statement는 X 변수에 할당한 스토리지의 주소를 Pointer 변수 P에 저장한다.

 DCL X FIXED BIN BASED(P);
 ALLOC X;
 X = 3;

"X = 3;"에서 X에 대한 참조는 P라는 묵시적인 locator-qualifier에 의해 이루어진다. 이 문장은 "P->X = 3;"과 동일한 문장이다.

  DCL (P(10),Q) PTR,
       R PTR BASED(Q),
       V BASED(P(3)),
       W BASED(R),
       Y BASED;
  ALLOCATE R,V,W;

위의 예제에 대해, 다음의 참조는 유효하다.

  P(3)->V
  V
  Q->R->W
  R->W
  W

처음 두 참조는 동일하다. 마지막 3개의 참조 또한 동일하다. Y에 대한 참조는 반드시 Locator 변수 Qualifier가 포함되어야 한다.

4.4.3. POINTER attribute(약어: PTR)

Pointer 변수는 Based 변수의 선언에서 BASED 속성에 기술되거나, ALLOCATE, LOCATE, READ, FETCH 문의 SET 옵션에 기술될 경우 문맥적으로 선언된다. 또한 POINTER attribute를 명시적으로 사용함으로써 선언할 수 있다.

figure syntax pointer attribute

4.4.4. 기저부 변수의 ALLOCATE statement

ALLOCATE statement는 기저부 변수(Based variable)의 스토리지를 할당하고, Locator 변수에 스토리지 주소를 저장한다.

figure syntax allocate based

할당되는 스토리지의 크기는 기저부 변수의 속성과 ALLOCATE statement가 실행되는 시점에 결정되는 크기, 문자열의 길이에 따라 결정된다.

4.4.5. 기저부 변수의 FREE statement

기저부 변수(Based variable)에 대해 할당된 스토리지를 해제한다.

figure syntax free based

4.4.6. REFER attribute

Based 구조체에서 문자열 길이나 배열의 bound를 Refer object라 불리는 변수를 사용해 해당 선언된 구조체 안에 정의할 수 있다. 구조체의 스토리지가 할당될때 Refer object 변수의 값이 저장된다.

figure syntax refer attribute

다음 예를 살펴보자.

 DCL 1 VAR BASED(P),
       3 A FIXED BINARY (31),
       3 B (UBND REFER(A));
 DCL UBND FIXED BINARY(31) INIT(100);

VAR이 할당될 때 배열 B의 upper bound는 변수 UBND의 현재 값을 가지고, 이 값은 변수 A에 저장된다. 이후 B에 대한 참조에서 upper bound는 A로부터 얻어진다.

4.5. INITIAL attribute(약어: INIT)

변수의 스토리지가 할당될 때 초기화 값을 지정한다. INITIAL 속성은 Defined 데이터, 파라미터에 사용될 수 없다.

figure syntax initial attribute
항목 설명

*

Iteration factor처럼 사용될 때를 제외하고 남아있는 element에 대해 초기화하지 않도록 하기 위해 기술한다.

iteration factor

Iteration item이 몇 번 반복될지를 기술한다. 특히 배열에 주로 사용된다.

애스터리스크(*)가 사용되면 남아있는 element에 대해 Iteration item에 기술된 값으로 초기화한다.

constant, reference, expression

초기화 값을 기술한다.

다음은 iteration factor 사용 예이다.

 ((2)'A')     ==> ('AA')
 ((2)('A'))   ==> ('A', 'A')
 ((2)(1)'A')  ==> ('A', 'A')
 ((*)(1)('A') ==> ('A', 'A', ..., 'A')

다음은 INIT 속성을 사용하여 초기화가 이루어지는 예이다.

 DCL X FIXED DEC (7,3) INIT( 34.503 );
 DCL Y CHAR(10) INIT( 'TEST INIT');
 DCL Z (100,10) FIXED DEC(5) INIT( (920)0, (20) ((3)5, 9) );

마지막 Z는 100*10 배열이다. 즉, 1000개의 extents를 가진다. INIT 속성에 의해 920개는 0으로 초기화되고, 나머지 80개에는 5, 5, 5, 9의 값이 반복해서 초기화된다.

4.6. AREA 데이터

AREA 변수는 기저부 변수(Based variable)의 할당과 해제을 위한 공간을 정의할 수 있다. AREA 변수는 AREA attribute를 이용하여 선언할 수 있고, AREA 변수는 4가지 스토리지 클래스 중 하나를 가질 수 있다.

AREA의 크기는 문자열 길이나 배열 크기 지정과 동일한 방식으로 지정할 수 있고, 애스터리스크(*)로 기술될 수 있으며, REFER 옵션을 사용할 수 있다.

figure syntax area attribute
항목 설명

expression

AREA의 크기를 지정한다.

만약 표현식이나 애스터리스크(*)가 지정되어 있지 않으면, 기본값은 1000이다.

*

파라미터일 경우 AREA의 크기를 애스터리스크(*)로 지정할 수 있다.

REFER

REFER에 대한 자세한 내용은 "REFER attribute"를 참고한다.

다음은 AREA 변수를 선언하는 예이다.

 DECLARE AREA1 AREA(1500),
         AREA2 AREA;

AREA는 정의한 크기와 별개로 16 bytes의 제어 정보가 추가로 정의된다. 따라서 AREA1의 크기는 1516, AREA2의 크기는 1016이 된다. 제어 정보에는 현재 스토리지 사용량이 저장되어 있다.

기저부 변수(Based variable)을 AREA에 할당할 경우 AREA의 일부 영역이 반환되며, 해제할 경우 해당 영역은 다른 변수의 할당에 사용할 수 있다. AREA는 현재 할당된 스토리지를 체인으로 관리하고, 체인의 첫 부분은 제어 정보에 저장된다. 제어 정보 필드를 임의적으로 수정할 경우 예상치못한 에러가 발생할 수 있다.

만일 할당할 기저부 변수(Based variable)의 크기보다 남은 AREA 공간이 작을 경우 AREA 조건이 발생된다.

4.7. DEFINED와 POSITION attributes(약어: DEF, POS)

DEFINED 속성을 가지면 Base 변수의 스토리지의 일부 또는 전체를 선언된 변수의 스토리지로 동일하게 사용할 수 있다.

figure syntax defined attribute
항목 설명

reference

선언된 변수의 스토리지를 가지고 있는 Base 변수이다.

Base 변수는 BASED, DEFINED 속성을 가져서는 안된다.

Defined 변수는 Base 변수로부터 속성들을 상속받지 않는다. Defined 변수는 INTERNAL이고, level-1 변수이어야 한다. DIMENSION 속성을 가질수 있다. INITIAL, AUTOMATIC, BASED, CONTROLLED, STATIC, PARAMETER 속성을 가질 수 없다.

3가지 타입의 Defined 변수가 존재한다. 단, iSUB는 지원하지 않는다.

  • simple

  • iSUB

  • string overlay

타입은 다음에 따라 결정된다.

  1. POSITION 속성이 있으면 string overaly defining type이다.

  2. 위 두 가지가 아닌 경우 프로그램을 호출할 때 파라미터와 인자 간의 매칭 룰을 사용해서 Defined 변수와 Base 변수의 속성을 비교한다. 이때 매칭이 되면 (DEFINED 속성은 제외하고) simple defining type이 된다. 단, 이때 파라미터의 dimension bound나 문자열의 길이는 애스터리스크(*)인 것으로 생각하고 매칭 룰을 적용해서 비교한다. 즉, dimension bound, 문자열 길이 속성은 비교하지 않는다.

  3. 나머지의 경우는 string overlay defining type이다.

Simple defining

Simple defining은 스칼라, 배열, 구조체 등의 다른 변수에 대해 참조할 수 있다. Defined 변수와 Base 변수의 ALIGNED와 UNALIGNED 속성은 반드시 서로 같아야 한다.

 DCL X(5,5,5);
 DCL A(2,2,2) DEF X;
 DCL B(5,5) DEF X((*,*,5);
 DCL C DEF X(L,M,N);

A는 X(2,2,2)의 배열로 만들어지는 3차원 배열이 된다. B는 X((1,1,5) ~ X(5,5,5)에 해당하는 2차원 배열이 된다. 이 두 개의 Defined 변수의 스토리지는 연속적이지 않아서 Unconnected 스토리지를 갖는다.

현재 OpenFrame PL/I은 Unconnected storage를 지원하지 않는다.

C는 subscript L, M, N의 현재 값에 해당하는 X(L,M,N)의 스토리지를 참고한다.

 DCL X CHAR(100),
     Y CHAR(10) DEF X;

Y는 X의 첫 10문자를 갖는 문자열이다.

String overlay defining

Defined 변수와 Base 변수가 string 또는 picture 데이터여야 한다. ALIGNED, VARYING 속성을 가질 수 없다.

 DCL X CHAR(100),
     Y(10,10) CHAR(1) DEF X;
 DCL A(10) CHAR(1),
     B CHAR(10) DEF A;
POSITION attribute

String overlay에만 사용된다. Base 변수에서 Defined 변수의 시작 위치를 지정한다.

 DCL B(10,10) BIT(1),
     X BIT(40) DEF B POS(20);

X는 B의 20번째 원소부터 40개로 구성된 bit 문자열이다.

 DCL A PIC '999V.999',
     X(7) CHAR(1) DEF (A),
     Y CHAR(3) DEF (A) POS(5),
     Z(4) CHAR(1) DEF(A) POS(3);

X는 picture 데이터 A의 문자열로 구성된 문자열이다. Y는 picture 데이터 A의 마지막 3개의 문자 '999' 에 해당하는 문자열이다. Z는 picture 데이터 A의 '9.99’에 해당하는 문자열이다.

 DCL X(20) CHAR(10),
     Y(10) CHAR(5) DEF (X) POSITION(1);

Y는 X문자열의 처음 50문자로 구성된 문자열이다. POSITION(1)은 반드시 기술되어야 한다. 그렇지 않으면 simple defining이 되어 결과가 달라진다.

4.8. OFFSET 데이터

OFFSET 변수는 할당된 기저부 변수(Based variable)의 위치가 AREA의 시작점으로부터 얼마나 떨어져있는지를 나타낸다.

figure syntax offset attribute

OFFSET 변수는 AREA 변수가 지정되어 있으면 AREA와 연관되어 POINTER 값으로 변환될 수 있다. 만일 AREA 변수가 지정되어 있지 않은 경우 POINTER 내장함수를 사용하여 명시적으로 AREA 변수를 지정해주어야 한다.

OFFSET 변수에 값을 저장할 수 있는 방법은 다음과 같다.

  • ALLOCATE statement

  • 다른 OFFSET 변수나 POINTER 변수의 값을 저장

  • ADDR, OFFSET, NULL 등의 내장함수 사용