PL/0
PL/0PL/0은 범용 프로그래밍 언어인 Pascal과 비슷하지만 훨씬 단순한 교육용 프로그래밍 언어입니다.이것은 컴파일러를 구성하는 방법의 예로서 기능합니다.1976년 Niklaus Worth에 의해 Algorithms + Data Structures = Programs라는 책에서 처음 소개되었습니다.이것은 매우 제한된 언어 구조를 특징으로 합니다.실수가 없고 기본적인 산술 연산이 거의 없으며 "if" 및 "while" 블록 외에 제어 흐름 구조가 없습니다.이러한 제한으로 인해 실제 응용 프로그램을 이 언어로 쓰는 것이 실용적이지 않지만 컴파일러는 단순하고 콤팩트한 상태를 유지할 수 있습니다.
문법.
다음으로 EBNF에 정의되어 있는 모델 언어의 구문 규칙을 나타냅니다.
프로그램.= 블록"." ; 블록= [ "항상" 식별하다"=" 번호{"," 식별하다"=" 번호} ";"] [ "var" 식별하다{"," 식별하다} ";"] { "실패" 식별하다";" 블록";" } 진술; 진술= [ 식별하다":=" 표현 "콜" 식별하다 "?" 식별하다 "!" 표현 "실패" 진술{";" 진술} '종료' "만약" 조건."그럼" 진술 '중' 조건.'도' 진술]; 조건.= '홀수' 표현 표현("=" "#" "<" "<=" ">" ">=") 표현; 표현= [ "+" "-"] 용어{ ("+" "-") 용어}; 용어= 인자{("*" "/") 인자}; 인자= 식별하다 번호 "(" 표현")";
학생들이 이러한 간단한 구문을 위해 재귀 강하 파서를 쓰는 것은 오히려 쉽다.따라서 PL/0 컴파일러는 여전히 전 세계에서 컴파일러 구축 과정에 널리 사용되고 있습니다.원래 사양에는 기능이 없기 때문에 학생들은 보통 언어와 컴파일러를 확장하는 데 대부분의 시간을 할애합니다.그들은 보통 소개부터 시작한다.REPEAT .. UNTIL
프로시저나 데이터 구조(어레이, 문자열, 부동 소수점 번호 등)에 매개 변수를 전달하는 고급 기능을 계속 사용할 수 있습니다.
교육에 사용
컴파일러에 관한 주요 기사는 학생들이 이러한 개념을 사용하도록 교육함으로써 여러 가지 영향력 있는 개념(단계적 정제, 재귀 강하 해석, EBNF, P 코드, T-다이그램)을 소개한 PL/0을 기리고 있다.지난 30년 동안 PL/0을 사용한 컴파일러 구축에 관한 대부분의 대학 과정은 이러한 기술을 사용하는 데 있어서 Worth를 엄격히 따랐습니다(아래 참조 참조).몇 년 전 대학 코스는 Worth가 설정한 코스에서 벗어나 고전적인 재귀적 하강 해석 기법을 렉스와 yacc를 채용하는 Unix와 같은 접근방식으로 대체했습니다.최근에 와서야 이러한 방식의 구현(PL/0 언어 도구)도 객체 지향 및 설계 패턴과 같은 현대적인 개념을 현대적인 스크립트 언어(Python)와 결합하여 학생들이 구현의 소스 텍스트를 현대적인 프로그래밍 스타일로 사용할 수 있게 되었습니다.
컴파일러 구성
1976년 12월, 워스는 PL/0 컴파일러의 완전한 소스 코드를 포함한 컴파일러 구조에 관한 작은 소책자를 썼다.위의 구문 규칙은 워스의 책 컴파일러바우 [1]초판에서 따온 것입니다.워스는 이 책의 최신호에서 (그의 진행 중인 연구의 영향을 받아) PL/0의 구문을 변경했다.그는 키워드의 철자를 바꿨다.const
그리고.procedure
대문자로 표시합니다.이 변경으로 PL/0은 Modula-2와 더 비슷해졌습니다.동시에 워스의 친구이자 협력자 C. A. R. Hoare는!와 물음표를 사용하여 커뮤니케이션 원형을 나타내는 영향력 있는 커뮤니케이션 시퀀셜 프로세스 개념을 연구하고 있었습니다.워스는 PL/0 언어에 두 기호를 추가했지만 책에서 의미론에 대해서는 언급하지 않았다.
예
다음 예는 PL/[2]0E라는 확장 언어에서 가져온 것입니다.이 프로그램은 1부터 10까지의 숫자의 제곱을 출력합니다.오늘날 컴파일러 구축 과정의 대부분은 느낌표를WriteLn
절차.
VAR x, 스쿼시; 절차. 광장; 시작한다. 스쿼시:= x * x 끝.; 시작한다. x := 1; 하는 동안에 x <=> 10 하다 시작한다. 불러 광장; ! 스쿼시; x := x + 1 끝. 끝..
다음 프로그램은 1 ~ 100의 소수점을 인쇄합니다.write 문은 위의 EBNF 구문의 '!' 문에 해당합니다.
컨스턴트 맥스. = 100; 변화하다 arg, 리트; 절차. 프라임; 변화하다 i; 시작한다. 리트 := 1; i := 2; 하는 동안에 i < > arg 하다 시작한다. 한다면 arg / i * i = arg 그리고나서 시작한다. 리트 := 0; i := arg 끝.; i := i + 1 끝. 끝.; 절차. 소수점; 시작한다. arg := 2; 하는 동안에 arg < > 맥스. 하다 시작한다. 불러 프라임; 한다면 리트 = 1 그리고나서 쓰다 arg; arg := arg + 1 끝. 끝.; 불러 소수점 .
다음은 1986년 독일에서 출간된 바스의 책 컴파일러바우 [1]제2판에서 인용한 것이다.
VAR x, y, z, q, r, n, f; 절차. 곱하다; VAR a, b; 시작한다. a := x; b := y; z := 0; 하는 동안에 b > 0 하다 시작한다. 한다면 이상한 b 그리고나서 z := z + a; a := 2 * a; b := b / 2 끝. 끝.; 절차. 나누다; VAR w; 시작한다. r := x; q := 0; w := y; 하는 동안에 w <=> r 하다 w := 2 * w; 하는 동안에 w > y 하다 시작한다. q := 2 * q; w := w / 2; 한다면 w <=> r 그리고나서 시작한다. r := r - w; q := q + 1 끝. 끝. 끝.; 절차. gcd; VAR f, g; 시작한다. f := x; g := y; 하는 동안에 f # g 하다 시작한다. 한다면 f < > g 그리고나서 g := g - f; 한다면 g < > f 그리고나서 f := f - g 끝.; z := f 끝.; 절차. 사실; 시작한다. 한다면 n > 1 그리고나서 시작한다. f := n * f; n := n - 1; 불러 사실 끝. 끝.; 시작한다. ?x; ?y; 불러 곱하다; !z; ?x; ?y; 불러 나누다; !q; !r; ?x; ?y; 불러 gcd; !z; ?n; f := 1; 불러 사실; !f 끝..
오베론-0
Worth는 컴파일러 구조에 관한 책의 제3판이자 마지막 판에서 PL/0을 Oberon-0으로 대체했습니다.Oberon-0 언어는 PL/0보다 훨씬 복잡합니다.예를 들어 Oberon-0은 어레이, 레코드, 유형 선언 및 프로시저 파라미터를 제공합니다.워스의 출판사(애디슨-웨슬리)는 그의 모든 책을 단계적으로 폐기하기로 결정했지만 [3]워스는 2004년부터 개정판을 출간했다.2017년 8월[update] 현재 사용 가능한 최신 버전은 2017년 [4][5]5월부터입니다.
「 」를 참조해 주세요.
메모들
- ^ a b 워스, 1986년
- ^ PL/0E Wayback Machine에서 2012-02-21 아카이브 완료
- ^ 개정판 제3판 컴파일러 컨스트럭션의 Wayback Machine(2005)에서 2017-02-17을 아카이브, 1996, ISBN0-201-40353-6은 인쇄기를 본 적이 없지만 온라인에서 구할 수 있습니다.
- ^ Wirth, Niklaus (2017-05-28). "Compiler Construction". Retrieved 2017-08-25.
- ^ Wirth, Niklaus (2017-08-18). "news.txt". Archived from the original on 2017-08-25. Retrieved 2017-08-25.
레퍼런스
- Liffick, Blaise W., Ed(1979), 파스칼의 바이트북, ISBN 0-07-037823-1
- Worth, Niklaus(표준), 알고리즘 + 데이터 구조 = 프로그램, ISBN 0-13-022418-9
- Worth, Niklaus(1986), 컴파일러바우, B.G. Teubner, Stuttgart ISBN 3-519-32338-9
외부 링크
- 파스칼로 작성된 컴파일러바우 책의 초판 컴파일러(.pas 파일)
- 소규모 기계용 Pascal 컴파일러의 다른 복사본
- Pascal로 작성된 "알고리즘 + 데이터 구조 = 프로그램" 책의 통역자
- Mocka로 작성된 '컴파일러 구조'에 기반한 PL/0 스타일 컴파일러 개발 (Modula-2 for Linux)
- 로체스터 대학의 PL/0 사용을 설명하는 논문
- PL/0 참조서 홈페이지 "알고리즘 + 데이터 구조 = 프로그램" [1]
- http://sourceforge.net/projects/pl0-compiler (C/C++로 작성, QT 프레임워크 사용)
- https://modernc.org/pl0 (Go로 작성, 터미널에서 실행, 플랫폼 간 실행)
- https://github.com/dodobyte/plzero (초소형 컴파일러로 Windows 실행 가능 파일 생성)
- https://github.com/MarcRochkind/pl0compiler (C로 작성된 IBM 701에 대응하여 701 어셈블러를 생성합니다)