맨위로가기

PL/I

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

PL/I는 1960년대 IBM이 개발한 프로그래밍 언어로, FORTRAN, COBOL, ALGOL의 특징을 통합하여 다목적으로 설계되었다. 1960년대 후반부터 1970년대 초까지 메인프레임에서 주로 사용되었으며, 이후 미니컴퓨터와 개인용 컴퓨터로 확장되었다. PL/I는 블록 구조, 다양한 데이터 타입, 예외 처리 기능 등을 제공했지만, 언어의 복잡성, 컴파일러 구현의 어려움, 그리고 경쟁 언어들의 발전으로 인해 널리 채택되지는 못했다. PL/I는 멀티태스킹, 전처리기, 구조적 프로그래밍 기능 등을 포함하며, 다양한 컴파일러와 방언이 존재한다.

더 읽어볼만한 페이지

  • 1964년 개발된 프로그래밍 언어 - 베이직
    베이직은 1960년대 초 다트머스 대학교에서 개발된 프로그래밍 언어로, FORTRAN과 ALGOL의 복잡성을 개선하고 STEM 분야 외 학생들의 프로그래밍 교육을 위해 개발되었으며, 시분할 시스템을 활용하여 즉각적인 피드백을 제공했다.
  • 1964년 개발된 프로그래밍 언어 - APL (프로그래밍 언어)
    APL은 케네스 아이버슨이 개발한 배열 지향 프로그래밍 언어로, 간결한 표기법과 특수 문자 집합을 사용하며, 아이버슨의 수학적 표기법에 기반하여 객체 지향 프로그래밍과 .NET 지원 등의 확장 기능을 제공한다.
  • 병행 프로그래밍 언어 - 자바 (프로그래밍 언어)
    자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다.
  • 병행 프로그래밍 언어 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
  • 시스템 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 시스템 프로그래밍 언어 - 스위프트 (프로그래밍 언어)
    2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
PL/I - [IT 관련 정보]에 관한 문서
일반 정보
이름PL/I
패러다임절차적 프로그래밍
명령형 프로그래밍
구조적 프로그래밍
발표 연도1964년
개발자IBM, SHARE 언어 개발 위원회, ISO
타이핑강한정적 타이핑
방언PL/M
XPL
PL/P
PL/C
IBM PL/S
PL/AS
PL/X
PL/8
초기 PL/I
영향을 준 언어COBOL
Fortran
ALGOL 60
영향을 받은 언어Control Language
PL/M
PL/S
PL-6
PL.8
REXX
SAS
웹사이트IBM PL/I 컴파일러 제품군
기타 정보
설계자IBM, SHARE 언어 개발 위원회, ISO
플랫폼z/OS
z/VM
z/VSE
AIX
Windows 외
라이선스독점 라이선스(IPLA)

2. 역사

1950년대와 1960년대 초, 비즈니스 및 과학 분야 사용자들은 서로 다른 프로그래밍 언어를 사용하여 각기 다른 컴퓨터 하드웨어에 맞춰 프로그램을 작성했다. 비즈니스 분야 사용자들은 COMTRAN을 거쳐 오토코더에서 코볼로 옮겨갔지만, 과학 분야 사용자들은 GIP(General Interpretive Programme), 포트란, 알골, GEORGE로 프로그램을 작성하였다. IBM 시스템/360[93](1964년에 발표되었으나 1966년까지 보급되지 않았음)은 두 그룹의 사용자들을 위한 공통 머신 아키텍처로 설계되어 기존의 모든 IBM 아키텍처들을 대체하였다. 이와 비슷하게, IBM은 모든 사용자를 위한 단일 프로그래밍 언어를 원했다. IBM은 포트란이 상용 프로그래머들이 필요로 하는 기능들로 확장되길 바랐다. 1963년 10월, IBM 과학 사용자 그룹의 세 명의 뉴욕 IBM 출신과 세 명의 SHARE 출신에 의해 위원회가 설립되었고,[94] 포트란에 대한 이러한 확장을 제안하였다. 포트란의 제약으로 인해 이를 수행할 수 없었고, 알골에 어느 정도 기반한 NPL이라는 이름의 새로운 프로그래밍 언어 설계에 착수하였다. NPL이라는 이름은 영국의 National Physical Laboratory와 충돌하여 MPPL(MultiPurpose Programming Language)로 바뀌었고, 1965년 PL/I로 바뀌었다. 최초의 정의는 1964년 4월에 등장하였다.[95][96]

IBM은 NPL을 시작점으로 삼아 첫 번째 컴파일러를 작성할 수 있는 수준으로 설계를 완료했다. NPL 정의는 범위와 세부 사항 면에서 불완전했다.[9] PL/I 언어의 제어는[10] 처음에는 뉴욕 프로그래밍 센터에, 나중에는 Hursley(허슬리)의 IBM 영국 연구소에 귀속되었다. SHARE 및 GUIDE(가이드) 사용자 그룹은 언어 확장에 참여했으며, PL/I 프로젝트를 통해 언어를 제어하는 IBM 프로세스에 역할을 했다. 이렇게 큰 언어를 정의한 경험은 PL/I의 공식적인 정의 필요성을 보여주었다. 1967년 IBM Laboratory Vienna(IBM 비엔나 연구소)에서 모호하지 않고 완전한 사양을 만들기 위한 프로젝트가 시작되었으며,[11] 이는 차례로 개발을 위한 최초의 대규모 형식 기법(Formal Methods) 중 하나인 비엔나 개발 방법(VDM)으로 이어졌다.

Fred Brooks(프레드 브룩스)는 PL/I에 CHARACTER 데이터 형식을 보장한 것으로 알려져 있다.[12]

이 언어는 1965년 뉴욕에서 작성된 "PL/I 언어 사양. C28-6571" 매뉴얼에 처음으로 자세히 명시되었으며, 1967년 허슬리에서 작성된 "PL/I 언어 사양. GY33-6003"으로 대체되었다. IBM은 60년대 후반과 70년대 초반에 PL/I를 계속 개발하여 GY33-6003 매뉴얼에 게시했다. 이 매뉴얼은 Multics(멀틱스) 그룹과 기타 초기 구현자들에 의해 사용되었다.

최초의 컴파일러는 1966년에 출시되었다. PL/I 표준은 1976년에 승인되었다.

1963년 IBM과 그 사용자 단체(SHARE)가 제안하였고, 1965년 IBM이 완성하였으며, 1979년 ISO에서 표준화되었다.

과학 기술 계산용 포트란, 비즈니스 처리용 코볼이라고 불리던 시대에, 알골 수준의 알고리즘 기술 능력도 더하여, 하나의 언어로 모든 요구를 충족시키기 위해 개발된 프로그래밍 언어이다.

언어 사양이 복잡하여 대형 컴퓨터 외에는 그다지 사용되지 않았지만, 디지털 리서치사의 게리 킬달인텔의 i8080을 위해 서브세트 버전의 PL/M[89] 및 일부를 PL/M으로 기술하여 운영 체제 CP/M을 만들었다. 또한, CP/M에서 동작하는 PL/I(PL/I-80)도 작성했다.

유닉스 개발의 계기가 된 Multics(멀틱스)(후에 Multics는 "성공하지 못한 프로젝트"로 간주되게 된다)는 PL/I로 작성되었다. Multics의 실패는 PL/I가 원인이 아니었지만, 기술 언어에서도 간결함을 극대화한 C 언어를 낳은 것은 아이러니하다.

2016년 시점에서도 메인프레임에서 가동되는 은행의 계정계 시스템의 다수는 COBOL 또는 PL/I로 기술되어 있다.[90]

3. 특징

PL/I는 알골 60과 유사한 블록 구조를 가지며, 기본적으로 재귀를 지원한다. 인수는 참조에 의한 호출 방식을 사용하며, 필요에 따라 값에 대해 더미 변수를 사용한다.[13] 광범위한 계산 데이터 유형, 프로그램 제어 데이터 유형 및 데이터 구조 형태를 지원하며,[3] 프로시저 매개변수를 통해 범위가 상속되는 배열 및 문자열의 동적 범위를 지원한다.[3]

PL/I는 표현, 선언 및 문에 대해 간결한 구문을 사용하며, 60개의 글리프 문자 집합에 적합하고 48개로 하위 집합화할 수 있다. 문, 옵션 및 선언에 광범위한 기본값 구조를 제공하여 복잡성을 숨기고 키 입력 수를 최소화한다.[3] 구조적 프로그래밍을 잘 지원하는 강력한 반복 처리를 제공하며,[3] 예약어는 없다(하지만 함수 이름 `DATE` 및 `TIME`은 예외).[14] `IF, THEN, ELSE` 및 `DO`조차 예약되지 않았다.

직교성을 갖추어 각 기능은 다른 기능과 독립적이며 의미가 있는 경우 다른 기능과 자유롭게 결합될 수 있다. 런타임 시 예외 조건을 제어하고 가로챌 수 있는 예외 처리 기능을 제공하며,[3] 개별적으로 컴파일 가능한 섹션으로 분할된 프로그램, 소스 코드의 섹션을 전체 프로그램으로 조정하고 결합하기 위한 광범위한 컴파일 시간 기능(매크로 활용, 표준의 일부는 아님)을 제공한다.[3] 또한 언어에 통합된 디버깅 기능을 제공한다.[3]

PL/I 프로그램은 일련의 프로시저로 구성되며, 각 프로시저는 일련의 문으로 작성된다. `%INCLUDE` 구성은 프로그램 번역 중에 다른 소스의 텍스트를 포함하는 데 사용된다. 모든 문 유형은 다음과 같이 그룹으로 나눌 수 있다.

범주
구조적PROCEDURE (또는 PROC)
ENTRY
BEGIN
DO
END
선언적DECLARE (또는 DCL)
DEFAULT (또는 DFT)
FORMAT
제어 흐름CALL
IF
SELECT
GO TO
RETURN
STOP
Null 문
인터럽트 처리ON
SIGNAL
REVERT
저장소ALLOCATE (또는 ALLOC)
FREE
할당 문
입력/출력OPEN
CLOSE
스트림 입력/출력GET
PUT
레코드 입력/출력READ
WRITE
REWRITE
LOCATE
DELETE



데이터 유형은 단일 값, 배열 형태의 집합체(차원당 하한 및 상한 포함), 구조체(중첩 구조체, 배열 및 스칼라 변수 포함)등이 있으며, 다음 유형의 데이터를 나타내도록 선언할 수 있다.



산술 유형은 다음과 같은 속성으로 구성된다.



식별자 선언은 다음 속성 중 하나 이상을 포함할 수 있다.

데이터 속성입력/출력 속성기타 속성
ALIGNEDDIRECTAUTOMATIC 또는 AUTO
AREA[(area-size)]ENVIRONMENT(options) 또는 ENV...BASED[(reference)]
BINARY [(precision)] 또는 BIN...INPUTBUILTIN
BIT [(maximum-length)]KEYEDCONDITION 또는 COND
CHARACTER[(maximum-length)] 또는 CHAR...OUTPUTCONSTANT
COMPLEX [(precision)] 또는 CPLX...PRINTCONTROLLED 또는 CTL
DECIMAL [(precision)] 또는 DEC...SEQUENTIAL 또는 SEQLDEFINED[(reference)] 또는 DEF...
(dimension-attribute)STREAMEXTERNAL 또는 EXT
ENTRY[(parameter descriptor list]UPDATEGENERIC(criteria list)
FILERECORDINITIAL(value-list) 또는 INIT...
FIXED [(precision)]INTERNAL 또는 INT
FLOAT [(number of digits)]LIKE unsubscripted reference
FORMATLOCAL
LABELOPTIONS(options)
MEMBERPARAMETER 또는 PARM
NONVARYING 또는 NONVARPOSITION [(expression)] 또는 POS...
OFFSET[(reference)]STATIC
PICTURE picture-specification 또는 PIC...VARIABLE
POINTER 또는 PTR
STRUCTURE
UNALIGNED 또는 UNAL
VARYING 또는 VAR


3. 1. 언어적 특징

PL/I는 모든 프로그래머의 요구를 충족할 수 있도록 설계된 언어이다.[97] ANSI PL/I 표준[98] 및 ANSI PL/I General-Purpose Subset 표준[99]에 따르면, PL/I는 다음과 같은 특징을 갖는다.

  • 알골 60(Algol 60)과 유사한 블록 구조를 가지며, 재귀를 포함한다. 인수는 참조에 의한 호출 방식을 사용하며, 필요에 따라 값에 대해 더미 변수를 사용한다(값에 의한 호출).
  • 광범위한 계산 데이터 유형, 프로그램 제어 데이터 유형 및 데이터 구조 형태(강력한 형식 지정)를 지원한다.
  • 프로시저 매개변수를 통해 범위가 상속되는 배열 및 문자열의 동적 범위를 지원한다.
  • 간결한 구문을 사용하며, 60개의 글리프 문자 집합에 적합하고 48개로 하위 집합화할 수 있다.
  • 문, 옵션 및 선언에 광범위한 기본값 구조를 제공하여 복잡성을 숨기고 키 입력 수를 최소화한다.
  • 구조적 프로그래밍을 지원하는 강력한 반복 처리를 제공한다.
  • 예약어가 없다(하지만 함수 이름 `DATE` 및 `TIME`은 예외).[14] `IF, THEN, ELSE` 및 `DO`조차 예약되지 않았다.
  • 직교성: 각 기능은 다른 기능과 독립적이며 의미가 있는 경우 다른 기능과 자유롭게 결합될 수 있다.
  • 런타임 시 예외 조건을 제어하고 가로챌 수 있는 예외 처리 기능을 제공한다.
  • 개별적으로 컴파일 가능한 섹션으로 분할된 프로그램, 소스 코드의 섹션을 전체 프로그램으로 조정하고 결합하기 위한 광범위한 컴파일 시간 기능(매크로)을 제공한다. (단, 표준의 일부는 아니다.)
  • 언어에 통합된 디버깅 기능을 제공한다.
  • FORTRAN의 기술 형식, COBOL의 레코드 구조 및 입출력 기능, ALGOL의 알고리즘 기술 능력을 동시에 가지고 있다.


PL/I 프로그램은 일련의 프로시저로 구성되며, 각 프로시저는 일련의 문으로 작성된다. `%INCLUDE` 구성은 프로그램 번역 중에 다른 소스의 텍스트를 포함하는 데 사용된다. 모든 문 유형은 다음과 같이 그룹으로 나눌 수 있다.

범주
구조적PROCEDURE (또는 PROC)
ENTRY
BEGIN
DO
END
선언적DECLARE (또는 DCL)
DEFAULT (또는 DFT)
FORMAT
제어 흐름CALL
IF
SELECT
GO TO
RETURN
STOP
Null 문
인터럽트 처리ON
SIGNAL
REVERT
저장소ALLOCATE (또는 ALLOC)
FREE
할당 문
입력/출력OPEN
CLOSE
스트림 입력/출력GET
PUT
레코드 입력/출력READ
WRITE
REWRITE
LOCATE
DELETE



이름은 단일 값, 배열 형태의 집합체(차원당 하한 및 상한 포함), 구조체(중첩 구조체, 배열 및 스칼라 변수 포함)로 다음 유형의 데이터를 나타내도록 선언할 수 있다.



산술 유형은 다음과 같은 속성으로 구성된다.



식별자 선언은 다음 속성 중 하나 이상을 포함할 수 있다.

데이터 속성입력/출력 속성기타 속성
ALIGNEDDIRECTAUTOMATIC 또는 AUTO
AREA[(area-size)]ENVIRONMENT(options) 또는 ENV...BASED[(reference)]
BINARY [(precision)] 또는 BIN...INPUTBUILTIN
BIT [(maximum-length)]KEYEDCONDITION 또는 COND
CHARACTER[(maximum-length)] 또는 CHAR...OUTPUTCONSTANT
COMPLEX [(precision)] 또는 CPLX...PRINTCONTROLLED 또는 CTL
DECIMAL [(precision)] 또는 DEC...SEQUENTIAL 또는 SEQLDEFINED[(reference)] 또는 DEF...
(dimension-attribute)STREAMEXTERNAL 또는 EXT
ENTRY[(parameter descriptor list]UPDATEGENERIC(criteria list)
FILERECORDINITIAL(value-list) 또는 INIT...
FIXED [(precision)]INTERNAL 또는 INT
FLOAT [(number of digits)]LIKE unsubscripted reference
FORMATLOCAL
LABELOPTIONS(options)
MEMBERPARAMETER 또는 PARM
NONVARYING 또는 NONVARPOSITION [(expression)] 또는 POS...
OFFSET[(reference)]STATIC
PICTURE picture-specification 또는 PIC...VARIABLE
POINTER 또는 PTR
STRUCTURE
UNALIGNED 또는 UNAL
VARYING 또는 VAR


3. 2. 장점


  • 알골 60과 유사한 블록 구조를 가지며, 기본적으로 재귀를 포함한다. 인수는 참조에 의한 호출 방식을 사용하며, 필요에 따라 값에 대해 더미 변수를 사용한다(값에 의한 호출).[3]
  • 광범위한 계산 데이터 유형, 프로그램 제어 데이터 유형 및 데이터 구조 형태를 지원한다.[3]
  • 프로시저 매개변수를 통해 범위가 상속되는 배열 및 문자열의 동적 범위를 지원한다.[3]
  • 약어 표현, 선언 및 문에 대한 간결한 구문을 허용한다. 60개의 글리프 문자 집합에 적합하며 48개로 하위 집합화할 수 있다.[3]
  • 문, 옵션 및 선언에 광범위한 기본값 구조를 제공하여 일부 복잡성을 숨기고 키 입력 수를 최소화하면서 언어를 확장할 수 있다.[3]
  • 구조적 프로그래밍을 잘 지원하는 강력한 반복 처리를 제공한다.[3]
  • 예약어가 없다. 새로운 속성, 문 및 문 옵션을 기존 프로그램의 유효성을 무효화하지 않고 PL/I에 추가할 수 있었다. `IF, THEN, ELSE` 및 `DO`조차 예약되지 않았다.[14]
  • 직교성: 각 기능은 다른 기능과 독립적이며 의미가 있는 경우 다른 기능과 자유롭게 결합되어야 한다. 각 기능은 의미가 있는 모든 컨텍스트에서 사용 가능하여 최대한 널리 활용하고 "임의의 제한"을 피해야 한다.[3]
  • 런타임 시 예외 조건을 제어하고 가로챌 수 있는 예외 처리 기능을 제공한다.[3]
  • 개별적으로 컴파일 가능한 섹션으로 분할된 프로그램, 소스 코드의 섹션을 전체 프로그램으로 조정하고 결합하기 위한 광범위한 컴파일 시간 기능(매크로 활용, 표준의 일부는 아님)을 제공한다. 별도로 컴파일된 프로시저를 단일 프로그램으로 바인딩하는 외부 이름을 지원한다.[3]
  • 언어에 통합된 디버깅 기능을 제공한다.[3]
  • 상업 계산과 과학 기술 계산을 하나의 언어로 기술할 수 있다.[3]
  • 처음부터 구조화되어 있다.[3]
  • 블록 쌓기 구조를 통해 초보적인 기능부터 시작하여 점차 고도화된 기능을 학습할 수 있다.[3]
  • IBM 메인프레임 (OS/390, z/OS, IMS, CICS 등)에서 널리 사용되고 있다.[3]

3. 3. 단점

PL/I는 언어 사양이 복잡하고 규모가 커서 당시의 소형 기기에서는 성능상의 어려움이 있었고, 대형 기기 외에는 널리 퍼지지 않았다.[13] 또한, 포트란(Fortran)에 필적하는 컴파일된 코드 성능을 목표로 하였으나, 이는 달성되지 못했다.[3]

4. 구현체

PL/I는 IBM System/360(IBM 시스템/360) 개발의 일환으로 IBM에서 구현되었다. 최초의 상용 PL/I 컴파일러는 영국 헐슬리의 존 내쉬(John Nash) 팀이 개발한 OS/360 운영 체제용 PL/I F 컴파일러였다.

1960년대 후반과 1970년대 초, 많은 미국과 캐나다 대학교들은 PL/I가 간결하고 가르치기 쉽다는 이유로 자체 PL/I 서브셋과 대화형 지원 시스템을 구축했다. 당시 IBM 제품은 이러한 목적에 적합하지 않았기 때문이다.[39]

디지털 이큅먼트 코퍼레이션(Digital Equipment Corporation)의 VAX-11 PL/I는 상업적으로 성공한 구현 중 하나로, 이후 VAX PL/I, DEC PL/I로 알려졌다. 1980년에 처음 출시되었으며,[33][34] VAX, 알파에서 VMS, 그리고 Tru64에서 실행되었다.

1992년, 캘리포니아의 IBM 산타 테레사는 완전히 새로운 컴파일러를 출시했다. 최초 출시는 OS/2용이었으며, 이후 추가 플랫폼을 지원했지만, 2021년 현재 지원되는 유일한 플랫폼은 z/OS와 AIX이다.[47]

4. 1. IBM PL/I F 및 D 컴파일러

PL/I F 컴파일러는 OS/360 운영 체제용으로 개발되었으며, 영국 헐슬리의 존 내쉬(John Nash) 팀이 개발하고 런타임 라이브러리 팀은 I.M. (노비) 클라크(I.M. (Nobby) Clarke)가 관리했다.[22] 이 컴파일러는 System/360 어셈블리 언어로 완전히 작성되었다.[22] 1966년에 출시된 릴리스 1은 64킬로바이트의 실제 저장 공간을 가진 시스템을 위해 설계되었으며, F는 S/360 용어로 64kB를 의미한다. 64킬로바이트 머신에서 사용 가능한 44킬로바이트의 메모리에 맞추기 위해 컴파일러는 제어 단계와 약 100개의 컴파일러 단계로 구성되었다. 각 단계는 디스크에서 메모리로 한 번에 하나씩 가져와 특정 언어 기능 및 컴파일 측면을 처리하며, 일반적으로 메모리에 저장된 부분적으로 컴파일된 프로그램을 한 번만 통과한다.[23]

PL/I F 구현 당시 언어의 일부 측면은 아직 설계 중이었기 때문에 일부는 이후 릴리스까지 생략되었다. PL/I RECORD I/O는 PL/I F 릴리스 2와 함께 제공되었다. 리스트 처리 기능,[24] 기반 변수, 포인터, 영역 및 오프셋, 그리고 LOCATE 모드 I/O는 릴리스 4에서 처음 제공되었다. PL/I F 릴리스 5는 프로시저의 REORDER 옵션을 통해 DO-루프를 프로그램 최적화하여 Fortran 오브젝트 코드와 경쟁할 수 있도록 PL/I 코드 속도를 높였다.

System/360 Model 67용 TSS/360 시분할 운영 체제에서는 IBM 모핸식 연구소(Mohansic Lab)에서 PL/I F 버전을 개발했다. 프랑스 IBM 라 고드 연구소(La Gaude Lab)는 Fortran, Cobol 및 Algol 프로그램을 PL/I F 수준의 PL/I로 변환하는 "언어 변환 프로그램"을 개발했다.[25]

IBM 독일에서는 16킬로바이트의 메모리를 사용하는 PL/I D 컴파일러를 DOS/360 로우 엔드 운영 체제용으로 개발했다. 이 컴파일러는 모든 문자열과 배열이 고정 범위를 가져야 하는 PL/I 언어의 하위 집합을 구현하여 런타임 환경을 단순화했다. 기본 운영 체제를 반영하여 동적 저장 공간 할당 및 ''controlled'' 저장 클래스는 없다.[26] PL/I D 컴파일러는 PL/I F 출시 1년 이내에 제공되었다.

4. 2. Multics PL/I 및 파생 컴파일러

IBM이 Multics 프로젝트에 참여하면서, 1964년에 PL/I의 초기 방언인 EPL(Early PL/I)을 구현 언어로 사용했다. EPL은 벨 연구소와 MIT에서 더글러스 맥길로이, 로버트 모리스 등에 의해 개발되었다.[28] 초기에는 TMG 컴파일러 컴파일러를 사용하여 개발되었다.[27] Multics PL/I 컴파일러는[28] 여러 제조업체와 소프트웨어 그룹에서 사용한 컴파일러 기술의 원천이 될 정도로 영향력이 컸다. EPL은 시스템 프로그래밍 언어였으며, 원래 PL/I에는 없던 몇 가지 기능을 가진 PL/I의 방언이었다.

4. 3. IBM PL/I 최적화 및 검사 컴파일러

IBM은 1976년에 PL/I 표준을 승인했다.

4. 4. 기타 메인프레임 및 미니컴퓨터 컴파일러

IBM은 IBM System/360(IBM 시스템/360) 발표와 함께 모든 사용자를 위한 단일 프로그래밍 언어를 원했고, PL/I 설계를 완료하여 첫 번째 컴파일러를 작성할 수 있게 하였다.[9] PL/I 언어의 제어는[10] 처음에는 뉴욕 프로그래밍 센터에, 나중에는 Hursley(허슬리)의 IBM 영국 연구소에 귀속되었다. GUIDE(가이드) 사용자 그룹은 언어 확장에 참여했다.[11]

MIT의 Multics 프로젝트는 1964년에 PL/I의 서브셋 방언인 초기 PL/I(EPL)를 구현 언어로 사용했다. EPL은 벨 연구소와 MIT에서 더글러스 맥길로이, 로버트 모리스 등에 의해 개발되었다.[28] 초기에 이는 TMG 컴파일러 컴파일러를 사용하여 개발되었다.[27]

Honeywell PL/I 컴파일러(Series 60용)는 전체 ANSI X3J1 표준을 구현했다.[29]

캘리포니아의 IBM 산타 테레사는 1992년에 완전히 새로운 컴파일러를 출시했다. 최초 출시는 OS/2용이었으며 대부분의 ANSI-G 기능과 많은 새로운 PL/I 기능을 포함했다.[46] 후속 릴리스는 추가 플랫폼(MVS, VM, OS/390, AIX, Windows)을 제공했지만, 2021년 현재 지원되는 유일한 플랫폼은 z/OS와 AIX이다.[47] IBM은 PL/I가 다른 언어(특히 C와 C++)에 비해 뒤쳐진 부분에서 경쟁력을 갖추도록 기능을 계속 추가했다. 해당 "IBM Language Environment"는 PL/I 프로그램과 데이터베이스 및 트랜잭션 시스템, 그리고 C, C++, COBOL로 작성된 프로그램 간의 상호 운용을 지원하며, 컴파일러는 이러한 언어와의 상호 통신에 필요한 모든 데이터 유형을 지원한다.

PL/I 설계 원칙은 유지되었으며, 여러 새로운 데이터 유형, 새로운 문 및 문 옵션, 새로운 예외 조건, 프로그램 소스의 새로운 구성을 포함하는 이 주요 확장에 견뎌냈다. 결과적으로 만들어진 언어는 PL/I 표준과 이전 IBM 컴파일러의 호환 가능한 슈퍼셋이다. PL/I에 추가된 주요 항목은 다음과 같다.

  • 사용자 정의 데이터 유형을 더 잘 지원하기 위한 새로운 속성 - 사용자 정의 유형을 도입하는 `DEFINE ALIAS`, `ORDINAL` 및 `DEFINE STRUCTURE` 문, `HANDLE` 로케이터 데이터 유형, `TYPE` 데이터 유형 자체, `UNION` 데이터 유형, 그리고 새로운 유형을 조작하기 위한 내장 함수.
  • 일반적인 PC 데이터 유형에 해당하는 추가 데이터 유형 및 속성 (예: `UNSIGNED`, `VARYINGZ`).
  • 프로그램 가독성 향상 – 종종 암시적 사용법을 명시적으로 렌더링 (예: 매개변수의 `BYVALUE` 속성)
  • 추가 구조적 프로그래밍 구성.
  • 인터럽트 처리 추가.
  • 컴파일 시간 전처리기는 거의 모든 PL/I 문자열 처리 기능을 제공하고 응용 프로그램 개발 환경과 인터페이스하도록 확장되었다.


z/OS용 최신 PL/I 컴파일러 시리즈인 Enterprise PL/I for z/OS는 컴파일 중에 전달되는 ARCHLVL parm 제어를 사용하여 최신 z/Architecture 프로세서(z14, z13, zEC12, zBC12, z196, z114)에 대한 코드 생성을 활용했으며, z/OS Language Environment에서 이를 지원하는 두 번째 고급 언어였다(XL C/C++가 처음이고 Enterprise COBOL v5가 마지막).

4. 5. 개인용 컴퓨터 및 Unix용 PL/I 컴파일러

MIT의 Multics 프로젝트는 1964년에 PL/I의 서브셋 방언인 초기 PL/I(EPL)를 구현 언어로 사용했다. EPL은 벨 연구소와 MIT에서 더글러스 맥길로이, 로버트 모리스 등에 의해 개발되었다.[28]

1960년대 후반과 1970년대 초, 많은 미국과 캐나다 대학교들은 PL/I를 간결하고 가르치기 쉬운 언어로 여겨 자체 PL/I의 서브셋과 자체 대화형 지원을 구축했다. IBM 제품이 적합하지 않았기 때문이다.[39]

  • '''PL/C''': 코넬 대학교에서 개발한 교육용 방언으로, 광범위한 자동 구문 오류 수정과 남아 있는 구문 오류를 출력 문으로 변환하여 어떤 프로그램도 컴파일하는 데 실패하지 않는다는 독특한 기능을 가지고 있었다. PL/C는 매우 빠른 컴파일러였다.[40]
  • '''SL/1''' (Student Language/1, Student Language/One 또는 Subset Language/1):[41][42] IBM 1130에서 해석적으로 실행되었으며, 교육적 사용이 강점이었다.
  • '''PLAGO''': 브루클린 공과대학에서 만든 PL/I 언어의 단순화된 서브셋으로,[43] 우수한 진단 오류 메시지와 빠른 컴파일 시간을 중시했다.
  • '''SP/k''': 토론토 대학교의 컴퓨터 시스템 연구 그룹은 프로그래밍 교육을 위해 SP/1, SP/2, SP/3, ..., SP/8이라고 하는 일련의 PL/I 서브셋을 지원하는 컴파일러를 제작했다. SP/k 컴파일러에서 오류 없이 실행되는 프로그램은 다른 동시대 PL/I 컴파일러에서도 동일한 결과를 생성했다.[44]
  • 기타: 뉴사우스웨일스 대학교의 P. Grouse가 만든 '''PL0''', 마빈 빅터 젤코위츠가 메릴랜드 대학교에서 만든 '''PLUM''', 그리고 토론토 대학교의 '''PLUTO'''

4. 6. PL/I 컴파일러 for Microsoft .NET

1960년대 초기에 여러 그룹에서 컴파일러를 구현했다. MIT의 Multics 프로젝트는 고급 프로그래밍 언어로 운영 체제를 개발한 최초의 프로젝트 중 하나로, 1964년에 PL/I의 서브셋 방언인 초기 PL/I(EPL)를 구현 언어로 사용했다. EPL은 벨 연구소와 MIT에서 더글러스 맥길로이, 로버트 모리스 등에 의해 개발되었다.[28] 초기에 이는 TMG 컴파일러 컴파일러를 사용하여 개발되었다.[27] 영향력 있는 Multics PL/I 컴파일러[28]는 여러 제조업체와 소프트웨어 그룹에서 사용한 컴파일러 기술의 원천이었다. EPL은 시스템 프로그래밍 언어였으며, 원래 PL/I에는 없던 몇 가지 기능을 가진 PL/I의 방언이었다.

Honeywell PL/I 컴파일러(Series 60용)는 전체 ANSI X3J1 표준의 구현이다.[29]

5. 방언


  • PL/S는 PL/I의 방언으로, 1960년대 후반에 개발되었으며 처음에는 BSL이라고 불렸다. IBM 메인프레임의 시스템 프로그래밍 언어가 되었으며, 1970년대와 1980년대의 거의 모든 IBM 메인프레임 시스템 소프트웨어는 PL/S로 작성되었다. PL/S는 PL/I와는 다르게 데이터 유형 변환이 없고, 런타임 환경이 없으며, 구조가 다르게 매핑되고, 할당이 바이트 단위 복사라는 점이 다르다. PL/S는 PL/AS, 그리고 현재 운영 체제인 OS/390 및 현재 z/OS에서 내부 작업을 위해 사용되는 언어인 PL/X로 대체되었다. 또한 일부 z/VSE 및 z/VM 구성 요소에도 사용된다. IBM Db2 for z/OS 또한 PL/X로 작성되었다.
  • PL/C는 1970년대 코넬 대학교에서 개발된 PL/I 프로그래밍 언어의 교육용 방언이다.
  • PL/MP(Machine Product)와 PL/MI(Machine Interface)라는 두 가지 PL/I 방언은 System/38 및 AS/400 플랫폼의 시스템 소프트웨어에서 IBM에서 사용했다.[61][62][63] PL/MP는 이들 플랫폼의 수직 마이크로코드를 구현하는 데 사용되었으며 IMPI 명령어 집합을 대상으로 했다. PL/MI는 해당 플랫폼의 머신 인터페이스를 대상으로 하며 System/38 Control Program Facility 및 OS/400의 XPF 계층에서 사용된다.[64] PL/MP 코드는 OS/400이 IBM RS64 프로세서 제품군으로 이식될 때 대부분 C++로 대체되었지만, 일부는 유지되어 PowerPC/Power ISA 아키텍처용으로 재구성되었다.[65] PL/MI 코드는 대체되지 않았으며 IBM i에서 계속 사용되고 있다.[66]
  • PL.8은 PL/I의 약 80%를 차지한다고 해서 붙여진 이름이며,[67] 원래 1970년대 IBM 연구소에서 IBM 801 아키텍처용으로 개발되었다.[68] 이후 Motorola 68000 및 System/370 아키텍처에 대한 지원이 추가되었다.[69] 이는 여러 IBM 내부 시스템 개발 작업(예: 밀리코드 및 z/Architecture 시스템용 펌웨어)에 계속 사용되고 있으며, 64비트 gcc 기반 백엔드를 사용하도록 재설계되었다.[68][70]
  • Honeywell, Inc.는 CP-6 운영 체제를 만드는 데 사용할 PL-6를 개발했다.
  • Prime Computer는 PRIMOS 운영 체제의 시스템 프로그래밍 언어로 두 가지 다른 PL/I 방언을 사용했다. 즉, 버전 18부터 PL/P를 사용하고 버전 19부터 SPL을 사용했다.
  • XPL은 XPL 컴파일러 기술을 사용하여 다른 컴파일러를 작성하는 데 사용되는 PL/I 방언이다. XPL은 PL/I의 작은 하위 집합에 힙 문자열 데이터 유형을 추가했다.
  • HAL/S는 우주 왕복선 프로그램에서 사용된 것으로 가장 잘 알려진 실시간 항공 우주 프로그래밍 언어이다. 이는 1970년대 NASA를 위해 Intermetrics에서 설계했다. HAL/S는 XPL로 구현되었다.
  • IBM과 다양한 하청업체는 1970년대 초에 해군을 위한 신호 처리를 지원하기 위해 SPL/I라는 또 다른 PL/I 변종을 개발하기도 했다.
  • SabreTalk는 Sabre 항공 예약 시스템을 프로그래밍하는 데 사용된 실시간 PL/I 방언이다.
  • Apple은 General Motors Research Laboratories에서 Control Data Corporation STAR-100 슈퍼컴퓨터를 위해 개발한 PL/I 방언으로, 그래픽 디자인에 광범위하게 사용되었다.

6. 표준화

PL/I의 표준화는 1966년 4월 ECMA TC10에서 시작되었다.[17] 1969년 ANSI는 "Kludge"라는 별칭을 가진 "복합 언어 개발 위원회"를 설립했으며, 나중에 X3J1 PL/I로 이름을 변경했다.[17] ECMA TC/10과 ANSI X3J1은 공동으로 표준화를 진행했다. IBM은 GY33-6003[18] 문서의 하위 집합을 제공했고, 이는 표준화의 기본 문서가 되었다. 멀티태스킹과 프로그램 최적화 속성(예: `NORMAL` 및 `ABNORMAL`)은 기본 문서에서 제외되었다.

기본 문서 변경 제안은 양 위원회에서 투표로 결정되었다. 의견 불일치가 발생하면 GM의 마이클 마코티와 ICL을 대표하는 C.A.R. 호어 의장이 해결했다. IBM 외에도 허니웰, CDC, 데이터 제너럴, DEC, 프라임 컴퓨터, 버로스, RCA, 유니백이 X3J1에 참여했다. 주요 사용자로는 이스트만 코닥, MITRE, 유니언 카바이드, 벨 연구소와 다양한 정부 및 대학교 대표들이 있었다. 표준 기구에서 언어 개발이 진행되면서 구조적 프로그래밍과 내부 일관성이 개선되었고, 모호하거나 논쟁의 여지가 있는 기능은 생략되었다.

언어 개발이 거의 완료될 무렵, X3J1/TC10은 영어 텍스트로 작성된 문서에 많은 문제가 있음을 인지했다. 단일 항목에 대한 논의가 여러 곳에 나타나 일치하지 않거나 누락된 부분이 있을 수 있었다. 이에 데이비드 비치(IBM), 로버트 프라이부르그하우스(허니웰), 밀턴 바버(CDC), M. 도널드 맥라렌(아르곤 국립 연구소), 크레이그 프랭클린(데이터 제너럴), 로이스 프램턴(DEC), 편집자 D.J. 앤드류스(IBM)가 전체 문서를 다시 작성하여 각자 하나 이상의 완전한 장을 만들었다. 표준은 의미를 지정하기 위해 "PL/I 머신"[19]을 사용하는 형식적 정의[16]로 표현되었다. 이는 반 형식적 정의로 작성된 최초의 프로그래밍 언어 표준이었다.

"PL/I 범용 하위 집합"("Subset-G") 표준은 1981년 ANSI에서 발행되었고[20] 1987년에 개정되었다.[21] 범용 하위 집합은 PL/I 구현의 핵심으로 널리 채택되었다.

7. 언어 요약

PL/I는 모든 프로그래머의 요구를 충족시키도록 설계된 프로그래밍 언어이다.[97] 이 요약은 ANSI PL/I 표준[98] 및 ANSI PL/I General-Purpose Subset 표준[99]에서 가져온 것이다.

PL/I는 FORTRAN의 기술 형식, COBOL의 레코드 구조 및 입출력 기능, ALGOL의 알고리즘 기술 능력을 모두 갖추고 있다. 또한, 상업 계산과 과학 기술 계산을 하나의 언어로 기술할 수 있으며, 처음부터 구조화되어 있고, 블록 쌓기 구조를 통해 초보적인 기능부터 고도화된 기능까지 점진적으로 학습할 수 있도록 설계되었다. PL/I는 예약어가 없다는 특징이 있다.

PL/I의 목표는 언어 초창기 개발 과정에서 진화했다. COBOL의 레코드 처리 및 보고서 작성과의 경쟁력이 요구되었으며, 언어의 유용성은 시스템 프로그래밍과 이벤트 기반 프로그래밍을 포함하도록 확장되었다.[13] PL/I의 추가 목표는 다음과 같았다:[3]


  • 포트란(Fortran)에 필적하는 컴파일된 코드의 성능 (하지만 이는 달성되지 못했다)
  • 새로운 하드웨어 및 새로운 응용 분야에 대한 확장성
  • 프로그래머의 노력을 컴파일러로 이전하여 프로그래밍 프로세스의 생산성 향상
  • 주 컴퓨터 하드웨어 및 운영 체제에서 효과적으로 작동하는 기기 독립성


이러한 목표를 달성하기 위해 PL/I는 당시의 언어들로부터 아이디어를 차용하면서 상당한 새로운 기능을 추가했고, 독특하고 간결하며 가독성이 좋은 구문을 사용하여 표현했다. 많은 원칙과 기능이 결합되어 언어의 특징을 부여했으며, 언어의 목표를 달성하는 데 중요했다.

  • 블록 구조알골 60(Algol 60)과 유사한 기본 의미(재귀 포함)를 가진다. 인수는 필요에 따라 값에 대해 더미 변수를 사용하여 참조에 의한 호출 방식을 사용한다(값에 의한 호출).
  • 광범위한 계산 데이터 유형, 프로그램 제어 데이터 유형 및 데이터 구조 형태(강력한 형식 지정)를 가진다.
  • 프로시저 매개변수를 통해 범위가 상속되는 배열 및 문자열의 동적 범위를 가진다.
  • 허용된 약어로 표현, 선언 및 문에 대한 간결한 구문을 가진다. 60개의 글리프 문자 집합에 적합하며 48개로 하위 집합화할 수 있다.
  • 일부 복잡성을 숨기고 키 입력 수를 최소화하면서 언어를 확장할 수 있도록 문, 옵션 및 선언에 광범위한 기본값 구조를 가진다.
  • 구조적 프로그래밍을 잘 지원하는 강력한 반복 처리를 지원한다.
  • 예약어는 없어야 했다(하지만 함수 이름 `DATE` 및 `TIME`은 이 목표를 달성하는 것이 처음에는 불가능한 것으로 입증되었다). 새로운 속성, 문 및 문 옵션을 기존 프로그램의 유효성을 무효화하지 않고 PL/I에 추가할 수 있었다. `IF`, `THEN`, `ELSE` 및 `DO`조차 예약되지 않았다.[14]
  • 직교성: 각 기능은 다른 기능과 독립적이며 의미가 있는 경우 다른 기능과 자유롭게 결합되어야 한다. 각 기능은 의미가 있는 모든 컨텍스트에서 사용 가능하여 최대한 널리 활용하고 "임의의 제한"을 피해야 한다. 직교성은 언어를 "대형"으로 만드는 데 도움이 된다.
  • 런타임 시 예외 조건을 제어하고 가로챌 수 있는 예외 처리 기능을 제공한다.
  • 개별적으로 컴파일 가능한 섹션으로 분할된 프로그램, 소스 코드의 섹션을 전체 프로그램으로 조정하고 결합하기 위한 광범위한 컴파일 시간 기능(일명 매크로)을 제공한다. 단, 표준의 일부는 아니다. 별도로 컴파일된 프로시저를 단일 프로그램으로 바인딩하는 외부 이름을 제공한다.
  • 언어에 통합된 디버깅 기능을 제공한다.

7. 1. 문(Statement)

`ENTRY`
`BEGIN`
`DO`
`END`선언적`DECLARE` (또는 `DCL`)
`DEFAULT` (또는 `DFT`)
`FORMAT`제어 흐름`CALL`
`IF`
`SELECT`
`GO TO`
`RETURN`
`STOP`
Null 문인터럽트 처리`ON`
`SIGNAL`
`REVERT`저장소`ALLOCATE` (또는 `ALLOC`)
`FREE`
할당 문입/출력`OPEN`
`CLOSE`스트림 입/출력`GET`
`PUT`레코드 입/출력`READ`
`WRITE`
`REWRITE`
`LOCATE`
`DELETE`



(멀티태스킹 및 PL/I 전처리기와 같은 기능은 표준에 없지만 PL/I F 컴파일러 및 일부 다른 구현에서 지원되며 언어 진화 섹션에서 설명한다.)

이름은 단일 값 또는 배열 형태의 집합체(차원당 하한 및 상한 포함) 또는 구조체(중첩 구조체, 배열 및 스칼라 변수 포함)로 다음 유형의 데이터를 나타내도록 선언할 수 있다.



`산술` 유형은 다음과 같은 속성으로 구성된다.



`Picture-for-arithmetic` 유형의 기본, 스케일, 정밀도 및 스케일 팩터는 `picture-specification` 내에 인코딩된다. 모드는 실수부와 허수부에 모두 적용되는 `picture specification`으로 별도로 지정된다.

값은 특정 연산자 및 내장 함수 집합을 사용하여 계산되며, 대부분은 단일 값뿐만 아니라 집합체에도 적용될 수 있으며, 마찬가지로 집합체와 단일 값에 대해 작동하고 반환할 수 있는 사용자 정의 프로시저와 함께 사용된다. 할당 문은 하나 이상의 변수에 값을 할당한다.

PL/I에는 예약어가 없다. 문은 세미콜론으로 종료된다. 문의 최대 길이는 구현에 따라 정의된다. 주석은 공백이 허용되는 프로그램의 어느 곳에서나 나타날 수 있으며, 문자 슬래시, 별표가 앞에 오고 문자 별표, 슬래시로 종료된다. 문에는 항목 이름(`ENTRY` 및 `PROCEDURE` 문) 또는 레이블 이름을 도입하는 레이블 접두사, 그리고 계산 조건을 활성화 또는 비활성화하는 조건 접두사(예: `(NOSIZE)`)가 있을 수 있다. 항목 및 레이블 이름은 단일 식별자이거나 상수의 첨자 목록이 뒤따르는 식별자일 수 있다(예: `L(12,2):A=0;`).

일련의 문은 `DO` 문으로 시작하고 `END` 문으로 끝날 때 ''그룹''이 된다. 그룹은 중첩 그룹과 시작 블록을 포함할 수 있다. `IF` 문은 `THEN` 부분과 `ELSE` 부분으로 그룹 또는 단일 문을 지정한다(샘플 프로그램 참조). 그룹은 반복 단위이다. 시작 ''블록''(`BEGIN; stmt-list END;`)은 블록에 로컬인 이름 및 내부 프로시저에 대한 선언을 포함할 수 있다. ''프로시저''는 `PROCEDURE` 문으로 시작하여 구문적으로 `END` 문으로 종료된다. 프로시저 본문은 블록, 그룹 및 문의 시퀀스이며, 프로시저 또는 프로시저의 `EXTERNAL`에 로컬인 이름 및 프로시저에 대한 선언을 포함한다.

''ON-unit''은 다음 ''조건'' 중 하나 이상이 발생할 때 실행되도록 작성된 단일 문 또는 문 블록이다.

''계산 조건'',



또는 ''입력/출력'' 조건,



또는 다음 조건 중 하나:



식별자의 선언은 다음 속성 중 하나 이상을 포함할 수 있다(그러나 상호 일관성이 있어야 함).

데이터 속성입력/출력 속성기타 속성
`ALIGNED``DIRECT``AUTOMATIC 또는 AUTO`
`AREA[(area-size)]``ENVIRONMENT(options) 또는 ENV...``BASED[(reference)]`
`BINARY [(precision)] 또는 BIN...``INPUT``BUILTIN`
`BIT [(maximum-length)]``KEYED``CONDITION 또는 COND`
`CHARACTER[(maximum-length)] 또는 CHAR...``OUTPUT``CONSTANT`
`COMPLEX [(precision)] 또는 CPLX...``PRINT``CONTROLLED 또는 CTL`
`DECIMAL [(precision)] 또는 DEC...``SEQUENTIAL 또는 SEQL``DEFINED[(reference)] 또는 DEF...`
`(dimension-attribute)``STREAM``EXTERNAL 또는 EXT`
`ENTRY[(parameter descriptor list]``UPDATE``GENERIC(criteria list)`
`FILE``RECORD``INITIAL(value-list) 또는 INIT...`
`FIXED [(precision)]``INTERNAL 또는 INT`
`FLOAT [(number of digits)]``LIKE unsubscripted reference`
`FORMAT``LOCAL`
`LABEL``OPTIONS(options)`
`MEMBER``PARAMETER 또는 PARM`
`NONVARYING 또는 NONVAR``POSITION [(expression)] 또는 POS...`
`OFFSET[(reference)]``STATIC`
`PICTURE picture-specification 또는 PIC...``VARIABLE`
`POINTER 또는 PTR`
`STRUCTURE`
`UNALIGNED 또는 UNAL`
`VARYING 또는 VAR`


7. 2. 데이터 타입

PL/I는 모든 프로그래머의 요구를 충족할 수 있도록 설계된 언어로, 다양한 데이터 타입을 지원한다.[15] ANSI PL/I 표준[16] 및 ANSI PL/I 범용 서브셋 표준[20]에 따르면, 식별자 선언에는 다음 표와 같은 데이터 속성들을 포함할 수 있다.

데이터 속성설명
`ALIGNED`데이터 정렬 방식 지정
`AREA[(area-size)]`영역 크기를 지정
`BINARY [(precision)]` 또는 `BIN...`이진수 데이터 타입 (정밀도 지정 가능)
`BIT [(maximum-length)]`비트 문자열 데이터 타입 (최대 길이 지정 가능)
`CHARACTER[(maximum-length)]` 또는 `CHAR...`문자열 데이터 타입 (최대 길이 지정 가능)
`COMPLEX [(precision)]` 또는 `CPLX...`복소수 데이터 타입 (정밀도 지정 가능)
`DECIMAL [(precision)]` 또는 `DEC...`십진수 데이터 타입 (정밀도 지정 가능)
`(dimension-attribute)`배열의 차원을 지정
`ENTRY[(parameter descriptor list]`프로시저 입구(entry)를 나타냄 (매개변수 설명자 목록 지정 가능)
`FILE`파일 변수를 나타냄
`FIXED [(precision)]`고정 소수점 데이터 타입 (정밀도 지정 가능)
`FLOAT [(number of digits)]`부동 소수점 데이터 타입 (자릿수 지정 가능)
`FORMAT`형식 지정자를 나타냄
`LABEL`레이블 변수를 나타냄
`MEMBER`구조체의 멤버임을 나타냄
`NONVARYING` 또는 `NONVAR`변경 불가능한 문자열을 나타냄
`OFFSET[(reference)]`오프셋 변수를 나타냄 (참조 지정 가능)
`PICTURE picture-specification` 또는 `PIC...`픽처(picture) 데이터 타입 (픽처 지정자 사용)
`POINTER` 또는 `PTR`포인터 변수를 나타냄
`STRUCTURE`구조체임을 나타냄
`UNALIGNED` 또는 `UNAL`데이터가 정렬되지 않음을 나타냄
`VARYING` 또는 `VAR`가변 길이 문자열을 나타냄



PL/I에서 이름을 선언할 때는 단일 값, 배열, 구조체 등 다양한 형태의 데이터를 나타낼 수 있다. 다음은 주요 데이터 유형들이다.

데이터 유형설명
`Arithmetic`산술 연산을 위한 데이터 타입. 기본( `BINARY` 또는 `DECIMAL` ), 스케일( `FIXED` 또는 `FLOAT` ), 모드( `REAL` 또는 `COMPLEX` ), `PRECISION` (자릿수, 고정 소수점의 경우 스케일 팩터) 속성으로 구성됨.
`CHARACTER`문자열 데이터 타입
`PICTURE` (산술 데이터용)산술 데이터를 위한 픽처 타입
`PICTURE` (문자 데이터용)문자 데이터를 위한 픽처 타입
`AREA`메모리 영역을 나타내는 타입
`BIT`비트 문자열 타입
`ENTRY`프로시저 입구를 나타내는 타입
`FILE`파일 변수를 나타내는 타입
`FORMAT`형식 지정자를 나타내는 타입
`LABEL`레이블 변수를 나타내는 타입
`OFFSET`오프셋 변수를 나타내는 타입
`POINTER`포인터 변수를 나타내는 타입



`산술` 유형은 다음과 같은 속성들로 구성된다.



`Picture-for-arithmetic` 유형의 경우, 기본, 스케일, 정밀도 및 스케일 팩터는 `picture-specification` 내에 인코딩되며, 모드는 실수부와 허수부에 모두 적용되는 `picture specification`으로 별도로 지정된다.

Micro Focus 컴파일러나 IBM 컴파일러는 표준화된 버전보다 확장된 기능을 제공한다. 예를 들어, `ORDINAL`은 파스칼과 유사한 기능을 제공하며, `DEFINE` 문을 통해 PL/I 내장 속성으로 구성된 추가 `TYPE`을 선언할 수 있다. 또한, `HANDLE` 데이터 타입은 특정 데이터 구조에 바인딩되는 강력한 타입의 포인터 역할을 한다.

PL/I는 FORTRAN의 기술 형식, COBOL의 레코드 구조 및 입출력 기능, ALGOL의 알고리즘 기술 능력을 동시에 가지고 있으며, 예약어가 없는 것이 특징이다.

8. 비판

PL/I는 Fortran과 COBOL을 대체하여 메인프레임의 주요 언어가 되리라는 기대를 받았지만, 여러 요인으로 인해 그 목표를 달성하지 못했다. 1970년대와 1980년대의 몇 가지 추세는 PL/I의 경쟁 우위를 약화시켰다.

첫째, 메인프레임 소프트웨어 환경 변화로 데이터베이스트랜잭션 처리용 애플리케이션 서브시스템(CICS, IMS, Oracle)과 애플리케이션 생성기가 중요해졌다. 이로 인해 PL/I의 많은 부분이 불필요해졌고, Fortran은 이러한 영역에서 사용되지 않아 PL/I는 COBOL과 경쟁해야 했다. 대부분의 사용자는 COBOL을 고수했고, PC 환경의 발전으로 PL/I는 C++, Java 등에 밀려났다.

둘째, 시스템 프로그래밍 분야에서 IBM은 PL/I 대신 자체적인 PL/S를 개발하여 채택했고,[74] 외부에서는 C가 성공하면서 PL/I의 강점이 약화되었다.

셋째, 개발 환경의 발전으로 대화형 소프트웨어 개발 기능이 강화되면서 PL/I의 대화형 및 디버깅 강점은 의미를 잃었다.

넷째, COBOL과 Fortran에 구조적 프로그래밍, 문자열 연산, 객체 지향 기능이 추가되면서 PL/I의 상대적 이점은 더욱 감소했다.

메인프레임 비즈니스 측면에서도 IBM 하드웨어 경쟁업체는 PL/I의 성공에서 얻을 것이 적었고, 컴파일러 개발 비용이 높았으며, IBM은 컴파일러 경쟁 우위를 가졌다. 많은 IBM 사용자는 독점 솔루션을 피하고자 했고, 타사 PL/I 지원 부족으로 PL/I를 사용하지 않는 것이 유리했다.

8. 1. 구현 문제

MIT의 Multics 프로젝트는 고급 프로그래밍 언어로 운영 체제를 개발한 최초의 프로젝트 중 하나로, 1964년에 PL/I의 서브셋 방언인 초기 PL/I(EPL)를 구현 언어로 사용했다. EPL은 벨 연구소와 MIT에서 더글러스 맥길로이, 로버트 모리스 등에 의해 개발되었다.[28] 초기에 이는 TMG 컴파일러 컴파일러를 사용하여 개발되었다.[27] 영향력 있는 Multics PL/I 컴파일러[28]는 여러 제조업체와 소프트웨어 그룹에서 사용한 컴파일러 기술의 원천이었다. EPL은 시스템 프로그래밍 언어였으며, 원래 PL/I에는 없던 몇 가지 기능을 가진 PL/I의 방언이었다.

Honeywell PL/I 컴파일러(Series 60용)는 전체 ANSI X3J1 표준을 구현한 것이다.[29] 1970년대와 1980년대에 디지털 리서치CP/M용 PL/I 컴파일러(PL/I-80), CP/M-86용 PL/I 컴파일러(PL/I-86), 그리고 DOS를 사용하는 개인용 컴퓨터용 PL/I 컴파일러를 판매했다.[56] 이 컴파일러는 PL/I의 서브셋 G를 기반으로 하며[56], PL/M으로 작성되었다. 마이크로 포커스는 윈도우[57] 및 UNIX/리눅스 시스템용 Open PL/I를 구현했는데,[58] 이는 Liant로부터 인수한 것이다. IBM은 1994년에 OS/2용 PL/I[46]를, 1995년에 AIX용 PL/I를 출시했다.[59] 2007년에는 OS/2용 Iron Spring PL/I가 출시되었고, 이후에는 리눅스용으로도 출시되었다.[60] 언어 사양이 복잡하고 규모가 커서 당시의 소형 기기에서는 성능상 어려움이 있었고, 대형 기기 외에는 널리 퍼지지 않았다.

8. 2. 프로그래머 문제

PL/I는 프로그래머의 노력을 컴파일러로 이전하여 프로그래밍 생산성을 높이는 것을 목표로 했다. 이를 위해 당시의 다른 언어들로부터 아이디어를 차용하면서, 새롭고 독특하며 간결하고 가독성이 좋은 구문을 사용했다. PL/I에 적용된 여러 원칙과 기능들은 다음과 같다:

1960년대 초, 여러 그룹에서 컴파일러를 구현했다. MIT의 Multics 프로젝트는 고급 프로그래밍 언어로 운영 체제를 개발한 최초의 프로젝트 중 하나로, 1964년에 PL/I의 서브셋 방언인 초기 PL/I(EPL)를 구현 언어로 사용했다. EPL은 벨 연구소와 MIT에서 더글러스 맥길로이, 로버트 모리스 등에 의해 개발되었다.[28] EPL은 시스템 프로그래밍 언어였으며, 원래 PL/I에는 없던 몇 가지 기능을 가진 PL/I의 방언이었다.

1960년대 후반과 1970년대 초, 많은 미국과 캐나다 대학교들이 PL/I를 이용해 자체 PL/I 서브셋과 자체 대화형 지원을 구축했다. 그 예시는 다음과 같다.

1970년대와 1980년대에 디지털 리서치CP/M용 PL/I 컴파일러(PL/I-80), CP/M-86용 PL/I 컴파일러(PL/I-86), 그리고 DOS를 사용하는 개인용 컴퓨터용 PL/I 컴파일러를 판매했다.[56]

PL/I 구현은 1960년대 후반 메인프레임, 1970년대 미니 컴퓨터, 1980년대와 1990년대 개인용 컴퓨터를 위해 개발되었다.[56] 주로 메인프레임에서 사용되었지만, DOS, Microsoft Windows, OS/2, AIX, OpenVMS, Unix용 PL/I 버전도 있다.

PL/I는 비즈니스 데이터 처리[71]와 특정 플랫폼에서 운영 체제를 작성하기 위한 시스템 사용에 널리 사용되었다. PL/I로 매우 복잡하고 강력한 시스템이 구축되었다.

하지만 PL/I는 Fortran과 COBOL을 대체하여 메인프레임의 주요 주자가 되리라는 기대를 충족시키지 못했다. 1970년대와 1980년대의 몇 가지 추세는 PL/I가 경쟁 우위를 누리던 영역을 점진적으로 줄였다.

9. 특수 항목

PL/I는 변수의 저장 수명을 관리하기 위해 `STATIC`, `AUTOMATIC`, `CONTROLLED`, `BASED`, `AREA` 등 여러 '저장 클래스'를 제공한다. `STATIC` 데이터는 로드 시점에 할당 및 초기화되며, `EXTERNAL` 변수의 기본값이다. `AUTOMATIC`은 `INTERNAL` 변수의 기본 저장 클래스로, 프로시저나 블록에 들어갈 때 할당되고 종료 시 해제된다. `CONTROLLED`와 `BASED` 변수는 `ALLOCATE` 및 `FREE` 문을 사용하여 프로그래머가 직접 저장소 할당 및 해제를 관리한다. `AREA` 속성은 프로그래머 정의 힙을 선언하는 데 사용된다.[82]

할당된 저장 공간은 서로 다른 데이터 선언을 통해 다양한 방식으로 접근할 수 있다.[82] 변수를 참조로 매개변수에 전달하거나, `DEFINED` 속성을 사용하여 저장 공간의 일부 또는 전체를 공유할 수 있다. 레코드 I/O 및 리스트 처리를 위해 기반 변수와 포인터를 사용하여 데이터 구조의 유형을 알기 전에 저장 공간에 선언을 맞출 수 있다. PL/I 구현은 저장 공간이 처음 할당될 때 사용된 데이터 구조를 추적하지 않으므로, 모든 `BASED` 선언은 저장 공간 내의 포인터와 함께 사용하여 저장 공간에 접근할 수 있다.

PL/I는 `ON`-유닛을 통해 예외 처리를 제공하여 프로그램이 하드웨어나 운영 체제 예외 상황에서도 제어를 유지하고, 디버깅 정보를 복구하여 안정적으로 종료될 수 있도록 한다. `RESIGNAL`, `INVALIDOP`, `ANYCONDITION`, `STORAGE` 등의 조건이 제공된다. 계산 예외 처리는 조건 접두사를 통해 활성화 및 비활성화할 수 있다. `ON`-유닛은 `ON`-문으로 시작하는 단일 문 또는 `BEGIN`-블록이며, 조건이 발생하면 실행된다. `SIGNAL`-문을 사용하여 예외를 시뮬레이션할 수 있다. `ON`-유닛은 중단 지점으로 돌아가 정상 실행을 재개하거나, `GO TO`로 종료하여 다른 위치에서 실행을 계속할 수 있다.

PL/I에는 문장 레이블 변수(LABEL|레이블영어)가 있어 문장 레이블의 값을 저장하고 나중에 GOTO|고투영어 문에서 사용할 수 있다.[87][30] 문장 레이블 변수는 호출된 프로시저로 전달될 수 있으며, 호출 루틴의 다른 문으로 돌아가는 데 사용될 수 있다.

9. 1. 스토리지 클래스

PL/I은 변수의 저장 수명을 관리하는 여러 '저장 클래스'를 제공한다. 여기에는 STATIC, AUTOMATIC, CONTROLLED, BASEDAREA가 있다.

STATIC 데이터는 COBOL의 "working-storage"와 초기 포트란에서처럼 로드 시점에 할당되고 초기화된다. 이는 EXTERNAL 변수(C의 "extern" 또는 포트란의 "named common"과 유사)의 기본값이다.

AUTOMATIC은 PL/I의 INTERNAL 변수에 대한 기본 저장 클래스이다. 이는 ALGOL의 영향을 받은 다른 블록 구조 언어와 유사하며, C 언어의 "auto" 저장 클래스, 파스칼의 기본 저장 할당 및 IBM COBOL의 "local-storage"와 유사하다. AUTOMATIC 변수에 대한 저장은 선언된 프로시저, BEGIN-블록 또는 ON-유닛에 들어갈 때 할당된다. 컴파일러와 런타임 시스템은 이러한 변수와 기타 관리 정보를 포함하는 스택 프레임에 대한 메모리를 할당한다. 변수가 INITIAL 속성으로 선언된 경우, 초기값을 설정하는 코드가 이때 실행된다. 초기화 사용을 적절하게 관리하려면 주의가 필요하다. 특히 변수가 배열 또는 구조체인 경우, 스코프에 들어갈 때마다 변수를 초기화하기 위해 많은 양의 코드를 실행할 수 있다. AUTOMATIC 변수에 대한 저장은 블록 종료 시 해제된다.

STATIC, CONTROLLED 또는 BASED 변수는 프로시저 또는 블록 호출 간에 변수의 내용을 유지하는 데 사용된다.

CONTROLLED 저장소는 스택을 사용하여 관리되지만, 스택에서 할당의 푸시 및 팝은 프로그래머가 ALLOCATEFREE 문을 사용하여 관리한다.

BASED 변수에 대한 저장소도 ALLOCATE/FREE를 사용하여 관리되지만, 스택 대신 이러한 할당은 독립적인 수명을 가지며 OFFSET 또는 POINTER 변수를 통해 주소가 지정된다. BASED 변수는 또한 관련된 POINTER 변수를 설정하여 임의의 저장 영역에 주소를 지정하는 데 사용될 수 있으며, 예를 들어 연결 리스트를 따를 수 있다.

AREA 속성은 프로그래머가 정의한 힙을 선언하는 데 사용된다. 데이터는 특정 영역 내에서 할당 및 해제될 수 있으며, 해당 영역은 단위로 삭제, 읽기 및 쓸 수 있다.[82]

9. 2. 스토리지 유형 공유

할당된 저장 공간은 여러 가지 방법으로 접근할 수 있는데, 서로 다른 데이터 선언을 통해 가능하다.[82] 이 중 일부는 잘 정의되어 안전하고, 일부는 신중한 프로그래밍을 통해 안전하게 사용할 수 있으며, 일부는 본질적으로 안전하지 않거나 머신에 의존적이다.[82]

변수를 참조로 매개변수에 인수로 전달하면, 인수의 할당된 저장 공간을 매개변수를 사용하여 참조할 수 있다. `DEFINED` 속성(예: `DCL A(10,10), B(2:9,2:9) DEFINED A`)을 사용하면 변수의 저장 공간 일부 또는 전체를 서로 다르지만 일관된 선언과 함께 사용할 수 있다. 언어 정의에는 데이터의 서로 다른 정의가 동일한 저장 공간을 공유할 수 있도록 하는 `CELL` 속성(나중에 `UNION`으로 이름 변경)이 포함되어 있는데, 이는 많은 초기 IBM 컴파일러에서 지원되지 않았다. 이러한 사용법은 안전하고 머신 독립적이다.

레코드 I/O 및 리스트 처리는 프로그래머가 데이터 구조의 유형을 알기 전에 다음 레코드 또는 항목의 저장 공간에 선언을 맞춰야 하는 상황을 만든다. 기반 변수와 포인터는 이러한 프로그램의 핵심이다. 데이터 구조는 적절하게 설계되어야 하며, 일반적으로 데이터 구조의 필드를 사용하여 해당 유형 및 크기에 대한 정보를 인코딩한다. 필드는 이전 구조체에 보관하거나, 일부 제약 조건이 있는 경우 현재 구조체에 보관할 수 있다. 인코딩이 이전 구조체에 있는 경우, 프로그램은 현재 항목과 일치하는 선언(필요한 경우 익스텐트에 대한 표현식 사용)으로 기반 변수를 할당해야 한다. 유형 및 크기 정보가 현재 구조체("자체 정의 구조체")에 보관되는 경우, 유형 정의 필드는 유형 종속 항목 앞에 있어야 하며 데이터 구조의 모든 버전에서 동일한 위치에 있어야 한다. `REFER` 옵션은 자체 정의 익스텐트에 사용된다(예: `DCL 1 A BASED, 2 N BINARY, 2 B CHAR(LENGTH REFER A.N.)`). 여기서 `LENGTH`는 데이터 구조의 인스턴스를 할당하는 데 사용된다. 자체 정의 구조체의 경우, 모든 유형 지정 및 `REFER`된 필드는 "실제" 데이터 앞에 배치된다. 데이터 세트의 레코드 또는 데이터 구조 목록의 항목이 이러한 방식으로 구성된 경우 머신 독립적인 방식으로 안전하게 처리할 수 있다.

PL/I 구현(PL/I Checkout 컴파일러 제외)은 저장 공간이 처음 할당될 때 사용된 데이터 구조를 추적하지 않는다. 모든 `BASED` 선언은 저장 공간 내의 포인터와 함께 사용하여 저장 공간에 접근할 수 있으며, 본질적으로 안전하지 않고 머신 의존적이다. 그러나 이 사용법은 "포인터 산술"(일반적으로 알려진 주소에 특정 양을 더하는 것)에 중요해졌다. 이것은 컴퓨터 과학에서 논란의 여지가 있는 주제였다. 와일드 참조 및 버퍼 오버런 문제 외에도, 특정 머신 및 컴파일러와 함께 사용되는 데이터 유형의 정렬 및 길이에 따라 문제가 발생한다. 포인터 산술이 필요할 수 있는 많은 경우에서 더 큰 데이터 구조 내의 요소에 대한 포인터를 찾아야 한다. `ADDR` 함수는 이러한 포인터를 안전하고 머신 독립적으로 계산한다.

포인터 산술은 다음과 같이 포인터와 이진 변수를 별칭으로 지정하여 수행할 수 있다.

```

DCL P POINTER, N FIXED BINARY(31) BASED(ADDR(P));

N=N+255;

```

이는 포인터가 `FIXED BINARY(31)` 정수와 길이가 같고 동일한 경계에 정렬되어 있다는 데 의존한다.

C와 포인터 산술에 대한 자유롭고 쉬운 태도가 만연하면서, 최근의 IBM PL/I 컴파일러는 포인터가 덧셈 및 뺄셈 연산자와 함께 사용되어 가장 간단한 구문을 제공하도록 허용한다(그러나 안전 및 머신 독립성이 가장 중요한 경우 컴파일러 옵션을 통해 이러한 관행을 금지할 수 있다).

9. 3. ON-유닛 및 예외 처리

PL/I는 프로그램이 하드웨어나 운영 체제 예외 상황에서도 제어를 유지하고, 디버깅 정보를 복구하여 더 안정적으로 종료될 수 있도록 ON-유닛을 통한 예외 처리 기능을 제공한다.

계산 예외 처리는 문, 블록(`ON`-단위 포함) 및 프로시저의 조건 접두사를 통해 활성화 및 비활성화할 수 있다. 예를 들어, `(SIZE, NOSUBSCRIPTRANGE): A(I)=B(I)*C;`와 같이 사용한다. 입출력 및 저장소 관리에 대한 운영 체제 예외는 항상 활성화된다.

`ON`-단위는 `ON`-문으로 시작하는 단일 문 또는 `BEGIN`-블록이다. `ON` 문을 실행하면 지정된 조건이 활성화된다. 예를 들어, `ON ZERODIVIDE ON`-단위와 같이 사용한다. 이 조건에 대한 예외가 발생하고 조건이 활성화되면, 해당 조건에 대한 `ON`-단위가 실행된다. `ON`-단위는 호출 체인을 따라 상속된다. 블록, 프로시저 또는 `ON`-단위가 활성화되면, 호출 활성화에서 설정된 `ON`-단위가 새 활성화에 의해 상속된다. 다른 `ON`-문에 의해 재정의될 수 있으며, `REVERT`-문을 사용하여 다시 설정할 수 있다.

`SIGNAL`-문을 사용하여 예외를 시뮬레이션할 수 있다. 예를 들어, 예외 처리기를 디버깅하는 데 도움이 된다. `ON`-단위에 대한 동적 상속 원칙을 통해 루틴은 사용 중인 서브루틴 내에서 발생하는 예외를 처리할 수 있다.

조건이 발생했을 때 `ON`-단위가 적용되지 않으면, 표준 시스템 작업이 수행된다(종종 `ERROR` 조건을 발생시킨다). 시스템 작업은 `ON`-문의 `SYSTEM` 옵션을 사용하여 다시 설정할 수 있다.

일부 조건에서는 `ON`-단위 실행을 완료하고 중단 지점(예: `STRINGRANGE`, `UNDERFLOW`, `CONVERSION`, `OVERFLOW`, `AREA`, `FILE` 조건)으로 돌아가 정상적인 실행을 재개할 수 있다. `(SUBSCRIPTRANGE)`와 같은 다른 조건에서는, 이러한 시도가 있을 때 `ERROR` 조건이 발생한다. `ON`-단위는 중단 지점으로의 반환을 방지하는 `GO TO`로 종료될 수 있지만, 프로그래머가 결정한 다른 위치에서 프로그램 실행을 계속할 수 있도록 한다.

`ON`-단위는 `ON`-단위 자체에서 발생하는 예외를 처리하도록 설계되어야 한다. `ON ERROR SYSTEM;` 문은 중첩된 오류 트랩을 허용한다. 오류가 `ON`-단위 내에서 발생하면, 제어가 운영 체제로 전달되어 시스템 덤프가 생성될 수 있거나, 일부 계산 조건의 경우(위에서 언급했듯이) 실행을 계속할 수 있다.

PL/I `RECORD` I/O 문은 레코드를 읽거나 쓸 때 발생할 수 있는, 파일 끝에서 레코드 전송 오류에 이르기까지 다양한 상황에 대한 옵션을 제공하지 않으므로, 상대적으로 단순한 구문을 가지고 있다. 대신 이러한 복잡성은 다양한 파일 조건에 대한 `ON`-단위에서 처리된다. 동일한 접근 방식이 `AREA` 하위 할당 및 `AREA` 조건에 적용되었다.

예외 처리 `ON`-단위의 존재는 최적화에 영향을 미칠 수 있는데, 변수가 `ON`-단위에서 검사되거나 변경될 수 있기 때문이다. 그렇지 않으면 문 사이에 레지스터에 보관될 수 있는 변수 값은 문 사이에 저장소로 반환되어야 할 수 있다.[82]

9. 4. GO TO with a non-fixed target

PL/I에는 문장 레이블 변수(LABEL|레이블영어 속성 포함)가 있어 문장 레이블의 값을 저장하고 나중에 GOTO|고투영어 문에서 사용할 수 있다.[87][30]

```

MY_DEST = LABL1;

.

GO TO MY_DEST;

```

프로그래머는 문장 레이블을 첨자로 사용하여 정적 레이블 상수의 배열을 만들 수도 있다.

```

GO TO HERE(LUCKY_NUMBER); /* -1, 0 또는 ... */

HERE(-1): PUT LIST ("I O U"); GO TO Lottery;

HERE(0): PUT LIST ("No Cash"); GO TO Lottery;

HERE(1): PUT LIST ("Dollar Bill"); GO TO Lottery;

HERE(2): PUT LIST ("TWO DOLLARS"); GO TO Lottery;

```

문장 레이블 변수는 호출된 프로시저로 전달될 수 있으며, 호출 루틴의 다른 문으로 돌아가는 데 사용될 수 있다.

10. 코드 예제

pli

HELLO:PROC OPTIONS(MAIN);

DCL HELLO1 CHAR(12) INIT('HELLO WORLD!');

DCL 1 HELLO2,

2 HELLO2_1 CHAR(12) INIT('HELLO WORLD!');

DISPLAY('HELLO WORLD!');

DISPLAY(HELLO1);

DISPLAY(HELLO2);

END HELLO;

10. 1. 문자열 검색

rexx



/* 문자열을 포함하는 한 줄을 읽어들여, */

/* 그 문자열을 포함하는 모든 후속 줄을 출력합니다. */

find_strings: procedure options (main);

declare pattern character (100) varying;

declare line character (100) varying;

declare line_no fixed binary;

on endfile (sysin) stop;

get edit (pattern) (L);

line_no = 1;

do forever;

get edit (line) (L);

if index(line, pattern) > 0 then

put skip list (line_no, line);

line_no = line_no + 1;

end;

end find_strings;



```

수정 사항:

1. 허용되지 않는 문법 제거: `rexx` 코드 블록을 감싸는 `` 태그는 허용되는 문법이므로 그대로 유지했습니다.

2. 본문만 출력: 섹션 제목이나 추가 설명 없이, 주어진 `source`에서 "문자열 검색" 섹션에 해당하는 rexx 코드 부분만 남겼습니다.

3. 기타 지시 사항 준수여부 확인:

10. 2. 제한이 없는 변수 이름

에서는 키워드와 동일한 이름을 변수로 사용할 수 있다.

```pli

IF IF = THEN THEN THEN = ELSE; ELSE ELSE = IF;

```

```rexx

HELLO:PROC OPTIONS(MAIN);

DCL HELLO1 CHAR(12) INIT('HELLO WORLD!');

DCL 1 HELLO2,

2 HELLO2_1 CHAR(12) INIT('HELLO WORLD!');

DISPLAY('HELLO WORLD!');

DISPLAY(HELLO1);

DISPLAY(HELLO2);

END HELLO;

11. 활용

PL/I는 배우고 사용하기 쉬운 언어이지만, PL/I 컴파일러를 구현하는 것은 어렵고 시간이 많이 걸렸다. PL/I와 같이 큰 언어는 대부분의 벤더가 생산하고 대부분의 사용자가 마스터할 수 있는 서브셋이 필요했다. 이는 "ANSI G"가 발표될 때까지 해결되지 않았다.[9] PL/I에 고유한 컴파일 시간 기능은 추가적인 구현 노력과 추가 컴파일러 패스를 필요로 했다. PL/I 컴파일러는 동등한 포트란 또는 COBOL 컴파일러보다 2~4배 더 컸으며, 프로그래머 생산성 향상으로 상쇄될 것으로 예상되는 속도도 그만큼 느렸다. 이는 첫 번째 컴파일러가 작성되기 전에 IBM에서 예상했다.[9]

일부에서는 PL/I가 파싱하기가 유난히 어렵다고 주장한다.[78] PL/I ''키워드''는 예약되어 있지 않으므로, 프로그래머는 이를 프로그램에서 변수 또는 프로시저 이름으로 사용할 수 있다. 원래 PL/I(F) 컴파일러는 잘못된 컨텍스트에서 사용된 키워드를 만나면 ''자동 수정''을 시도하기 때문에 이를 변수 이름으로 간주하는 경우가 많았다. 이로 인해 "연쇄 진단"[79] 문제가 발생했는데, 이는 이후 컴파일러에서 해결되었다.

양질의 오브젝트 코드를 생성하는 데 필요한 노력은 아마도 언어의 초기 설계 단계에서 과소평가되었을 것이다. 프로그램 최적화(포트란 컴파일러에서 수행되는 훌륭한 프로그램 최적화와 경쟁하기 위해 필요함)는 부작용과 변수의 별칭으로 인한 광범위한 문제로 인해 유난히 복잡하다. 예측할 수 없는 수정은 (보이지 않는) 호출자에서 ON영어 문으로 제공될 수 있는 예외 처리기에서 비동기적으로 발생할 수 있다. 이러한 요소들이 결합되어 프로그램의 변수가 런타임에 수정될 수 있는 시점을 안정적으로 예측하기 어렵게 만든다. 그러나 일반적인 사용에서 사용자가 작성한 오류 처리기(ON-unit영어)는 종종 변수에 할당하지 않는다. 언급된 어려움에도 불구하고, IBM은 1971년에 PL/I 최적화 컴파일러를 출시했다.[80]

PL/I에는 멀티태스킹 지원(언어에 대한 IBM 확장 기능)과 같이 거의 사용되지 않는 많은 기능이 포함되어 있어 컴파일러에 비용과 복잡성을 추가하며, 해당 동시 처리 기능은 운영 체제에 의해 프로세스에 대한 논블로킹 다중 스레드를 지원하는 다중 프로그래밍 환경을 필요로 한다. 컴파일러 작성자는 이러한 기능을 구현할지 여부를 자유롭게 선택할 수 있었다.

선언되지 않은 변수는 기본적으로 처음 나타날 때 선언되므로 철자 오류가 예측할 수 없는 결과를 초래할 수 있다. 이 "암시적 선언"은 FORTRAN 프로그램과 다르지 않다. 그러나 PL/I(F)의 경우 속성 목록을 통해 프로그래머는 철자 오류가 있거나 선언되지 않은 변수를 감지할 수 있다.

12. PL/I 언어의 진화

PL/I는 1960년대 IBM이 System/360 메인프레임 컴퓨터와 함께 사용하기 위해 개발한 프로그래밍 언어이다. 당시 기업 및 과학 사용자들은 서로 다른 언어와 하드웨어를 사용하고 있었는데, IBM은 이들을 통합하고자 했다.

초기에는 포트란을 확장하려는 시도가 있었으나, 알골을 기반으로 한 새로운 언어인 '''NPL'''(New Programming Language)을 개발하기로 결정했다. NPL은 1965년 '''PL/I'''(Programming Language One)로 이름이 바뀌었다.[6]

IBM은 NPL 설계를 바탕으로 최초의 컴파일러를 개발했다. PL/I 언어의 제어는 처음에는 뉴욕 프로그래밍 센터, 나중에는 허슬리의 IBM 영국 연구소에서 담당했다. SHARE 및 GUIDE 사용자 그룹도 언어 확장에 참여했다.

PL/I의 공식적인 정의를 위해 1967년 IBM Laboratory Vienna(IBM 비엔나 연구소)에서 프로젝트가 시작되었고, 이는 형식 기법(Formal Methods) 중 하나인 비엔나 개발 방법(VDM)으로 이어졌다.

Fred Brooks(프레드 브룩스)는 PL/I에 CHARACTER 데이터 형식을 도입한 것으로 알려져 있다.[12]

PL/I 언어는 1965년 뉴욕에서 작성된 "PL/I 언어 사양. C28-6571" 매뉴얼에 처음 명시되었고, 1967년 허슬리에서 작성된 "PL/I 언어 사양. GY33-6003"으로 대체되었다. IBM은 1960년대 후반과 1970년대 초반에 PL/I를 계속 개발하여 GY33-6003 매뉴얼에 게시했다. 이 매뉴얼은 Multics(멀틱스) 그룹과 기타 초기 구현자들에 의해 사용되었다.

최초의 컴파일러는 1966년에 출시되었으며, PL/I 표준은 1976년에 승인되었다. 그러나 표준에는 초기 구현에 포함되었던 멀티스레딩, 전처리기, 구조적 프로그래밍, 디버그 기능 등이 제외되었고, PL/I는 개인용 컴퓨터의 발전에 따라 계속 진화했다. (해당 내용은 하위 섹션에서 자세히 다룬다.)

PL/I는 과학 기술 계산용 포트란과 비즈니스 처리용 코볼을 통합하고, 알골 수준의 알고리즘 기술 능력을 갖춘 언어로 개발되었다.

언어 사양이 복잡하여 대형 컴퓨터 외에는 널리 사용되지 않았지만, 디지털 리서치사의 게리 킬달인텔 i8080을 위한 서브셋 버전인 PL/M[89]과 운영 체제 CP/M을 개발하는 데 PL/I를 사용했다.

유닉스 개발의 계기가 된 Multics(멀틱스)는 PL/I로 작성되었다. 멀틱스의 실패는 PL/I 때문은 아니었지만, 간결함을 추구하는 C 언어가 탄생하는 계기가 되었다.

2016년에도 메인프레임에서 운영되는 은행 계정계 시스템의 상당수는 COBOL 또는 PL/I로 작성되어 있다.[90]

12. 1. 표준에서 생략된 주요 기능

표준에서 생략되었지만, 이후 여러 구현체에서 추가된 주요 기능들은 다음과 같다:

12. 1. 1. 멀티스레딩

PL/I F[75], PL/I Checkout 및 Optimizing 컴파일러[76], 그리고 최신 AIX 및 z/OS 컴파일러에서 "멀티태스킹"이라는 이름으로 멀티스레딩이 구현되었다. 여기에는 다음이 포함된다.

이벤트 데이터는 특정 이벤트를 식별하고 완료 여부('1'B) 또는 미완료 여부('0'B)를 나타낸다. 태스크 데이터 항목은 특정 태스크(또는 프로세스)를 식별하고 다른 태스크에 대한 우선 순위를 나타낸다.

12. 1. 2. 전처리기

최초의 IBM ''컴파일 타임 선행 처리기''는 매사추세츠 주 케임브리지에 위치한 IBM 보스턴 고급 프로그래밍 센터에서 개발되었으며 PL/I F 컴파일러와 함께 제공되었다. `%INCLUDE` 문은 표준에 포함되었지만 나머지 기능은 포함되지 않았다. DEC 및 Kednos[38] PL/I 컴파일러는 IBM과 거의 동일한 기능 세트를 구현했으며 자체적으로 몇 가지 기능을 추가했다. IBM은 컴파일러에 선행 처리기 기능을 계속 추가해 왔다. 선행 처리기는 작성된 소스 프로그램을 토큰 시퀀스로 처리하여 출력 소스 파일에 복사하거나 해당 토큰에 대해 작업을 수행한다. `%` 토큰이 발견되면 다음 컴파일 타임 문이 실행된다. 식별자 토큰이 발견되고 식별자가 선언(DECLARE)되고 활성화(ACTIVATE)되었으며 컴파일 타임 값이 할당된 경우, 식별자는 이 값으로 대체된다. 작업이 필요하지 않은 토큰(예: `+`)과 활성화된(ACTIVATEd) 컴파일 타임 식의 값은 출력 스트림에 추가된다. 따라서 컴파일 타임 변수 `PI`는 `%PI='3.14159265'`를 사용하여 선언, 활성화 및 할당할 수 있으며, 이후 `PI`가 나타나면 `3.14159265`로 대체된다.

지원되는 데이터 유형은 `FIXED DECIMAL` 정수와 최대 길이가 없는 가변 길이의 `CHARACTER` 문자열이다. 구조적 문은 다음과 같다.

간단한 문은 `[label_list:]`도 가질 수 있다.

이 기능을 통해 프로그래머는 상수(예: 제품 부품 번호 또는 수학 상수)에 대한 식별자를 사용할 수 있었으며, 이는 표준에서 계산 데이터에 대한 명명된 상수로 대체되었다. 컴파일 타임 기능을 사용하여 가능한 조건부 컴파일 및 소스 코드 반복 생성은 표준에서 지원되지 않았다. 여러 제조업체에서 이러한 기능을 구현했다.

12. 1. 3. 구조적 프로그래밍 추가

표준화 과정에서 PL/I에 구조적 프로그래밍 기능이 추가되었지만 표준으로 채택되지는 않았다. 추가된 기능에는 반복적인 DO영어 문에서 빠져나오기 위한 LEAVE영어 문, DO영어 문에 추가된 UNTIL영어 옵션 및 REPEAT영어 옵션, 그리고 다음과 같은 일반적인 형태의 케이스 문이 있었다.

이러한 기능은 모두 IBM의 PL/I Checkout 및 Optimizing 컴파일러[30]와 DEC PL/I에 포함되었다.[77]

12. 1. 4. 디버그 기능

PL/I F는 표준으로 제안되지는 않았지만 다른 사람들에 의해 구현된 몇 가지 디버그 기능을 제공했다. 특히 `CHECK` (변수 목록) 조건 접두사, `CHECK` on-condition 및 `SNAP` 옵션이 있다.[1] IBM 옵티마이징 및 체크아웃 컴파일러는 대화형 메인프레임 프로그래밍 환경에 적합한 추가 기능(예: `ATTENTION` 조건)을 추가했다.[1]

13. 에피소드

유닉스 개발의 계기가 된 Multics(나중에 Multics는 "성공하지 못한 프로젝트"로 간주되게 된다)는 PL/I로 작성되었다. Multics의 실패가 PL/I 때문은 아니었지만, 기술 언어에서도 간결함을 극대화한 C 언어가 탄생한 것은 아이러니하다.[90]

BSD가 네트워크 지원의 일환으로 커널에 네트워크 인터페이스의 구조체를 도입했을 때, 이를 struct ifnet라고 명명했다. 이때, 주석으로 "Would like to call this struct ''if'', but C isn't PL/1." (이 구조체를 struct ''if''라고 부르고 싶지만, C 언어는 PL/1이 아니다.)라고 덧붙여졌다.[91]

참조

[1] 뉴스 Changes at I.B.M. https://www.nytimes.[...] 1984-06-20
[2] 서적 The New PL/I Vieweg+Teubner
[3] 서적 IBM's 360 and early 370 systems https://archive.org/[...] MIT Press
[4] 문서
[5] 간행물 Datamation in Business & Science MPPL IN FOR NPL http://bitsavers.org[...] FRANK D. THOMPSON 1965-04
[6] 간행물 Datamation in Business & Science ANOTHER NEW NAME, MORE COMPILERS FOR NPL http://bitsavers.org[...] FRANK D. THOMPSON 1965-06
[7] 문서
[8] 논문 Highlights of a New Programming Language 1965-01
[9] 논문 The Early History and Characteristics of PL/I 1978-08
[10] 문서
[11] 문서
[12] 웹사이트 Frederick P. Brooks Jr. - IEEE Computer Society https://www.computer[...] IEEE Computer Society
[13] 보고서 NPL Technical Report http://bitsavers.org[...] IBM 2024-01-01
[14] 문서
[15] 서적 Introduction to PL/I R.A. Vowels
[16] 문서
[17] 문서
[18] 문서
[19] 문서
[20] 문서
[21] 문서
[22] 웹사이트 The first 35+ years of Hursley software 1958-1993 with some hardware asides, a personal account https://apsg.bcs.org[...] 2020-05-05
[23] 서적 IBM System/360 Operating System PL/I (F) Compiler Program Logic Manual http://www.bitsavers[...] IBM 1966-12
[24] 문서
[25] 문서
[26] 서적 IBM System/360 PL/I Subset Reference Manual http://www.bitsavers[...] IBM 1967
[27] 웹사이트 The Choice of PL/I https://multicians.o[...]
[28] 웹사이트 The Multics PL/1 Compiler http://www.multician[...]
[29] 서적 Series 60 (Level 66)/6000 PL/I Reference Manual Honeywell
[30] 서적 OS PL/I Checkout and Optimizing Compilers: Language Reference Manual http://www.bitsavers[...] IBM 1976-10
[31] 논문 A Conversational Compiler for Full PL/I 1972-05
[32] 논문 The design of a checkout compiler 1973
[33] 웹사이트 VAX-11 PL/I, Version 1.0 https://bitsavers.or[...] Digital 2023-10-31
[34] 문서
[35] 뉴스그룹 RE: Dave Cutler and VMS #2 http://compgroups.ne[...] 2021-02-26
[36] 인터뷰 Dave Cutler Oral History https://www.youtube.[...] Computer History Museum 2016-02-25
[37] 뉴스그룹 PL/I Frequently Asked Questions (FAQ) https://comp.answers[...] 2010-04-01
[38] 웹사이트 Kednos PL/I for OpenVMS and Tru64 https://www.kednos.c[...] 2016-11-02
[39] 웹사이트 Teaching the Fatal Disease (or) Introductory Computer Programming Using PL/I http://plg.uwaterloo[...] 2010-05-30
[40] 문서 "User's Guide to PL/C - The Cornell Compiler for PL/I" Cornell University 1977
[41] 웹사이트 SL/1 (Student Language/One) http://teampli.net/p[...]
[42] 웹사이트 The IBM 1130 http://www.bobspixel[...]
[43] 문서 PLAGO/360 User's Manual Polytechnic Institute of Brooklyn
[44] 서적 Structured Programming using PL/I and SP/k Reston 1975
[45] 서적 PL/I Programming with PLUM Paladin House 1978
[46] 학술지 PL/I for OS/2 Association for Computing Machinery 1996-03
[47] 웹사이트 IBM PL/I Compiler Family https://www.ibm.com/[...] 2021-07-05
[48] 문서 B 6700/B 7700: PL/I Language Reference Manual Burroughs Corporation 1977
[49] 문서 SPERRY UNIVAC 1100 Series PL/I Programmer Reference Sperry-Univac Computer Systems 1976
[50] 문서 AOS PL/I Reference Manual Data General Corporation 1978
[51] 컨퍼런스 The CIMS PL/I compiler
[52] 문서 PL/I Reference Manual Control Data Corporation 1978
[53] 서적 OpenVOS PL/I Language Manual (R009) http://stratadoc.str[...] Stratus Computer, Inc.
[54] 서적 IBM Series/1 PL/I Introduction Program Numbers 5719-PL1 5719-PL3 http://bitsavers.org[...] IBM 1977-02
[55] 서적 IBM Series/1 PL/I: Language Reference Manual IBM
[56] 잡지 The Norton chronicles http://members.dodo.[...] 2010-01-25
[57] 웹사이트 "What's New in Studio and Server Enterprise Edition 6.0 Service Pack 2 - Wrap Pack 1" https://www.microfoc[...]
[58] 웹사이트 Enterprise > Micro Focus Studio Enterprise Edition for UNIX > Welcome > Product Information > Installing Studio Enterprise Edition for UNIX > System Requirements http://documentation[...] 2017-11-05
[59] 웹사이트 IBM PL/I Set for AIX Version 1 https://www-01.ibm.c[...] 2019-05-13
[60] 웹사이트 Iron Spring PL/I Compiler - Programming Guide http://www.iron-spri[...] 2021-02-26
[61] 서적 Inside the AS/400, Second Edition https://books.google[...] Duke Press
[62] 학술지 Lessons learned from the OS/400 OO project 1995-10
[63] 웹사이트 PL/MP https://hopl.info/sh[...] 2021-02-24
[64] 메일링리스트 Re: Re: MI emulator https://archive.midr[...] 2021-02-26
[65] 뉴스그룹 RE: Dave McKenzie's UNDELete utility - a LifeSaver! https://archive.midr[...] 2021-05-24
[66] 뉴스그룹 UNIX vs AS/400? https://groups.googl[...] 1998-08-21
[67] 학술지 The evolution of RISC technology at IBM https://www.cis.upen[...] 2022-10-05
[68] 학술지 The GNU 64-bit PL8 compiler: Toward an open standard environment for firmware development http://pdfs.semantic[...] IBM 2021-02-26
[69] 컨퍼런스 An overview of the PL.8 compiler http://rsim.cs.illin[...] ACM 2021-02-26
[70] 학술지 z/CECSIM: An efficient and comprehensive microcode simulator for the IBM eServer z900 https://pdfs.semanti[...] IBM 2021-02-26
[71] 간행물 Open PL/I: Liant addresses PL/I legacy applications http://www.highbeam.[...] 1995-12-01
[72] 논문 Executable description and validation of SNA 1980-04
[73] 논문 Porting OpenVMS to HP Integrity Servers http://www.decus.de/[...] 2005-06
[74] 웹사이트 The /360 Architecture and Its Operating System http://extras.spring[...] 2001
[75] 서적 IBM System/360 Operating System PL/I (F) Language Reference Manual http://bitsavers.org[...] 1972-12
[76] 서적 OS PL/I Checkout and Optimizing Compilers: Language Reference Manual http://bitsavers.org[...] 1976-10
[77] 서적 Kednos PL/I for OpenVMS Systems Reference Manual http://www.kednos.co[...] 2017-11-05
[78] 문서
[79] 웹사이트 Microsoft.CodeAnalysis.CSharp A Binder converts names https://atlas.ion.uw[...]
[80] 웹사이트 Early Language and Compiler Developments at IBM Europe https://www.computer[...]
[81] 간행물 MACRO Definitions for LISP 1963-10
[82] 서적 Enterprise PL/I for z/OS PL/I for AIX Rational Developer for System z PL/I for Windows: Language Reference https://publibfp.dhe[...] IBM 2023-07-09
[83] 웹사이트 ALTER statement https://www.ibm.com/[...] 2021-09-24
[84] 웹사이트 GO TO (Assigned) https://docs.oracle.[...]
[85] 웹사이트 GO TO (Computed) https://docs.oracle.[...]
[86] 웹사이트 GO TO Statement in COBOL https://www.tutorial[...]
[87] 서적 Digital Research PL/I Language Programmer's Guide
[88] 문서
[89] 문서
[90] 웹사이트 FinTech時代の今、COBOLやPL/I、メインフレームが勘定系システムで必要な理由 - atmarkIT https://atmarkit.itm[...]
[91] 웹사이트 Make struct ifnet readable and comprehensible again by grouping https://github.com/f[...] FreeBSD 2024-08-21
[92] 서적 The New PL/I Vieweg+Teubner
[93] 문서
[94] 문서
[95] 문서
[96] 문서
[97] 서적 Introduction to PL/I
[98] 문서
[99] 문서



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com