PL/I
"오늘의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]
PL/I는 알골 60과 유사한 블록 구조를 가지며, 기본적으로 재귀를 지원한다. 인수는 참조에 의한 호출 방식을 사용하며, 필요에 따라 값에 대해 더미 변수를 사용한다.[13] 광범위한 계산 데이터 유형, 프로그램 제어 데이터 유형 및 데이터 구조 형태를 지원하며,[3] 프로시저 매개변수를 통해 범위가 상속되는 배열 및 문자열의 동적 범위를 지원한다.[3]
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개의 글리프 문자 집합에 적합하고 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
데이터 유형은 단일 값, 배열 형태의 집합체(차원당 하한 및 상한 포함), 구조체(중첩 구조체, 배열 및 스칼라 변수 포함)등이 있으며, 다음 유형의 데이터를 나타내도록 선언할 수 있다.산술
유형은 다음과 같은 속성으로 구성된다.
식별자 선언은 다음 속성 중 하나 이상을 포함할 수 있다.데이터 속성 입력/출력 속성 기타 속성 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
3. 1. 언어적 특징
PL/I는 모든 프로그래머의 요구를 충족할 수 있도록 설계된 언어이다.[97] ANSI PL/I 표준[98] 및 ANSI PL/I General-Purpose Subset 표준[99]에 따르면, PL/I는 다음과 같은 특징을 갖는다.
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 |
이름은 단일 값, 배열 형태의 집합체(차원당 하한 및 상한 포함), 구조체(중첩 구조체, 배열 및 스칼라 변수 포함)로 다음 유형의 데이터를 나타내도록 선언할 수 있다.
산술
유형은 다음과 같은 속성으로 구성된다.
식별자 선언은 다음 속성 중 하나 이상을 포함할 수 있다.
데이터 속성 | 입력/출력 속성 | 기타 속성 |
---|---|---|
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 |
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`
`DEFAULT` (또는 `DFT`)
`FORMAT`
`IF`
`SELECT`
`GO TO`
`RETURN`
`STOP`
Null 문
`SIGNAL`
`REVERT`
`FREE`
할당 문
`CLOSE`
`PUT`
`WRITE`
`REWRITE`
`LOCATE`
`DELETE`