PL/I

**PL/I**(ˌpiːˌɛlˈwʌn)는 **Programming Language One**의 약어로, 과학, 공학 및 산업 응용 프로그램을 위해 설계된 명령형 프로그래밍 언어이다. IBM에서 자사의 메인프레임에서 사용하기 위해 개발했다. 1960년대 도입 이후로 다양한 학술, 상업, 산업 단체들이 사용하고 있으며, 2009년 기준으로 여전히 활발히 쓰이고 있다.isbn=978-3-8348-0726-7 PL/I의 주요 분야는 데이터 처리, 수치 해석, 과학적 연산, 시스템 프로그래밍이다. 언어의 문법은 영어와 같이 취급되며 이들을 확인하고 조작하는 명령어 집합을 사용하여 복잡한 데이터 형식을 기술하는데 적절하다.
# 역사
1950년대와 1960년대 초에 비즈니스 및 과학 분야의 사용자들은 각기 다른 프로그래밍 언어를 사용하여 다른 컴퓨터 하드웨어를 위해 프로그램을 작성하였다. 비즈니스 분야의 사용자들은 COMTRAN을 경유하는 오토코더에서 코볼로 옮겨가고 있었지만, 과학 분야의 사용자들은 GIP(General Interpretive Programme), 포트란, 알골, GEORGE로 프로그램을 작성하였다. IBM 시스템/360IBM's 360 and Early 370 Systems, Emerson W. Pugh, Lyle R Johnson, John H Palmer, MIT Press, 1991 (1964년에 발표하였으나 1966년까지 보급되지 않았음)이 두 그룹의 사용자들을 위한 공통의 머신 아키텍처로 설계되면서 기존의 모든 IBM 아키텍처들을 대체하였다. 이와 비슷하게, IBM은 모든 사용자들을 위한 단일 프로그래밍 언어를 원하였다. IBM은 포트란이 상용 프로그래머들이 필요로하는 기능들로 확장되길 바랐다. 1963년 10월, IBM 과학 사용자 그룹의 세 명의 뉴욕 IBM 출신과 세 명의 SHARE 출신에 의해 한 위원회가 설립되었고The committee actually had 8 members at the time the report was released. They were: * Hans Berg, Lockheed Burbank * George Radin, IBM * James Cox, Union Carbide * Bruce Rosenblatt, Standard Oil of California, Chair. * Douglas McIlroy, Bell Laboratories * Robert Sheppard, Procter & Gamble. From the GUIDE organization * C.W. Medlock, IBM * Bernice Weitzenhoffer, IBM. 포트란에 대한 이러한 확장들을 제안하였다. 포트란의 제약으로 인해 이를 수행할 수 없었고 알골에 어느 정도 기반한 NPL이라는 이름의 새로운 프로그래밍 언어의 설계에 착수하였다. NPL이라는 이름은 영국의 National Physical Laboratory와 충돌되어 MPPL (MultiPurpose Programming Language)로 바뀌었고, 1965년 PL/I으로 바뀌었다. 최초의 정의는 1964년 4월에 등장하였다.Report II of the SHARE Advanced Language Development Committee, June 25, 1964Highlights of a New Programming Language, G.Radin and H.Paul Rogoway Communications of the ACM V8 No 1, Jan 1965 최초의 컴파일러는 1966년에 보급되었다. PL/I 표준은 1976년에 승인되었다.
# 언어 요약
이 언어는 전적으로 모든 프로그래머들에게 맞추도록 설계되어 있다.quote=**PL/I is the first language to provide adequate facilities for scientific computations, business data processing and systems programming in a single language** - 진 사멧, *Some Approaches to, and Illustrations of, Programming Language History* 이 요약은 ANSI PL/I 표준ANS Programming Language PL/I. X3.53-1976 및 ANSI PL/I General-Purpose Subset 표준으로부터 가져온 것이다.ANSI X3.74-1981 (R1998) ''Information Systems - Programming Language - PL/I General-Purpose Subset {| class="wikitable" |- ! |분류 ! 문 |- | 구조적 | `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` |} 식별자 선언은 다음의 특성들 중 하나 이상을 포함할 수 있다: {| class="wikitable" |- ! 데이터 특성 ! 입출력 특성 ! 기타 특성 |- | `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` | | |}
# 예제 프로그램

## 문자열 검색
FINDSTRINGS: PROCEDURE OPTIONS(MAIN); /* READ A STRING, THEN PRINT EVERY */ /* SUBSEQUENT LINE WITH A MATCH */ DECLARE PAT VARYING CHARACTER(100), LINEBUF VARYING CHARACTER(100), (LINENO, NDFILE, IX) FIXED BINARY; NDFILE = 0; ON ENDFILE(SYSIN) NDFILE=1; GET EDIT(PAT) (A); LINENO = 1; DO WHILE (NDFILE=0); GET EDIT(LINEBUF) (A); IF LENGTH(LINEBUF) > 0 THEN DO; IX = INDEX(LINEBUF, PAT); IF IX > 0 THEN DO; PUT SKIP EDIT (LINENO,LINEBUF)(F(2),A); END; END; LINENO = LINENO + 1; END; END FINDSTRINGS;
## 제한이 없는 변수 이름
키워드와 동일한 이름을 변수로 쓸 수 있다. IF IF = THEN THEN THEN = ELSE; ELSE ELSE = IF;