[compiler-construction] 컴파일러 작성 배우기

기본 언어 : C / C ++, Java 및 Ruby.

교육 목적으로 컴파일러를 작성하는 방법에 대한 유용한 책 / 자습서를 찾고 있습니다. C / C ++, Java 및 Ruby에 대해 가장 잘 알고 있으므로이 세 가지 중 하나를 포함하는 리소스를 선호하지만 좋은 리소스는 허용됩니다.



답변

자원의 큰 목록 :

전설:

  • ¶ PDF 파일로 링크
  • $ 인쇄 된 책으로 연결

답변

이것은 꽤 모호한 질문입니다. 단지 관련된 주제의 깊이 때문입니다. 그러나 컴파일러는 두 개의 별도 부분으로 분해 될 수 있습니다. 상반신과 하반신. 일반적으로 상위 절반은 소스 언어를 사용하여이를 중간 표현으로 변환하고 하단 절반은 플랫폼 별 코드 생성을 처리합니다.

그럼에도 불구 하고이 주제에 접근하는 쉬운 방법 (적어도 컴파일러 클래스에서 사용한 것)에 대한 한 가지 아이디어는 위에서 설명한 두 가지 부분으로 컴파일러를 작성하는 것입니다. 구체적으로, 당신은 단지 절반을 구축함으로써 전체 프로세스에 대한 좋은 아이디어를 얻을 것입니다.

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

이 주제에 관해 내가 특히 유용하다고 생각한 일부 책은 컴파일러 원칙과 기술 (또는 표지에 귀여운 용이 있기 때문에 용 책)이었습니다. 그것은 훌륭한 이론을 가지고 있으며 상황에 맞는 문법을 실제로 접근 가능한 방식으로 다루고 있습니다. 또한 어휘 분석기와 파서를 구축하기 위해 아마 * nix 도구 lex와 yacc를 사용할 것입니다. 그리고 흥미롭게도 ” lex and yacc ” 라는 책 은 Dragon Book이이 부분을 위해 떠난 곳에서 발견되었습니다.


답변

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

Modern Compiler 구현은 필드를 덜 조사하기 때문에 Dragon 책보다 Modern Compiler Implementation을 선호합니다. 대신 진지하고 괜찮은 컴파일러를 작성하는 데 필요한 모든 주제를 실제로 다루고 있습니다. 이 책을 다 읽은 후에는 필요한 경우보다 심도있게 연구 논문을 직접 다룰 수 있습니다.

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


답변

나는 Dragon Book 참조에 동의합니다. IMO는 컴파일러 구성에 대한 결정적인 안내서입니다. 그래도 하드 코어 이론을 준비하십시오.

이론에 대해 더 가벼운 책을 원한다면 Game Scripting Mastery 가 더 나은 책일 것입니다. 컴파일러 이론을 완전히 배우는 사람이라면 더 부드럽게 소개 할 수 있습니다. 더 실용적인 파싱 방법 (LL 또는 LR 파싱을 논의하지 않고 비 예측 재귀 강하 선택)을 다루지 않으며, 기억할 때 어떤 종류의 최적화 이론도 논의하지 않습니다. 또한 머신 코드로 컴파일하는 대신 사용자가 작성하는 VM에서 실행되는 바이트 코드로 컴파일됩니다.

특히 아마존에서 싸게 구입할 수 있다면 여전히 괜찮습니다. 컴파일러에 대한 간단한 소개 만 원한다면 게임 스크립팅 마스터리는 좋은 방법이 아닙니다. 하드 코어를 앞두고 싶다면 드래곤 북 (Dragon Book) 이상으로 해결해야합니다.


답변

“컴파일러를 만들어 보자” 는 대단하지만 조금 구식입니다. (나는 그것이 조금 덜 유효하다고 말하지는 않는다.)

또는 SLANG을 확인하십시오 . 이것은 “컴파일러를 만들어 보자”와 비슷하지만 초보자에게는 특히 좋은 자료입니다. 여기에는 컴파일러를 가르치는 데 7 단계 접근 방식을 취하는 pdf 자습서가 제공됩니다. C ++, Java 및 JS의 SLANG의 모든 다양한 포트에 대한 링크가 있으므로 quora 링크를 추가하면 원래 C # 및 .NET 플랫폼을 사용하여 작성된 Python 및 Java의 인터프리터도 있습니다.


답변

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

이 과정은 구문 분석, 유형 및 유형 검사, 다형성, 기호 테이블 및 코드 생성 등 다른 곳에서 볼 수있는 표준 컴파일러 컴파일러에 대해 설명합니다. 다루지 않는 유일한 것은 최적화입니다. 마지막 프로젝트는 C의 서브셋컴파일하는 프로그램입니다 . ANTLR 및 LLVM과 같은 도구를 사용하기 때문에 하루에 전체 컴파일러를 작성하는 것이 가능합니다 (평균 24 시간이지만 실존 증명이 있습니다). 현대의 도구를 사용하여 실제 공학에 중점을두고 이론에 비해 약간 가볍습니다.

LLVM은 정말 환상적입니다. 일반적으로 어셈블리로 컴파일 할 수있는 많은 상황에서는 LLVM의 중간 표현으로 컴파일하는 것이 훨씬 좋습니다 . 더 높은 수준의 크로스 플랫폼이며 LLVM은 최적화 된 어셈블리를 생성하는 데 매우 능숙합니다.


답변

시간이 없다면 , 하루에 읽을 수있는 작은 책자 인 Niklaus Wirth의 “Compiler Construction”(Addison-Wesley. 1996)을 추천 하지만 기본 사항 (렉서 구현 방법, 재귀 강하 파서, 자체 스택 기반 가상 머신). 그 후, 당신이 깊은 다이빙을 원한다면, 다른 논평자들이 제안한 바와 같이 드래곤 책 주위에 방법이 없습니다.