컴파일러 설명 언어
Compiler Description Language이 글에는 여러 가지 문제가 있다.이 문제를 개선하거나 대화 페이지에서 토의하십시오.(이러한 템플릿 메시지를 제거하는 방법 및 시기 알아보기)
|
CDL(Compiler Description Language)은 apix 그래머를 기반으로 한 프로그래밍 언어다.백커스-나우르 양식(BNF) 표기법과 매우 유사하다.컴파일러 개발을 위해 설계되었다.그것은 그것의 능력과 통제 흐름에서 매우 제한적이며, 의도적으로 그렇게 한다.이러한 제한사항의 이점은 두 가지다.
한편으로는 CDL2 최적기에서 사용하는 정교한 데이터와 제어 흐름 분석을 가능하게 하여 매우 효율적인 코드를 만든다.또 다른 이점은 그들이 매우 장황한 명명 규칙을 조성한다는 것이다.이것은 결국, 상당히, 자기 문서화된 프로그램으로 이어진다.
그 언어는 프롤로그와 약간 닮았다. (두 언어가 모두 어패픽스 그래머에서 거의 동시에 생겨났기 때문에 이것은 놀라운 일이 아니다.)단, Prolog와 반대로 CDL의 제어 흐름은 성공/실패에 따라 결정적으로 결정적으로 결정된다. 즉, 현재 성공했을 때 다른 대안은 시도되지 않는다.이 아이디어는 표현 문법 파싱에도 사용된다.
CDL3는 CDL 언어의 세 번째 버전으로, 이전 두 버전과는 크게 다르다.
디자인
1971년 등장한 니메겐 대학의 코넬리스 H. A. 코스터가 디자인한 원판은 핵이 없다는 다소 특이한 개념을 갖고 있었다.일반적인 프로그래밍 언어 소스는 기계 지침이나 그러한 지침의 통조림 순서에 번역된다.그것들은 주어진 언어가 지원하는 가장 기본적인 추상적인 핵심을 나타낸다.그러한 원시적인 것들은 숫자의 추가, 서로 변수를 복사하는 것 등이 될 수 있다.CDL1에는 그런 핵심이 없다.전통적인 언어의 조립자나 컴파일러에 의해 기계지시로 전환될 수 있는 형태로 원시적인 조작을 제공하는 것은 프로그래머의 책임이다.CDL1 언어 자체는 원시적 개념도 없고, 기계어(스토리지의 추상 단위 - 꼭 그런 기계어일 필요는 없다)와 별도로 데이터 유형의 개념도 없다.평가 규칙은 백커스-나우르어 양식 구문 설명과 다소 유사하다. 사실 BNF에 기술된 언어에 대한 파서 작성은 CDL1에서 다소 간단하다.
기본적으로 언어는 규칙으로 구성된다.규칙은 성공할 수도 있고 실패할 수도 있다.규칙은 다른 규칙 호출의 시퀀스인 대안으로 구성된다.규칙은 그 대안이 성공한다면 성공한다; 이것들은 순서대로 시도된다.모든 규칙 개시가 성공하면 대안이 성공한다.언어는 운영자가 재귀 없이 평가 루프를 만들 수 있도록(최적화기가 동일한 효과를 달성하므로 CDL2에서는 이것이 엄격히 필요하지 않지만), 그렇지 않으면 재귀적 평가의 효율성을 높일 수 있는 일부 단축키를 제공하지만, 기본 개념은 위와 같다.문맥이 없는 문법 파싱에서 명백한 응용을 제외하고, CDL은 많은 제어 응용 프로그램들이 본질적으로 if-then 규칙들 중첩되어 있기 때문에 응용 프로그램들을 제어하는데도 잘 적합하다.
각 CDL1 규칙은 평가되는 동안 불특정 유형의 데이터에 대해 작동할 수 있다.이상적으로는 규칙이 성공하지 않는 한(실패에 대한 부작용 없음) 데이터를 변경해서는 안 된다.이는 이 규칙이 성공할 수 있지만 이를 실행하는 규칙은 여전히 실패할 수 있으므로, 이 경우 데이터 변경이 적용되지 않아야 한다.모든 데이터가 스택에 동적으로 할당되는 경우 위의 동작을 보장하는 것은 상당히 쉽다(메모리 집약적이다).그러나 정적인 데이터가 있을 때는 오히려 어렵다, 흔히 있는 일이다.CDL2 컴파일러는 매개변수(입력, 출력, 입출력)와 규칙 유형(실패할 수 있음: 테스트, 술어, 기능, 조치, 부작용: 술어, 작용, 부작용: 테스트, 기능)의 방향을 프로그래머가 지정해야 한다는 요구조건 덕분에 가능한 위반사항을 플래그할 수 있다..
규칙평가는 보다 간단하고 단순한 규칙을 부르는 것에 바탕을 두고 있기 때문에 밑바닥에는 실제 일을 하는 원시적인 규칙이 있어야 한다.그것이 바로 CDL1이 매우 놀라운 부분이다: 그것은 그러한 원시적인 요소들을 가지고 있지 않다.그 규칙들은 네가 직접 제공해야 해.프로그램에 추가가 필요하면 입력 파라미터 2개와 출력 파라미터 1개로 규칙을 만들어야 하며, 출력은 코드에 의한 입력 2개의 합으로 설정된다.CDL 컴파일러는 당신의 코드를 문자열로 사용하고(입출력 변수를 참조하는 방법에 관한 규약이 있다) 필요에 따라 간단히 방출한다.어셈블리를 사용하여 추가 규칙을 설명하면 CDL 컴파일러의 출력을 기계 코드로 변환할 수 있는 어셈블러가 필요하다.모든 원시 규칙(CDL 용어로 매크로)을 파스칼이나 C로 기술한다면, CDL 컴파일러 다음에 실행할 파스칼이나 C 컴파일러가 필요하다.이러한 핵심 원시성의 부족은 가장 간단한 기계 명령 작업에서도 코드 조각 하나를 써야 할 때 매우 고통스러울 수 있다.그러나 한편으로는 이국적인 추상적 객체에 작용하는 난해하고 추상적인 원시적 요소를 구현하는 데 큰 유연성을 준다(CDL의 '머신 워드'는 그곳에 저장된 데이터의 종류에 대한 언급이 없는 '데이터 스토리지의 단위'에 가깝다).또한, 대규모 프로젝트에서는 원시 형질의 세심하게 조작된 라이브러리를 사용했다.그런 다음, 이들은 각 대상 아키텍처와 OS에 대해 복제되어 모두를 위한 고효율 코드의 생성을 가능하게 했다.
이 언어에 대한 느낌을 얻기 위해 CDL2 설명서에서 채택한 작은 코드 조각:
ACTION quicksort + >from + >to -p -q: less+from+to, split+from+to+p+q, quicksort+from+q, quicksort+p+to; +. ACTION split + >i + >j + p> + q> -m: make+p+i, make+q+j, add+i+j+m, halve+m, (again: move up+j+p+m, move down+i+q+m, (less+p+q, swap item+p+q, incr+p, decr+q, *again; less+p+m, swap item+p+m, incr+p; less+m+q, 스왑 항목+q+m, decr+q; +)).Function move up + >j + >p> + >m: low+j+p; incr+p; incr+p, *. function move down + >i + >q> + low+q+j; decr+q, *. TEST lows+a:b:=a"function make+a>+>b:=a"="b.Function add+>a+>b+sum>:=sum"="a"+"b"b.Function halve+>a>:=a"/=2". Function incr+>a>:=a"+"+"기능 decr+>a>:=a"--"--""" 더 작은 항목+>i+>j:="items["i"]["j"]"ACTION 스왑 항목+>i+>j-t:=t"=items["i"];items["j"]=items["j"]="t". 원시 연산은 여기서 자바(또는 C)의 용어로 정의된다.이것은 완전한 프로그램이 아니다. 우리는 다른 곳에서 자바 어레이 항목을 정의해야 한다.
1976년에 등장한 CDL2는 CDL1의 원리를 지켰지만 대형 프로젝트에 적합한 언어를 만들었다.모듈을 도입하고, 데이터 변경만을 성공으로 시행하며, 언어의 기능을 다소 확장했다.CDL2 컴파일러와 특히 CDL2 Laboratory(CDL2용 IDE)에 있는 최적기는 단순히 시간만을 위한 것이 아니라 세계적인 수준이었다.CDL2 Laboratory Optimizer의 한 가지 특징은 거의 독특하다. 즉, 전체 프로그램을 하나의 컴파일로 취급하는 컴파일 단위 전체에 걸쳐 최적화를 수행할 수 있다는 것이다.
CDL3는 더 최근의 언어다.이전 CDL 버전의 오픈 엔드 기능을 포기했고, 기본 산술 및 저장 액세스에 원시성을 제공한다.이전 CDL 버전의 극히 청교도적인 구문(둘 다 한 자릿수로 실행되는 키워드와 기호의 수)도 완화되었다.일부 기본 개념은 현재 명시적인 의미론보다는 구문으로 표현된다.게다가, 데이터 타입이 언어에 도입되었다.
사용하다
The commercial mbp Cobol (a Cobol compiler for the PC) as well as the MProlog system (an industrial-strength Prolog implementation that ran on numerous architectures (IBM mainframe, VAX, PDP-11, Intel 8086, etc.) and OS-s (DOS/OS/CMS/BS2000, VMS/Unix, DOS/Windows/OS2)).특히 후자는 CDL2의 휴대성에 대한 증언이다.
CDL로 작성된 대부분의 프로그램이 컴파일러였지만, CDL로 개발·유지된 상용 GUI 애플리케이션은 적어도 한 개 있다.이 애플리케이션은 현재 DEXIS가 소유하고 있는 치과 이미지 획득 애플리케이션이었다.치과 관리 시스템도 CDL로 개발된 적이 있다.
메피스토 3세 체스 컴퓨터의 소프트웨어는 CDL2로 작성되었다.[1]
참조
- ^ Nitsche, Thomas (1984). "Das Mephisto 3-Projekt". Schach-Echo (7/1984). Retrieved 1 April 2016.
추가 읽기
- CDL1 / CDL2 언어에 대한 책
- CDL3에 대한 설명
- Bedő Arpád: Programkészii Modszerek; Közazdasagi és Jogi Könyvkiado, 1979.ISBN 963-220-760-2