컴파일러 컴파일러
Compiler-compiler컴퓨터 과학에서 컴파일러 또는 컴파일러 생성기는 프로그래밍 언어와 머신의 형식적인 기술로부터 파서, 인터프리터 또는 컴파일러를 만드는 프로그래밍 도구입니다.
컴파일러의 가장 일반적인 타입은 파서 제너레이터라고 불립니다.구문 분석만 처리합니다.
파서 제너레이터의 입력은 문법 파일입니다.일반적으로 타겟프로그래밍 언어의 구문을 정의하는 Backus-Naur 형식(BNF) 또는 Extended Backus-Naur 형식(EBNF)으로 기술됩니다.
출력은 프로그래밍 언어의 파서의 소스 코드입니다.(컴파일된) 파서 소스 코드의 출력은 파서입니다.스탠드아론일 수도 있고 임베디드일 수도 있습니다.이 파서는 대상 프로그래밍 언어 소스의 소스 코드를 입력으로 받아 몇 가지 액션을 수행하거나 추상 구문 트리(AST)를 출력합니다.
파서 생성기는 AST의 의미론이나 대상 [1]머신의 머신 코드 생성을 처리하지 않습니다.
메타 컴파일러는 주로 다른 프로그래밍 [2]언어용 컴파일러, 번역자 및 인터프리터 구성에 사용되는 소프트웨어 개발 도구입니다.메타 컴파일러에 대한 입력은 주로 [2][3]컴파일러 구축을 목적으로 설계된 전문 프로그래밍 메타 언어로 작성된 컴퓨터 프로그램입니다.생성된 컴파일러의 언어를 객체 언어라고 합니다.컴파일러를 생성하는 최소 입력은 객체 언어 문법과 객체 [3][4]프로그램으로의 의미 변환을 지정하는 메타프로그램입니다.
변종
일반적인 파서 생성기는 이러한 규칙이 파서에 의해 적용될 때 실행해야 하는 문법의 각 규칙과 실행 가능한 코드를 관련짓습니다.이러한 코드 조각은 파서에 의해 분석되는 구문 구조의 의미론을 정의하기 때문에 의미론 액션 루틴이라고 불리기도 합니다.생성되는 파서의 유형에 따라 이러한 루틴은 구문 분석 트리(또는 추상 구문 트리)를 구성하거나 실행 가능한 코드를 직접 생성할 수 있습니다.
컴파일러-컴파일러의 최초(1964년) 버전 중 하나는 META II입니다.META II는 스택 머신 코드를 생성하는 출력 설비를 갖춘 분석 문법을 받아들여 독자적인 소스 코드와 다른 언어를 컴파일할 수 있습니다.
Bell Labs에서 만들어진 최초의 Unix 버전 프로그램 중 가장 오래된 것은 2부분의 lex와 yacc 시스템이었다. 이것은 보통 C 프로그래밍 언어 코드를 출력하는 데 사용되었지만 프로그래밍 언어에서 텍스트 파일 변환에 이르기까지 모든 것에 사용할 수 있는 유연한 출력 시스템을 가지고 있었다.최신 GNU 버전은 플렉스와 바이슨입니다.
일부 실험 컴파일러-컴파일러는 프로그래밍 언어 시멘틱스의 형식적인 설명을 입력으로 받아들입니다.일반적으로 국부적 시멘틱스를 사용합니다.이 접근법은 종종 '의미학 기반 컴파일'이라고 불리며,[5] 1978년 피터 모시스의 SIS(Semantic Implementation System)에 의해 개척되었다.그러나 생성된 컴파일러와 생성된 코드 모두 시간과 공간 면에서 비효율적이었다.현재 이러한 방식으로 구축된 프로덕션 컴파일러는 없지만 연구는 계속되고 있습니다.
Carnegie Mellon 대학의 Production Quality Compiler-Compiler(PQCC) 프로젝트는 시멘틱스를 공식화하지 않지만 기계 기술을 위한 준정식 프레임워크를 가지고 있습니다.
컴파일러는 코드 생성의 리라이트 문법에 따라 구문 트리를 타일링하는 데 사용되는 상향식 리라이트 머신 생성기(JBurg 참조) 및 속성 문법 파서 생성기(예를 들어 ANTLR을 사용하여 동시 유형 검사, 지속적인 전파 등을 수행할 수 있습니다).
메타 컴파일러
메타 컴파일러는 오브젝트 언어에 관계없이 동일한 측면을 자동화함으로써 컴파일러 작성 작업을 줄입니다.이것에 의해, 특정의 문제의 사양에 적절한 도메인 고유의 언어를 설계할 수 있습니다.메타 컴파일러는 이러한 도메인 고유의 오브젝트 언어에 대한 번역자 제작 비용을 절감하여 문제 해결에 도메인 [3]고유의 언어 설계를 포함시키는 것이 경제적으로 실현 가능하게 됩니다.
메타 컴파일러의 메타 언어는 대개 강력한 문자열 및 기호 처리 언어이기 때문에 다양한 소프트웨어 엔지니어링 [3][6]및 분석 도구를 생성하는 등 범용 애플리케이션에 강력한 응용 프로그램을 사용하는 경우가 많습니다.
메타 컴파일러는 도메인 고유의 언어 개발에 유용할 뿐만 아니라 컴파일러 쓰기 도메인에 맞게 설계된 도메인 고유의 언어의 대표적인 예입니다.
메타컴파일러는 보통 메타프로그래밍 또는 기존 컴퓨터 프로그래밍 언어로 작성된 메타프로그래밍입니다.메타 컴파일러는 자체 메타 언어로 작성되며, 자체 컴파일러를 컴파일하는 과정은 자체 호스트 컴파일러와 동일합니다.오늘날 일반적으로 사용되는 컴파일러는 셀프호스트 컴파일러입니다.셀프호스팅은 많은 메타 컴파일러의 강력한 도구이며, 자체 메타프로그래밍 메타 언어를 쉽게 확장할 수 많은 메타 컴파일러가 있습니다.메타컴파일러를 다른 컴파일러와 구별하는 기능은 컴파일러의 모든 조작을 설명하는 특수한 메타프로그래밍 언어를 입력으로 사용한다는 것입니다.메타컴파일러에 의해 생성되는 메타프로그래밍은 C++, BASIC 또는 기타 일반 프로그래밍 언어로 작성된 프로그램만큼 완전한 프로그램입니다.메타프로그래밍 메타언어는 컴퓨터 프로그래밍 언어 및 기타 컴퓨터 도구를 쉽게 개발할 수 있는 강력한 속성입니다.메타 컴파일러의 메타프로그래밍 메탈랭귀지를 사용하여 명령줄 프로세서, 텍스트 문자열 변환 및 분석을 쉽게 코드화할 수 있습니다.
풀기능 개발 패키지에는 링커와 런타임 지원 라이브러리가 포함되어 있습니다.일반적으로 지원 라이브러리를 작성하려면 C 또는 C++와 같은 기계 지향 시스템 프로그래밍 언어가 필요합니다.컴파일 프로세스에 필요한 지원 기능으로 구성된 라이브러리는 보통 완전한 메타 컴파일러 패키지를 완성합니다.
메타컴파일러의 의미
컴퓨터 과학에서 접두어 메타는 일반적으로 (자신의 범주)를 의미하기 위해 사용됩니다.예를 들어 메타데이터는 다른 데이터를 설명하는 데이터입니다.다른 언어를 설명하는 데 사용되는 언어는 메타 언어이다.메타는 더 높은 수준의 추상화를 의미할 수도 있습니다.메타언어는 언어의 속성을 설명하기 위해 더 높은 수준의 추상화에서 작동합니다.Backus-Naur 형식(BNF)은 원래 ALGOL 60을 정의하기 위해 사용된 형식 메타 언어입니다.BNF는 구문만 기술하고 의미나 의미에 대해서는 언급하지 않기 때문에 약한 메타 언어입니다.메타프로그래밍은 프로그램을 데이터로 취급할 수 있는 능력을 가진 컴퓨터 프로그램을 작성하는 것입니다.메타컴파일러는 메타프로그래밍을 [3][4]위해 특별히 설계된 전문 메탈랭귀지(고급 추상화)로 작성된 메타프로그래밍을 입력으로 받아들인다.출력은 실행 가능한 개체 프로그램입니다.
유추는 다음과 같습니다.C++ 컴파일러가 C++ 프로그래밍 언어 프로그램을 입력으로 받아들이듯이 메타 컴파일러는 메타프로그래밍 메타언어 프로그램을 입력으로 받아들인다.
네 번째 메타 컴파일러
이 섹션의 톤 또는 스타일은 Wikipedia에서 사용되는 백과사전 톤을 반영하지 않을 수 있습니다. 은 Wikipedia의 를 (2015년 8월 (이 메시지 및 ) |
Forth 언어의 많은 지지자들은 Forth의 새로운 구현을 만드는 과정을 메타 컴파일러라고 부르며 메타 컴파일러를 구성한다.메타 컴파일러의 네 번째 정의는 다음과 같습니다.
- 메타컴파일러는 자체 소스 코드를 처리하여 실행 가능한 버전을 생성하는 컴파일러입니다.
메타 컴파일러라는 용어의 네 번째 사용은 주류 컴퓨터 과학에서 논란이 되고 있습니다.Fourth(프로그래밍 언어) 및 컴파일러 구성의 역사를 참조하십시오.실제 Fourth 프로세스는 Fourth가 자기 호스팅 확장 가능한 프로그래밍 언어이며, 때로는 컴퓨터 과학에서 오랫동안 확립된 용어인 크로스 컴파일을 조합한 것입니다.compilation)의 조합입니다.메타 컴파일러는 일반적인 컴파일러 쓰기 시스템입니다.Fourth 메타 컴파일러의 개념은 자기 호스팅 및 확장 가능한 언어와 구별되지 않습니다.실제 프로세스는 네 번째 단어의 최소 서브셋을 정의하는 하위 레벨에서 작동합니다.이 하위 서브셋은 추가 네 번째 단어를 정의하는 데 사용할 수 있으며, 그 다음 기본 집합에서 전체 네 번째 구현을 정의할 수 있습니다.부트스트랩 프로세스처럼 들리는데요.문제는 거의 모든 범용 언어 컴파일러가 Forth 메타 컴파일러의 설명과 일치한다는 것입니다.
- (셀프 호스팅 컴파일러) X가 자체 소스 코드를 처리하여 실행 가능한 버전의 X를 생성하는 경우 X는 메타 컴파일러입니다.
X를 공통 언어인 C, C++, Pascal, COBOL, Fortran, Ada, Modula-2 등으로 대체하기만 하면 됩니다.그리고 X는 메타 컴파일러의 포스 사용법에 따라 메타 컴파일러가 됩니다.메타 컴파일러는 컴파일하는 컴파일러보다 높은 추상화 수준에서 동작합니다.컴파일 할 때 같은 레벨(셀프호스팅 컴파일러)에서만 동작합니다.이 메타컴파일러 정의의 문제를 파악해야 합니다.그것은 대부분의 언어에 적용될 수 있다.
그러나 포스에서의 프로그래밍 개념을 검토하면서 사전에 새로운 단어를 추가하는 것은 메타프로그래밍입니다.Fourth의 메타프로그래밍이 메타컴파일러를 만듭니다.
포스에서의 프로그래밍은 언어에 새로운 단어를 추가하는 것이다.이런 식으로 언어를 바꾸는 것이 메타프로그래밍입니다.포스는 메타프로그래밍용으로 특별히 설계된 언어이기 때문에 포스는 메타컴파일러입니다.Fourth의 프로그래밍은 Fourth 어휘에 단어를 추가하여 새로운 Fourth 방언을 만듭니다.Fourth는 Fourth 언어 방언에 특화된 메타 컴파일러입니다.
역사
이 이름을 사용한 최초의 컴파일러는 1960년 토니 브루커에 의해 작성되었으며 아틀라스 오토코드 [citation needed]컴파일러를 포함한 맨체스터 대학의 아틀라스 컴퓨터용 컴파일러를 만드는 데 사용되었다.
메타 컴파일러의 초기 역사는 구문 기반 컴파일러에 관한 SIG/PLAN 작업 그룹 1의 역사와 밀접하게 관련되어 있습니다.이 그룹은 주로 로스앤젤레스 [7]지역에서 하워드 멧칼프의 노력으로 시작되었다.1962년 가을에 하워드 멧칼프는 두 명의 컴파일러 작문 통역기를 설계했다.하나는 Ledley와 [8]Wilson이 설명한 방법에 기초한 Bottom-to-Top 분석 기법을 사용했다.다른 하나는 글래니의 연구에 기초한 위에서 아래로 접근하여 문맥이 없는 [9]문법에서 임의의 영어 문장을 생성했다.
동시에 Val Schore는 두 개의 "메타 기계"를 설명했는데, 하나는 생성 기계이고 하나는 분석 기계입니다.생성 기계는 구현되어 랜덤 대수식을 생성했다.Meta I 최초의 메타 컴파일러는 1963년 1월 쇼레에 의해 UCLA에서 IBM 1401에 구현되었습니다.그의 원래 통역사와 메타머신은 의사 기계 언어로 직접 쓰여졌다.그러나 META II는 자체 컴파일을 의사 기계 [10][11][12]언어로 기술할 수 있는 상위 수준의 메타 언어로 작성되었다.
볼트, 베라넥, 뉴먼의 리 슈미트는 1963년 3월 시분할 PDP-l의 [13]CRT 디스플레이를 이용한 메타 컴파일러를 작성했다.이 컴파일러는 해석 코드 대신 실제 머신 코드를 생성했으며 부분적으로 Meta [citation needed]I에서 부트스트랩되었습니다.
쇼레는 1963년 봄에 Meta I에서 Meta II를 부트스트랩했습니다.1964년 필라델피아 ACM 컨퍼런스에서 발표된 개량된 메타 컴파일러 시스템에 관한 논문은 메타 컴파일러에 관한 일반 참고 자료로 이용 가능한 최초의 논문입니다.쇼레 시스템의 구문과 구현 기법은 이후의 대부분의 시스템의 토대를 마련했습니다.이 시스템은 작은 1401에 구현되었으며 작은 ALGOL과 같은 [citation needed]언어를 구현하기 위해 사용되었습니다.
많은 유사한 시스템이 즉시 [citation needed]뒤따랐다.
AC Delco의 Roger Rutman은 1964년 [14]1월 IBM 7090에서 논리 설계 시뮬레이션을 위한 언어인 LOGIK를 개발하고 구현했습니다.이 컴파일러는 부울식을 [citation needed]위해 효율적인 코드를 생성하는 알고리즘을 사용했습니다.
1964년 ACM 절차의 또 다른 논문은 IBM 7090을 [15]위해 UCLA의 Schneider와 Johnson이 개발한 Meta III에 대해 설명합니다.Meta III는 많은 언어 클래스에 대해 효율적인 기계 코드를 생성하려는 시도를 나타냅니다.Meta III는 완전히 어셈블리 언어로 구현되었습니다.두 개의 컴파일러, 컴파일러 쓰기 데모 컴파일러인 CODOL과 ALGOL 60의 방언인 PUREGOL로 작성되었다. (알골이라고 부르는 것은 순수한 갈이었다.)
1964년 후반, Lee Schmidt는 메타 컴파일러 EQGEN을 PDP-l에서 Beckman 420으로 부트스트랩했습니다.EQGEN은 언어를 생성하는 논리 방정식이었다.
1964년 System Development Corporation은 메타 컴파일러 개발에 큰 노력을 기울였습니다.이 작업에는 Lisp로 작성된 강력한 메타 컴파일러, Bookl 및 Book2가 포함되어 있으며 광범위한 트리 검색 및 백업 기능을 갖추고 있습니다.SDC의 Q-32 시스템 중 하나가 Meta [16]5입니다.Meta 5 시스템은 입력 스트림의 백업 및 컨텍스트에 민감한 언어를 해석하기에 충분한 기타 기능을 포함합니다.이 시스템은 성공적으로 많은 사용자에게 출시되었으며 컴파일 이외의 많은 문자열 조작 애플리케이션을 가지고 있었습니다.여기에는 많은 정교한 푸시다운스택, 속성 설정 및 테스트 기능, 출력 메커니즘이 있습니다.Meta 5는 JOVICAL 프로그램을 PL/I 프로그램으로 변환하는 데 성공함으로써 그 힘과 유연성을 입증하고 있습니다.
Texas Instruments의 Robert McClure는 TMG라는 컴파일러를 발명했습니다(1965년 발표).TMG는 B, PL/I 및 ALTRAN과 같은 프로그래밍 언어를 위한 초기 컴파일러를 만드는 데 사용되었습니다.발 쇼레의 메타콤파일러와 함께, 이것은 도널드 크누스의 컴퓨터 프로그래밍 [17]기술의 마지막 장에 대한 초기 영감이었습니다.
LOT 시스템은 1966년 스탠포드 연구소에서 개발되었으며 메타 [18]II를 매우 가깝게 본떠 만들어졌다.이것은 새로운 특수 목적의 구조를 가지고 있어서 PL/I의 서브셋을 컴파일할 수 있는 컴파일러를 생성할 수 있었다.이 시스템은 광범위한 통계 수집 시설을 가지고 있으며 하향식 분석의 특성을 연구하는 데 사용되었다.
SIMPLE은 PL/I용 프리프로세서를 쉽게 쓸 수 있도록 설계된 전문 번역기 시스템입니다.SIMPLE은 PL/I로 작성되며 다음 3가지 컴포넌트로 구성되어 있습니다.임원, 구문 분석기 및 의미 생성자.[19]
TREE-META 컴파일러는 캘리포니아 멘로 파크의 스탠포드 연구소에서 개발되었습니다.1968년 4월초기 메타 컴파일러 이력은 TREE META 매뉴얼에 잘 설명되어 있습니다.TREE META는 SDC 개발의 일부와 병행하고 있습니다.이전의 메타 컴파일러와 달리 구문 처리에서 의미 처리를 분리했습니다.구문 규칙에는 인식된 언어 요소를 트리 노드와 결합하는 트리 구축 작업이 포함되어 있습니다.그런 다음 입력의 트리 구조 표현은 단순한 형식의 구문 분석 규칙에 의해 처리되었습니다.unparse 규칙에서는 노드 인식 및 속성 테스트를 사용하여 일치하면 관련 액션이 수행됩니다.또한 트리 요소도 비파스 규칙으로 테스트할 수 있습니다.언파스 규칙은 언파스 규칙의 액션이 실행되기 전에 트리의 요소를 통과하는 언파스 규칙을 호출할 수 있는 재귀 언어이기도 합니다.
글래니가 원래 제시한 메타머신의 개념은 매우 단순해서 세 가지 하드웨어 버전이 설계되고 한 가지 버전이 실제로 구현되었습니다.후자는 St. Washington University의 St.루이스, 이 기계는 매크로 모듈러 부품으로 만들어졌고 쇼레에 의해 기술된 코드들을 가지고 있어요
CWIC(Compiler for Writing and Implementing Compiler)는 마지막으로 알려진 쇼레 메타 컴파일러입니다.이 알고리즘은 Systems Development Corporation에서 Erwin Book, Dewey Val Schorre 및 Steven J. Sherman에 의해 개발되었습니다. (lisp 2)의 모든 기능을 통해 목록 처리 언어 최적화 알고리즘은 코드 생성 전에 구문 생성 목록 및 트리에서 작동할 수 있습니다.CWIC에는 또한 언어에 기호 표가 내장되어 있었다.
도메인 고유의 언어가 부활하고 사용하기 쉽고 이해하기 쉬우며 유지보수가 용이한 파서 생성기가 필요함에 따라 메타 컴파일러는 고급 소프트웨어 엔지니어링 프로젝트에서 중요한 도구가 되고 있습니다.
yacc 정맥의 파서 생성기의 다른 예로는 ANTLR, Coco/R,[20] CUP,[citation needed] GNU Bison, Eli,[21] FSL,[citation needed] SableCC, SID(Syntax Impending Device)[22] 및 JavaCC가 있습니다.순수 파서 생성기는 유용하지만 컴파일러 구축 문제의 구문 분석 부분만 처리합니다.PQCC, Coco/R 및 DMS Software Reengineering Toolkit과 같은 광범위한 도구는 의미 분석, 코드 최적화 및 생성과 같은 보다 어려운 파싱 후 작업을 상당히 지원합니다.
쇼레 메탈랭귀지
최초의 쇼레 메타 컴파일러인 META I과 META II는 D에 의해 개발되었습니다.UCLA의 Val Schorre입니다.다른 쇼레 기반의 메타 컴파일러도 그 뒤를 이었다.각각 언어 분석 및/또는 코드 생성 기능이 향상되었습니다.
프로그래밍에서는 컴파일러와 프로그래밍 언어, 즉 의미를 구별하는 컨텍스트를 모두 참조하기 위해 프로그래밍 언어 이름을 사용하는 것이 일반적입니다.C++ 프로그램은 C++ 컴파일러를 사용하여 컴파일됩니다.그것은 다음에도 적용된다.예를 들어 META II는 컴파일러이자 언어입니다.
메타 컴파일러의 쇼레 라인의 메탈랭귀지는 출력 변환 구조가 내장된 하향식 문법 분석 구문 방정식을 사용하는 함수 프로그래밍 언어입니다.
구문 방정식:
<name> = <바디>;
는 성공 또는 실패를 반환하는 컴파일된 테스트 함수입니다.<name>은 함수 이름입니다.<body>는 그룹화 가능한 테스트, 대체 테스트 및 출력 프로덕션으로 구성된 논리 표현 형식입니다.시험은 다른 언어에서 성공이 진실이고 실패가 거짓인 부울과 같다.
하향식 프로그래밍 언어를 해석적으로 정의하는 것은 자연스러운 일입니다.예를 들어 프로그램은 다음과 같이 정의할 수 있습니다.
프로그램 = $communications;
프로그램을 0 이상의 선언 시퀀스로 정의합니다.
Schorre META X 언어에는 운전 규칙이 있습니다.위의 프로그램 규칙은 운전 규칙의 예입니다.프로그램 규칙은 성공 또는 실패를 반환하는 테스트 규칙인 선언을 호출하는 테스트 함수입니다.$loop 연산자는 장애가 반환될 때까지 선언을 반복적으로 호출합니다.$ 연산자는 선언이 0인 경우에도 항상 성공합니다.위의 프로그램은 항상 성공을 가져다 줄 것이다.(CWIC에서는 장시간 장애는 선언을 바이패스할 수 있습니다.장기 실패는 CWIC의 역추적 시스템의 일부입니다).
이러한 초기 컴파일러의 문자 집합은 제한되었습니다./ 문자가 대체 연산자에 사용되었습니다."A 또는 B"는 A/B로 표기됩니다. 괄호()는 그룹화에 사용됩니다.
A(B/C)
A 뒤에 B 또는 C가 이어지는 구조에 대해 설명합니다.부울식으로는 다음과 같습니다.
A 및 (B 또는 C)
시퀀스 X Y는 X와 Y의 의미를 내포하고 있습니다. ( )는 그룹화 및/또는 연산자입니다.평가 순서는 테스트 순서에 따라 입력 문자 시퀀스가 지정되므로 항상 왼쪽에서 오른쪽으로 지정됩니다.
첫 글자가 "."인 특수 연산자 단어는 명확성을 위해 사용됩니다.EMTIFY는 이전 대체가 필요하지 않은 경우 마지막 대체로 사용됩니다.
X (A / B / )비어 있음)
옵션에서 X 뒤에 A 또는 B가 이어지는 것을 나타냅니다.이것은 프로그래밍 언어라는 이러한 언어들의 특별한 특징입니다.상기에 의해 역추적이 회피됩니다.다른 컴파일러 컨스트럭터 시스템은 세 가지 가능한 시퀀스를 선언하고 파서에게 그것을 알아내도록 맡길 수 있습니다.
위의 메타프로그래밍 메탈랭귀지의 특성은 모든 쇼레 메타컴파일러와 그것들로부터 파생된 메타컴파일러에게 공통적입니다.
메타I
META I은 META II 컴파일러를 컴파일하기 위해 사용되는 수동 컴파일 메타 컴파일러입니다. META II의 초기 컴파일러가 손으로 코드화된 META I 컴파일러와 거의 동일한 코드를 생성했다는 것 외에는 META I에 대해 알려진 것이 거의 없습니다.
메타II
각 규칙은 선택적으로 테스트, 연산자 및 출력 프로덕션으로 구성됩니다.규칙은 성공 또는 실패를 반환하는 입력 프로그램 원본 문자 스트림의 일부와 일치하려고 시도합니다.성공하면 입력이 일치하는 문자보다 우선됩니다.장애 발생 시 입력이 진행되지 않습니다.
출력 프로덕션에서는 구문 규칙에서 직접 어셈블리 코드 형식을 생성했습니다.
트리메타
TREY-META 에서는 출력 생산 변환을 파싱되지 않은 규칙으로 이동하는 트리 구축 연산자:<node_name> 및 [<number>]가 도입되었습니다.트리 구축 연산자는 입력을 추상 구문 트리로 직접 변환하는 문법 규칙에서 사용되었습니다.해석 해제 규칙은 트리 패턴과 일치하는 테스트 함수이기도 합니다.구문 취소 규칙은 추상 구문 트리가 출력 코드로 변환될 때 문법 규칙에서 호출됩니다.추상 구문 트리와 구문 분석 규칙을 구축하면 구문 분석 트리를 분석하여 로컬 최적화를 수행할 수 있습니다.
출력 생산을 비파스 규칙으로 이동함으로써 문법 분석과 코드 생성을 명확하게 분리할 수 있었다.이것은 프로그래밍을 읽고 이해하기 쉽게 만들었다.
CWIC
1968~1970년, 어윈 북, 듀이 발 쇼레, 스티븐 J. 셔먼은 시스템 개발 회사 찰스 배비지 정보 기술사 센터(박스 12, 폴더 21)에서 CWIC([3]컴파일러 작성 및 구현용 컴파일러)를 개발했습니다.
CWIC는 3개의 특수 목적의 도메인 고유의 언어로 구성된 컴파일러 개발 시스템입니다.각 언어에서는 번역의 특정 측면을 알기 쉽게 기술할 수 있습니다.구문 언어는 소스 텍스트의 인식과 중간 트리 구조에 대한 구성을 설명하는 데 사용됩니다.생성기 언어는 트리의 적절한 객체 언어로 변환을 설명하는 데 사용됩니다.
구문 언어는 Dewey Val Schorre의 이전 메타 컴파일러 라인을 따릅니다.구문 언어에 트리 구축 연산자가 있는 TREE-META와 가장 유사합니다.TREE-META의 unparse 규칙은 LISP 2에 기반한 객체 기반 생성기 언어에서 작동하도록 확장되었습니다.
CWIC에는 다음 3가지 언어가 있습니다.
- 구문: 소스 프로그램 입력을 문법 변환 공식을 사용하여 목록 구조로 변환합니다.해석된 식 구조는 생성기 호출을 규칙 내에 배치함으로써 생성기에 전달된다.트리는 첫 번째 요소가 노드 오브젝트인 리스트로 나타납니다.언어에는 목록 작성 전용 연산자 <와 >가 있습니다.colon : 연산자는 노드 오브젝트를 작성하는 데 사용됩니다. : ADD는 ADD 노드를 만듭니다.! 연산자는 다수의 해석된 엔트리를 노드와 결합하여 트리를 만듭니다.구문 규칙에 의해 작성된 트리는 생성기 함수에 전달되어 성공 또는 실패를 반환합니다.구문 언어는 TREY-META에 매우 가깝습니다.둘 다 콜론을 사용하여 노드를 만듭니다.CWIC의 트리 빌드!<number>는 TREY-META의 [<number>]와 같은 기능을 합니다.
- 제너레이터: 변환 규칙의 명명된 시리즈.각각은 LISP2와 같은 언어로 작성된 언파스, 패턴 매칭, 규칙 및 출력 생성으로 구성됩니다.IBM 360 바이너리 머신 코드로 변환했습니다.제너레이터 언어의 다른 기능은 [3]출력을 일반화했습니다.
- MOL-360: 1968년에 개발되어 기본 지원 라이브러리를 작성하는 데 사용되는 IBM System/360 컴퓨터 제품군용 독립 중간 수준 구현 언어입니다.
생성자 언어
생성기 언어는 리스프와 유사한 의미를 가지고 있습니다.구문 분석 트리가 재귀 목록으로 간주되었습니다.제너레이터 언어 함수의 일반적인 형식은 다음과 같습니다.
function-name(first-unparse_rule) => first-production_code_rule(second-unparse_rule) => second-production_code_rule(second-unparse_rule) => third-production_code_rule...
특정 트리를 처리하는 코드에는 범용 프로그래밍 언어의 특징과 출력 파일에 출력되는 형식인 <stuff>가 포함되어 있습니다.제너레이터 콜은 unparse_rule에서 사용할 수 있습니다.제너레이터가 배치되어 있는 unparse_rule 패턴의 요소가 전달되고 반환 값이()에 나열됩니다.예를 들어 다음과 같습니다.
expr_gen(ADD[expr_gen(x), expr_gen(y)]) => <AR + (x*16)+y;> releasereg(y); (SUB[expr_gen(x), expr_gen(y)])=> <SR + (xpr_16)+y> release(y;)>return x; (MUL[expr_gen(x), expr_gen(y)]=> . (x)=> r1 = getreg(); load(r1, x); r1;...
즉, 해석 트리가 (ADD[<something1>, <something2>)와 같은 경우 expr_gen(x)은 <something1>과 함께 호출되어 x를 반환합니다.unparse 규칙의 변수는 production_code_generator에서 사용할 수 있는 로컬 변수입니다.expr_gen(y)은 <something2>와 함께 호출되어 y를 반환합니다.다음으로 비파스 규칙의 제너레이터 콜이 점유하는 위치에서 요소를 통과합니다.위의 x와 y는 반송 시 등록되기를 바랍니다.마지막 변환은 아토믹을 레지스터에 로드하고 레지스터를 반환하는 것을 목적으로 합니다.첫 번째 생산은 일반 레지스터에서 적절한 값을 사용하여 360 "AR"(Add Register) 명령을 생성하는 데 사용됩니다.위의 예는 제너레이터의 일부일 뿐입니다.모든 제너레이터 표현식은 다음 처리되는 값으로 평가됩니다.마지막 변환은 다음과 같이 작성될 수 있습니다.
(x)=> 리턴로드(getregload x);
이 경우 load는 첫 번째 파라미터인 getreg()에 의해 반환되는 레지스터를 반환합니다.load 및 getreg 함수는 다른 CWIC 생성기입니다.
CWIC는 도메인 고유의 언어라는 용어가 존재하기 전에 도메인 고유의 언어에 대응했습니다.
CWIC 작성자:
메타컴파일러는 창조적이지 않은 측면, 즉 생성된 컴파일러가 번역하는 언어에 관계없이 동일한 측면을 자동화함으로써 컴파일러 구축 작업을 지원합니다.이것에 의해, 특정의 문제의 사양에 적절한 언어의 설계가 가능하게 됩니다.이러한 언어의 프로세서 생산 비용을 절감하여 언어 설계 [3]문제 해결을 경제적으로 시작할 수 있게 되었습니다."
예
- 앤티엘
- GNU 바이슨
- Coco/R, Coco-2[20]
- DMS Software Reengineering Toolkit, 파서 생성기가 있는 프로그램 변환 시스템
- 입실론 그래머 스튜디오
- 레몬 파서 발생기
- LRStar: LR(*) 파서 제너레이터
- 메타II
- 파서를 빌드하기 위한 Java 라이브러리인 parboiled.
- 패커트 파서
- PackCC, 좌측 재귀 지원을 포함한 Packrat 파서.
- PQCC는 파서 제너레이터 이상의 컴파일러입니다.
- 구문 개선 장치(SID)
- SYNATS, 컴파일러 구성용 통합 도구 세트입니다.
- 트리메타
- 야카
- Xtext
- XPL
- 자바CC
「 」를 참조해 주세요.
레퍼런스 및 메모
- ^ "A Syntax Directed Compiler for ALGOL 60" Edgar T.다리미, ACM 제4권 제1호, 1961년 1월
- ^ a b 메타 컴파일러: (컴퓨터 사이언스) 다른 프로그래밍 언어용 컴파일러를 구성하는 데 주로 사용되는 컴파일러입니다."Sci-Tech Dictionary McGraw-Hill Dictionary of Scientific and Technical Terms, 6th edition". McGraw-Hill Companies. Archived from the original on 2018-04-07. Retrieved 2018-04-07.
- ^ a b c d e f g h Book, Erwin; Dewey Val Schorre; Steven J. Sherman (June 1970). "The CWIC/36O system, a compiler for writing and implementing compilers". ACM SIGPLAN Notices. 5 (6): 11–29. doi:10.1145/954344.954345. S2CID 44675240.
- ^ a b C. 스티븐 카, 데이비드 A.Luther, Sherian Erdmann, TREE-META 컴파일러 시스템: Univac 1108 및 General Electric 645용 Meta 컴파일러 시스템, 유타 대학 기술 보고서 RADC-TR-69-83.
- ^ Peter Mosses, "SIS: 표시적 의미론을 사용하는 컴파일러-제너레이터 시스템", 보고서 78-4-3, 덴마크 오르후스 대학 컴퓨터과학부, 1978년 6월
- ^ Wayback Machine에 보관된 2018-03-18 컴포넌트를 사용한 J. M. Software Constructions at the Components at the Wayback Machine.테크니컬 리포트 160, 캘리포니아 대학교 어바인, 1980.
- ^ Howard Metcalfe, "A Parameterized Compiler Based Based Based Mechanical Language" Planning Research Corporation R-311, 1963년 3월 1일, 또한 자동 프로그래밍 연차 리뷰, Vol.4
- ^ 로버트 레들리와 J. B.Wilson, "Automatic Programming, Syntactical Analysis에 의한 언어 번역", 컴퓨터 기계 협회 통신, 제5권, No. 3 페이지 145-155, 1962년 3월.
- ^ A. E. Glennie, "구문 기계와 범용 컴퓨터의 구축에 대하여", 기술 보고서 번호 2, AD 240-512, 계산 센터, 카네기 공과대학, 1960.
- ^ Schorre, D. V., META II는 구문지향 컴파일러 언어, 1964년 제19회 ACM 전국회의 속행, 페이지 41.301-41.3011, 1964
- ^ Dewey, Val Schorre (1963). "A Syntax – Directed SMALGOL for the 1401". ACM National Conference, Denver, Colorado.
- ^ Meta I은 1963년 콜로라도 ACM 회의에서 주어진 논문에 설명되어 있습니다.SMALGOL 참조.
- ^ L. O. Schmidt, "The Status Bitt ACM SegPlan "프로그래밍 언어에 관한 특별 이익 그룹" 워킹 그룹 1 뉴스 레터, 1964.
- ^ 로저 러트먼, "LOGIK"Syntax Directed Compiler for Computer Bit-Time Simulation", 마스터 논문, UCLA, 1964년 8월.
- ^ F. W. Schneider 및 (G. D. Johnson, "구문 지향 컴파일러 쓰기, 효율적인 코드 생성을 위한 컴파일러", 제19회 컴퓨터 협회 전국회의 진행, 1964년
- ^ D. 오펜하임과 D.Hagerty, "META 5: 데이터 문자열을 조작하는 도구", 제21회 컴퓨터 협회 전국회의 진행, 1966년.
- ^ Knuth, Donald (1990). P. Deransart; M. Jourdan (eds.). "The Genesis of Attribute Grammars" (PDF). Proceedings of the International Conference on Attribute Grammars and Their Applications (Paris, France). Lecture Notes in Computer Science. New York: Springer-Verlag. 461: 1–12. CiteSeerX 10.1.1.105.5365. doi:10.1007/3-540-53101-7_1. ISBN 978-3-540-53101-2. Archived (PDF) from the original on 2020-11-23. Retrieved 2020-02-06.
- ^ 찰스 R.커클리와 존스 F.Rulifson, "구문지향적 컴파일링의 LOT 시스템", 스탠퍼드 연구소 내부 보고서 ISR 187531-139, 1966.
- ^ 조지 J. E. (1967a)Stanford Linear Accelerator Center, 구문 분석기, 인식기, 파서 및 의미 해석 시스템, 1967년 11월 15일.
- ^ a b Rechenberg, Peter; Mössenböck, Hanspeter (1985). Ein Compiler-Generator für Mikrocomputer - Grundlagen, Anwendungen, Programmierung in Modula-2 (in German) (1 ed.). Munich, Germany: Carl Hanser Verlag. ISBN 3-446-14495-1. (NB. 이 책은 모듈라-2의 코코 구조를 기술하고 있습니다.)
- ^ Robert W. Gray 등, 「Eli: 완전하고 유연한 컴파일러 구성 시스템」ACM 35:2:1902-130, 1992.「http://eli.colorado.edu/ Archived at the Wayback Machine 」도 참조해 주세요.
- ^ J. M. 포스터, "Wayback Machine에서 2022-05-10으로 보관된 구문 개선 프로그램"컴퓨터 저널 11:1-31-34, 1968
추가 정보
- Brooker, R. A.; MacCallum, I. R.; Morris, D.; Rohl, J. S. (1963). "The compiler-compiler". Annual Review in Automatic Programming. 3: 229–275. doi:10.1016/S0066-4138(63)80009-9.
- Brooker, R .A.; Morris, D.; Rohl, J. S. (February 1967). "Experience with the Compiler Compiler". Computer Journal. 9: 350. doi:10.1093/comjnl/9.4.350.
- Napper, R. B. E (December 1965). An Introduction To The Compiler Compiler (PDF).
- Johnson, Stephen C. (July 1975). Yacc—yet another compiler-compiler. Murray Hill, New Jersey, USA: Bell Laboratories. Computer Science Technical Report 32.
- McKeeman, William M.; Horning, James J.; Wortman, David B. (1970). A Compiler Generator. Englewood Cliffs, New Jersey, USA: Prentice-Hall. ISBN 978-0-13-155077-3. Retrieved 2012-12-13.
외부 링크
- Computer50.org, 브루커 오토코드
- Catalog.compilertools.net, 컴파일러 구성 도구 카탈로그
- Labraj.uni-mb.si, 리사
- Skenz.it, Jflex 및 Cup 리소스(이탈리아어)