development

컴파일러 작성법 배우기

big-blog 2020. 9. 30. 09:19
반응형

컴파일러 작성법 배우기


선호하는 언어 : C / C ++, Java 및 Ruby.

나는 단순히 교육 목적으로 컴파일러를 작성하는 방법에 대한 유용한 책 / 튜토리얼을 찾고 있습니다. 저는 C / C ++, Java 및 Ruby에 가장 익숙하기 때문에이 세 가지 중 하나를 포함하는 리소스를 선호하지만 좋은 리소스는 모두 허용됩니다.


큰 자원 목록 :

전설:

  • ¶ PDF 파일에 링크
  • $ 인쇄 된 책에 링크

이것은 매우 모호한 질문입니다. 관련된 주제의 깊이 때문입니다. 그러나 컴파일러는 두 부분으로 분리 될 수 있습니다. 상단 절반 및 하단 1 개입니다. 상단 절반은 일반적으로 소스 언어를 가져와 중간 표현으로 변환하고 하단 절반은 플랫폼 별 코드 생성을 처리합니다.

그럼에도 불구하고이 주제에 접근하는 쉬운 방법에 대한 한 가지 아이디어 (적어도 우리가 컴파일러 클래스에서 사용한 것)는 위에서 설명한 두 부분으로 컴파일러를 빌드하는 것입니다. 특히, 상위 절반 만 빌드하면 전체 프로세스에 대한 좋은 아이디어를 얻을 수 있습니다.

상단 절반 만 수행하면 어휘 분석기와 파서를 작성하는 경험을 얻고 "코드"(내가 언급 한 중간 표현)를 생성 할 수 있습니다. 따라서 소스 프로그램을 다른 표현으로 변환하고 (원하는 경우) 컴파일러의 핵심 인 최적화를 수행합니다. 그런 다음 아래쪽 절반은 중간 표현을 사용하여 특정 아키텍처에서 프로그램을 실행하는 데 필요한 바이트를 생성합니다. 예를 들어, 아래쪽 절반은 중간 표현을 가져와 PE 실행 파일을 생성합니다.

특히 도움이 된이 주제에 대한 일부 책은 Compilers Principles and Techniques (또는 표지의 귀여운 용으로 인한 Dragon Book)입니다. 그것은 훌륭한 이론을 가지고 있으며 정말 접근 가능한 방식으로 문맥 자유 문법을 확실히 다룹니다. 또한 어휘 분석기와 파서를 빌드하기 위해 * nix 도구 lex 및 yacc를 사용할 것입니다. 흥미롭지 않게도 " lex and yacc " 라는 책 은 Dragon Book이이 부분을 위해 중단 한 부분에서 시작되었습니다.


ML의 Modern Compiler Implementation은 텍스트를 작성하는 최고의 입문 컴파일러 라고 생각 합니다. 있다 자바 버전C 버전은 당신의 언어 배경 주어 더 액세스 할 수 있습니다 둘 중 하나, 너무. 이 책은 유용한 기본 자료 (스캔 및 구문 분석, 의미 분석, 활성화 레코드, 명령 선택, RISC 및 x86 네이티브 코드 생성)와 다양한 "고급"주제 (OO 및 기능 언어 컴파일, 다형성, 가비지 수집, 최적화 및 단일 정적 할당 양식)을 비교적 적은 공간 (~ 500 페이지)에 저장합니다.

현대 컴파일러 구현은 현장 조사가 적기 때문에 Dragon 책보다 Modern Compiler Implementation을 선호합니다. 대신에 진지하고 괜찮은 컴파일러를 작성하는 데 필요한 모든 주제를 확실히 다루고 있기 때문입니다. 이 책을 읽은 후에는 필요한 경우 더 깊이있는 연구 논문을 직접 다룰 준비가 된 것입니다.

나는 Niklaus Wirth의 Compiler Construction에 대해 심각한 소프트 스팟을 가지고 있음을 고백해야합니다 . 그것은는 온라인 PDF로. 나는 Wirth의 프로그래밍 미학이 단순히 아름답다고 생각하지만 어떤 사람들은 그의 스타일이 너무 미미하다고 생각합니다 (예를 들어 Wirth는 재귀 적 하강 파서를 선호하지만 대부분의 CS 과정은 파서 생성기 도구에 중점을 둡니다. Wirth의 언어 디자인은 상당히 보수적입니다.) 컴파일러 구성은 매우 간결한 증류법입니다. 그의 스타일이 마음에 들든 싫든이 책을 읽는 것이 좋습니다.


나는 Dragon Book 참조에 동의합니다. IMO는 컴파일러 구성에 대한 확실한 가이드입니다. 하지만 하드 코어 이론을 준비하십시오.

이론에 대해 더 가벼운 책을 원한다면 Game Scripting Mastery 가 더 나은 책이 될 수 있습니다. 컴파일러 이론에 완전히 초보자라면 더 부드러운 소개를 제공합니다. 더 실용적인 구문 분석 방법 (LL 또는 LR 구문 분석을 논의하지 않고 비 예측 재귀 하강 선택)을 다루지 않으며, 제가 기억하는 것처럼 어떤 종류의 최적화 이론도 논의하지 않습니다. 또한 기계 코드로 컴파일하는 대신 사용자가 작성하는 VM에서 실행되어야하는 바이트 코드로 컴파일됩니다.

특히 아마존에서 저렴한 가격으로 구입할 수 있다면 여전히 괜찮은 읽기입니다. 컴파일러에 대한 쉬운 소개 만 원한다면 Game Scripting Mastery가 나쁜 방법이 아닙니다. 하드 코어를 앞두고 싶다면 Dragon Book에 만족해야합니다.


"Let 's Build a Compiler" 는 훌륭하지만 약간 구식입니다. (나는 그것이 조금 덜 유효하다고 말하는 것이 아닙니다.)

또는 SLANG을 확인하십시오 . 이것은 "Let 's Build a Compiler"와 유사하지만 특히 초보자에게 훨씬 더 나은 리소스입니다. 여기에는 컴파일러 교육에 7 단계 접근 방식을 사용하는 pdf 자습서가 함께 제공됩니다. C ++, Java 및 JS에서 SLANG의 모든 다양한 포트에 대한 링크가 있으므로 quora 링크를 추가하고 원래 C # 및 .NET 플랫폼을 사용하여 작성된 Python 및 Java 인터프리터도 추가합니다.


모든 것을 직접 구축 하는 것보다 강력하고 높은 수준의 도구를 사용하려는 경우이 과정 의 프로젝트와 읽기 자료를 살펴 보는 것이 좋습니다. Java 파서 엔진 ANTLR 작성자의 언어 과정입니다. Pragmatic Programmers 로부터 코스에 대한 책을 PDF로 얻을 수 있습니다 .

이 과정은 구문 분석, 유형 및 유형 검사, 다형성, 기호 테이블 및 코드 생성과 같은 다른 곳에서 볼 수있는 표준 컴파일러 컴파일러에 대해 다룹니다. 다루지 않는 것은 최적화뿐입니다. 최종 프로젝트는 C의 하위 집합컴파일하는 프로그램입니다 . ANTLR 및 LLVM과 같은 도구를 사용하기 때문에 하루 만에 전체 컴파일러를 작성하는 것이 가능합니다 (24 시간을 의미하지만 이에 대한 존재 증명이 있습니다). 현대 도구를 사용하는 실용적인 엔지니어링에 무겁고 이론에 대해서는 약간 가볍습니다.

그런데 LLVM은 단순히 환상적입니다. 일반적으로 어셈블리로 컴파일 할 수있는 많은 상황에서 대신 LLVM의 Intermediate Representation으로 컴파일하는 것이 훨씬 낫습니다 . 더 높은 수준의 크로스 플랫폼이며 LLVM은 최적화 된 어셈블리를 생성하는 데 매우 능숙합니다.


시간이 부족 하다면 하루에 읽을 수있는 작은 소책자 인 Niklaus Wirth의 "Compiler Construction"(Addison-Wesley. 1996)을 추천 하지만 기본 사항 (어휘 분석기 구현 방법, 재귀 하강 파서, 자신의 스택 기반 가상 머신). 그 후, 심층 분석을 원한다면 다른 댓글 작성자가 제안하는 것처럼 Dragon 책을 둘러 볼 방법이 없습니다.


Lex / Yacc (또는 Flex / Bison, 원하는대로 호출)를 살펴볼 수 있습니다. Flex는 언어의 의미 구성 요소 ( "토큰")를 구문 분석하고 식별하는 어휘 분석기이며 Bison은 각 토큰이 구문 분석 될 때 발생하는 일을 정의하는 데 사용됩니다. 이것은 C로 컴파일되는 컴파일러의 경우 C 코드를 인쇄하거나 명령을 동적으로 실행하는 것일 수 있지만 이에 국한되지는 않습니다.

이 FAQ 가 도움 이 될 것이며이 튜토리얼 은 매우 유용합니다.


일반적으로 컴파일러에 대한 5 분 자습서가 없습니다. 복잡한 주제이고 컴파일러를 작성하는 데 몇 달이 걸릴 수 있기 때문입니다. 직접 검색해야합니다.

Python과 Ruby는 일반적으로 해석됩니다. 아마도 통역사로 시작하고 싶을 것입니다. 일반적으로 더 쉽습니다.

The first step is to write a formal language description, the grammar of your programming language. Then you have to transform the source code that you want to compile or interpret according to the grammar into an abstract syntax tree, an internal form of the source code that the computer understands and can operate on. This step is usually called parsing and the software that parses the source code is called a parser. Often the parser is generated by a parser generator which transform a formal grammar into source oder machine code. For a good, non-mathematical explanation of parsing I recommend Parsing Techniques - A Practical Guide. Wikipedia has a comparison of parser generators from which you can choose that one that is suitable for you. Depending on the parser generator you chose, you will find tutorials on the Internet and for really popular parser generators (like GNU bison) there are also books.

당신의 언어에 대한 파서를 작성하는 것은 정말 어려울 수 있지만 이것은 당신의 문법에 달려 있습니다. 그래서 저는 문법을 단순하게 유지하는 것이 좋습니다 (C ++와는 다르게). 이에 대한 좋은 예는 LISP입니다.

두 번째 단계에서 추상 구문 트리는 트리 구조에서 선형 중간 표현으로 변환됩니다. 이 Lua의 바이트 코드에 대한 좋은 예가 자주 인용됩니다. 그러나 중간 표현은 실제로 언어에 따라 다릅니다.

통역사를 구축하는 경우 중간 표현을 해석하기 만하면됩니다. 적시에 컴파일 할 수도 있습니다. Just-in-time-compilation을 위해 LLVM과 libjit를 권장합니다. 언어를 사용할 수있게하려면 일부 입력 및 출력 함수와 작은 표준 라이브러리도 포함해야합니다.

언어를 컴파일한다면 더 복잡해질 것입니다. 다른 컴퓨터 아키텍처에 대한 백엔드를 작성하고 해당 백엔드의 중간 표현에서 기계어 코드를 생성해야합니다. 이 작업에는 LLVM을 권장합니다.

이 주제에 대한 몇 권의 책이 있지만 일반적인 용도로 권장 할 수있는 책은 없습니다. 그들 대부분은 너무 학문적이거나 너무 실용적입니다. "21 일 안에 컴파일러 작성을 배우십시오"는 없으므로이 전체 주제를 잘 이해하려면 몇 권의 책을 구입해야합니다. 인터넷을 검색하면 온라인 서적과 강의 노트를 볼 수 있습니다. 컴파일러에 관한 책을 빌릴 수있는 대학 도서관이 근처에있을 것입니다.

또한 프로젝트를 진지하게 만들려면 이론적 컴퓨터 과학 및 그래프 이론에 대한 좋은 배경 지식을 권장합니다. 컴퓨터 과학 학위도 도움이 될 것입니다.


아래 책을보세요. 저자는 ANTLR 의 제작자입니다 .

언어 구현 패턴 : 고유 한 도메인 별 및 일반 프로그래밍 언어 만들기 .

대체 텍스트


아직 제안되지 않았지만 매우 중요한 책 한 권은 John Levine의 "Linkers and Loaders" 입니다. 외부 어셈블러를 사용하지 않는 경우 최종 프로그램에 연결할 수있는 개체 파일을 출력하는 방법이 필요합니다. 외부 어셈블러를 사용하는 경우에도 재배치와 전체 프로그램로드 프로세스가 작동하는 도구를 만드는 방법을 이해해야 할 것입니다. 이 책은 Win32 및 Linux를 포함한 다양한 시스템에 대한이 프로세스에 대한 많은 무작위 지식을 수집합니다.


Dragon Book 은 확실히 "빌딩 컴파일러"책이지만, 언어가 현재 세대의 언어만큼 복잡하지 않은 경우 디자인 패턴에서 인터프리터 패턴을 살펴볼 수 있습니다 .

이 책의 예는 정규 표현식과 같은 언어를 디자인하고 잘 생각하고 있지만 책에서 말하는 것처럼 프로세스를 통해 생각하는 데는 좋지만 실제로는 작은 언어에서만 효과적입니다. 그러나이 패턴으로 작은 언어에 대한 통역사를 작성하는 것이 모든 유형의 파서, yacc 및 lex 등에 대해 학습하는 것보다 훨씬 빠릅니다.


LLVM을 사용하려면 http://llvm.org/docs/tutorial/을 확인 하십시오 . LLVM의 프레임 워크를 사용하여 처음부터 컴파일러를 작성하는 방법을 가르치며 주제에 대한 지식이 없다고 가정하지 않습니다.

이 튜토리얼은 여러분 자신의 파서와 어휘 분석기 등을 작성할 것을 제안하지만, 아이디어를 얻으면 들소와 플렉스를 살펴 보는 것이 좋습니다. 그들은 삶을 훨씬 더 쉽게 만듭니다.


실제로 컴파일러를 작성하는 데 실제로 필요하지 않은 언어 이론에 너무 많은 초점을 두어 Dragon 책을 읽기가 너무 어렵다는 것을 알았습니다.

놀랍도록 빠르고 간단한 Oberon 컴파일러 Project Oberon 의 전체 소스가 포함 된 Oberon 책을 추가합니다 .

대체 텍스트


프로그래밍을 처음 접했을 때 약 7 년 전에이 질문을했던 것을 기억합니다.

나는 내가 물었을 때 매우 조심했고 놀랍게도 당신이 여기에 오는 것만 큼 많은 비판을받지 못했습니다. 그러나 그들은 " Dragon Book " 의 방향을 알려주었습니다. 이것은 제 생각에 컴파일러를 작성하기 위해 알아야 할 모든 것을 설명하는 정말 훌륭한 책입니다 (물론 한두 가지 언어를 마스터해야 할 것입니다. 당신이 아는 언어, 즐거움.).

그리고 네, 많은 사람들이 그 책을 읽는 것이 미쳤다고 말하고 당신은 그 책에서 아무것도 배우지 못할 것입니다. 그러나 나는 그것에 완전히 동의하지 않습니다.

많은 사람들은 또한 컴파일러를 작성하는 것이 어리 석고 무의미하다고 말합니다. 글쎄요, 컴파일러 개발이 유용한 이유는 여러 가지가 있습니다.

  • 재미 있기 때문에.
  • 교육적이며 컴파일러 작성 방법을 배울 때 컴퓨터 과학 및 다른 응용 프로그램을 작성할 때 유용한 기타 기술에 대해 많이 배웁니다.
  • 아무도 컴파일러를 작성하지 않으면 기존 언어가 더 나아지지 않을 것입니다.

나는 바로 내 컴파일러를 작성하지 않았지만 어디서부터 시작해야할지 물었다. 그리고 지금은 다양한 언어를 배우고 용의 책을 읽은 후 글쓰기가 그다지 문제가되지 않습니다. (저는 컴퓨터 공학 atm도 공부하고 있지만 프로그래밍에 대해 제가 아는 대부분은 독학입니다.)

결론적으로, The Dragon Book은 훌륭한 "튜토리얼"입니다. 그러나 컴파일러를 작성하기 전에 한두 가지 언어를 마스터하는 데 시간을 투자하십시오. 하지만 향후 10 년 내에 컴파일러 전문가가 될 것으로 기대하지 마십시오.

이 책은 파서 / 통역사를 작성하는 방법을 배우고 싶은 경우에도 좋습니다.


"... 컴파일러를 만들어 보자 ..."

두 번째로 http://compilers.iecc.com/crenshaw/ by @sasb 입니다. 지금은 더 많은 책을 사는 것을 잊어 버리십시오.

왜? 도구 및 언어.

필요한 언어는 Pascal이고 내가 올바르게 기억한다면 Turbo-Pascal을 기반으로합니다. http://www.freepascal.org/ 로 이동 하여 Pascal 컴파일러를 다운로드하면 모든 예제가 페이지에서 바로 작동합니다 ~ http://www.freepascal.org/download.var Free에 대한 멋진 점 Pascal은 당신이 관리 할 수있는 거의 모든 프로세서 나 OS를 사용할 수 있다는 것입니다.

레슨을 마스터했다면 고급 " Dragon Book " ~ http://en.wikipedia.org/wiki/Dragon_book 을 시도해보십시오 .


나는 같은 개념을 조사하고 있으며 Joel Pobar의 유망한 기사를 발견했습니다.

.NET Framework 용 언어 컴파일러 만들기-이것이 어디로 갔는지 확실하지 않음

.NET Framework 용 언어 컴파일러 만들기-원본 문서의 pdf 사본

그는 컴파일러의 높은 수준의 개념에 대해 논의하고 .Net 프레임 워크에 대한 자신의 언어를 개발하기 시작합니다. .Net Framework를 목표로하지만 많은 개념을 재현 할 수 있어야합니다. 기사는 다음을 다룹니다.

  1. 언어 정의
  2. 스캐너
  3. 파서 (주로 관심이있는 비트)
  4. .Net Framework 대상 지정
  5. 코드 생성기

다른 주제가 있지만 당신은 정당합니다.

C # (자바가 아님)으로 작성된 시작하는 사람들을 대상으로합니다.

HTH


컴파일러를 만드는 쉬운 방법은 bison과 flex (또는 유사)를 사용하고 트리 (AST)를 만들고 C로 코드를 생성하는 것입니다. C 코드 생성이 가장 중요한 단계입니다. C 코드를 생성하면 언어가 C 컴파일러가있는 모든 플랫폼에서 자동으로 작동합니다.

C 코드를 생성하는 것은 HTML을 생성하는 것만 큼 쉽습니다 (인쇄물을 사용하거나 이에 상응하는 것을 사용). 이것은 C 파서 나 HTML 파서를 작성하는 것보다 훨씬 쉽습니다.


로부터 comp.compilers의 자주 묻는 질문 :

Per Brinch Hansen Prentice-Hall의 "개인용 컴퓨터 프로그래밍"1982 ISBN 0-13-730283-5

불행히도 제목이 붙은이 책은 에디슨이라는 파스칼과 유사한 언어를 사용하여 마이크로를위한 단일 사용자 프로그래밍 환경의 설계 및 생성에 대해 설명합니다. 저자는 모든 소스 코드와 Edison 컴파일러의 단계별 구현 및 간단한 지원 운영 체제에 대한 설명을 제공하며, 모두 Edison 자체로 작성되었습니다 (PDP 11/23 용 심볼릭 어셈블러로 작성된 작은 지원 커널 제외). 완전한 소스는 IBM PC 용으로도 주문할 수 있습니다.)

이 책에서 가장 흥미로운 점은 다음과 같습니다. 1) 완전하고 자체 포함 된 자체 유지 관리가 가능한 유용한 컴파일러 및 운영 체제를 만드는 방법을 보여주는 능력, 2) 언어 설계 및 사양 문제와 거래에 대한 흥미로운 논의 2 장의 오프.

Per Brinch Hansen Prentice-Hall 1985의 "Brinch Hansen on Pascal 컴파일러"ISBN 0-13-083098-4

또 다른 가벼운 이론의 무거운 실용 학은 여기에 코딩 방법 책입니다. 저자는 Pascal- (Pascal "마이너스")에 대한 컴파일러 및 p- 코드 인터프리터에 대한 설계, 구현 및 완전한 소스 코드를 제공합니다. 이는 부울 및 정수 유형 (문자, 실수, 하위 범위 또는 열거 유형 없음)이있는 Pascal 서브 세트입니다. , 상수 및 변수 정의와 배열 및 레코드 유형 (그러나 압축, 변형, 집합, 포인터, 이름 없음, 이름 변경 또는 파일 유형 없음), 표현식, 할당 명령문, 값 및 변수 매개 변수가있는 중첩 프로 시저 정의, if 명령문, while 명령문, 및 시작-끝 블록 (하지만 함수 정의, 절차 매개 변수, goto 문 및 레이블, case 문, repeat 문, for 문 및 with 문 없음).

컴파일러와 인터프리터는 소프트웨어 개발 시스템을 만들기 위해 일부 Edison 스타일 기능으로 확장 된 Pascal 하위 집합 인 Pascal * (Pascal "star")로 작성되었습니다. 저자는 IBM PC 용 Pascal * 컴파일러를 판매하지만이 책의 Pascal- 컴파일러를 편리한 Pascal 플랫폼에 쉽게 이식 할 수 있습니다.

이 책은 컴파일러의 디자인과 구현을 쉽게 보여줍니다. 특히 저자가 품질, 신뢰성 및 테스트에 관심을 갖는 방식이 마음에 듭니다. 컴파일러와 인터프리터는 특히 신속하게 무언가를 시작하고 실행해야하는 경우 더 많은 관련 언어 또는 컴파일러 프로젝트의 기반으로 쉽게 사용할 수 있습니다.


6 페이지가 넘는 코드에서 C를 대상으로하는 작은 Lisp 방언 용 컴파일러 인 Darius Bacon의 " ichbins "를 확인해야 합니다. 대부분의 장난감 컴파일러에 비해 장점은 컴파일러가 작성 될만큼 언어가 완전하다는 것입니다. (타르볼에는 부트 스트랩을위한 인터프리터도 포함되어 있습니다.)

Ur-Scheme 웹 페이지 에서 컴파일러를 작성하는 방법을 배우는 데 유용한 정보가 더 많이 있습니다 .


Python은 Python으로 작성된 Python 컴파일러와 함께 번들로 제공됩니다. 소스 코드를 볼 수 있으며 구문 분석, 추상 구문 트리, 코드 생성 등 모든 단계를 포함합니다. 해킹하십시오.


Fraser와 Hanson 의 LCC 컴파일러 ( wikipedia ) ( project homepage )는 그들의 책 "A Retargetable C Compiler : Design and Implementation"에 설명되어 있습니다. 매우 읽기 쉽고 코드 생성에 이르기까지 전체 컴파일러를 설명합니다.


죄송합니다. 스페인어로되어 있지만 이것은 아르헨티나의 "Compiladores e Intérpretes"(컴파일러 및 통역사)라는 과정의 참고 문헌입니다.

이 과정은 공식 언어 이론에서 컴파일러 구성에 이르기까지 진행되었으며 최소한 간단한 컴파일러를 구축하는 데 필요한 주제는 다음과 같습니다.

  • C.
    Allen I. Holub

    Prentice-Hall의 컴파일러 설계 1990.

  • Compiladores. Teoría y Construcción.
    Sanchís Llorca, FJ, Galán Pascual, C. Editorial Paraninfo. 1988.

  • 컴파일러 구성.
    Niklaus Wirth

    Addison-Wesley. 1996.

  • Lenguajes, Gramáticas y Autómatas. Un enfoque práctico.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán. Addison-Wesley Iberoamericana (España). 1997.

  • 컴파일러 디자인의 예술. 이론과 실제.
    Thomas Pittman, James Peters.

    Prentice-Hall. 1992.

  • 객체 지향 컴파일러 구성.
    짐 홈즈.
    프렌 티스 홀, 잉글 우드 절벽, NJ 1995

  • Compiladores. Conceptos 기초.
    B. Teufel, S. Schmidt, T. Teufel.

    Addison-Wesley Iberoamericana. 1995.

  • 오토마타 이론, 언어 및 계산 소개.

    John E. Hopcroft. Jeffref D. Ullman.
    애디슨-웨슬리. 1979.

  • Introduction to formal languages.
    György E. Révész.

    Mc Graw Hill. 1983.

  • Parsing Techniques. A Practical Guide.
    Dick Grune, Ceriel Jacobs.
    Impreso por los autores. 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc: Yet Another Compiler-Compiler.
    Stephen C. Johnson
    Computing Science Technical Report Nº 32, 1975. Bell Laboratories. Murray Hill, New
    Jersey.

  • Lex: A Lexical Analyzer Generator.
    M. E. Lesk, E. Schmidt. Computing Science Technical Report Nº 39, 1975. Bell Laboratories. Murray Hill, New Jersey.

  • lex & yacc.
    John R. Levine, Tony Mason, Doug Brown.
    O’Reilly & Associates. 1995.

  • Elements of the theory of computation.
    Harry R. Lewis, Christos H. Papadimitriou. Segunda Edición. Prentice Hall. 1998.

  • Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control.
    Salvador V. Cavadini.
    Trabajo Final de Grado para obtener el Título de Ingeniero en Computación.
    Facultad de Matemática Aplicada. U.C.S.E. 2001.


  1. This is a vast subject. Do not underestimate this point. And do not underestimate my point to not underestimate it.
  2. I hear the Dragon Book is a (the?) place to start, along with searching. :) Get better at searching, eventually it will be your life.
  3. Building your own programming language is absolutely a good exercise! But know that it will never be used for any practical purpose in the end. Exceptions to this are few and very far between.

Not a book, but a technical paper and an enormously fun learning experience if you want to know more about compilers (and metacompilers)... This website walks you through building a completely self-contained compiler system that can compile itself and other languages:

Tutorial: Metacompilers Part 1

This is all based on an amazing little 10-page technical paper:

Val Schorre META II: A Syntax-Oriented Compiler Writing Language

from honest-to-god 1964. I learned how to build compilers from this back in 1970. There's a mind-blowing moment when you finally grok how the compiler can regenerate itself....

I know the website author from my college days, but I have nothing to do with the website.


There's a lot of good answers here, so i thought I'd just add one more to the list:

I got a book called Project Oberon more than a decade ago, which has some very well written text on the compiler. The book really stands out in the sense that the source and explanations is very hands on and readable. The complete text (the 2005 edition) has been made available in pdf, so you can download right now. The compiler is discussed in chapter 12:

http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth, Jürg Gutknecht

(The treatment is not as extensive as his book on compilers)

I've read several books on compilers, and i can second the dragon book, time spent on this book is very worthwhile.


If you are interested in writing a compiler for a functional language (rather than a procedural one) Simon Peyton-Jones and David Lester's "Implementing functional languages: a tutorial" is an excellent guide.

The conceptual basics of how functional evaluation works is guided by examples in a simple but powerful functional language called "Core". Additionally, each part of the Core language compiler is explained with code examples in Miranda (a pure functional language very similar to Haskell).

Several different types of compilers are described but even if you only follow the so-called template compiler for Core you will have an excellent understanding of what makes functional programming tick.


You can use BCEL by the Apache Software Foundation. With this tool you can generate assembler-like code, but it's Java with the BCEL API. You can learn how you can generate intermediate language code (in this case byte code).

Simple example

  1. Create a Java class with this function:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Now run BCELifier with this class

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

You can see the result on the console for the whole class (how to build byte code MyClass.java). The code for the function is this:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

I liked the Crenshaw tutorial too, because it makes it absolutely clear that a compiler is just another program that reads some input and writes some out put.

Read it.

Work it if you want, but then look at another reference on how bigger and more complete compilers are really written.

And read On Trusting Trust, to get a clue about the unobvious things that can be done in this domain.


Not included in the list so far is this book:

Basics of Compiler Design (Torben Mogensen) (from the dept. of Computer Science, University of Copenhagen)

I'm also interested in learning about compilers and plan to enter that industry in the next couple of years. This book is the ideal theory book to begin learning compilers as far as I can see. It's FREE to copy and reproduce, cleanly and carefully written and gives it to you in plain English without any code but still presents the mechanics by way of instructions and diagrams etc. Worth a look imo.

참고URL : https://stackoverflow.com/questions/1669/learning-to-write-a-compiler

반응형