PL/0

PL/0

PL/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월 현재 사용 가능한 최신 버전은 2017년 [4][5]5월부터입니다.

「 」를 참조해 주세요.

메모들

  1. ^ a b 워스, 1986년
  2. ^ PL/0E Wayback Machine에서 2012-02-21 아카이브 완료
  3. ^ 개정판 제3판 컴파일러 컨스트럭션Wayback Machine(2005)에서 2017-02-17을 아카이브, 1996, ISBN0-201-40353-6은 인쇄기를 본 적이 없지만 온라인에서 구할 수 있습니다.
  4. ^ Wirth, Niklaus (2017-05-28). "Compiler Construction". Retrieved 2017-08-25.
  5. ^ Wirth, Niklaus (2017-08-18). "news.txt". Archived from the original on 2017-08-25. Retrieved 2017-08-25.

레퍼런스

외부 링크

  • 파스칼작성컴파일러바우 책의 초판 컴파일러(.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 어셈블러를 생성합니다)