컴파일러 작성 배우기


699

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

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


ANTLR. 아래 제안 된 모든 리소스는 나에게 과잉처럼 보입니다. ANTLR은 항상 컴파일러 디자이너의 가장 친한 친구입니다. A
A_Var

컴파일 아이디어가 일반적으로 작동하는 방식을 배우는 데 주된 초점이 있다면 Scheme (List)에 기반한 컴퓨터 구조적 해석 (Structured Interpretation of Computer) 프로그램의 SICP를 확인하고 일반적인 원칙을 가르 칠 수 있습니다. mitpress.mit.edu/sicp . 나는 회사에서 일하는 베테랑에 의해이 책을 추천 받았으며이 작품들은 생계를 위해 편집하고 해석합니다!
Nishant


내 블로그에 컴파일러를 만드는 방법에 대한 기사를 썼습니다 : orangejuiceliberationfront.com/how-to-write-a-compiler 그것은 매우 기본 사항과 시작에 중점을 둡니다. 거기에는 더 많은 컴파일러 / 코덱 / 파서 / 언어 디자인 관련 기사가 있습니다.
uliwitness

답변:


1084

자원의 큰 목록 :

전설:

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

22
나는 Let's Build a Compiler[ compilers.iecc.com/crenshaw/] 시리즈를 읽었습니다 . 정말 좋은 글씨이며 좋은 출발점입니다.
TheVillageIdiot

5
나는 언급 할 가치가있는 것은 Coursera의 컴파일러 과정이라고 생각합니다. 멋진 비디오가 있으며 언어와 간단한 컴파일러와 같은 Java를 만드는 과정을 안내합니다. Coursera Compilers Link
QuantumKarl

1
이 답변을 가능한 한 독창적으로 게시하고 싶었습니다. tutorialspoint.com/compiler_design/index.htm 이 사이트에서 내가 좋아하는 것은 실제로 코드를 작성하는 데 관여하지 않는다는 것입니다. 컴파일러를 만들지 만 컴파일러를 단계와 단계로 나눕니다. 임의의 언어와 알파벳의 표기법을 표현하므로 특정 언어 패러다임이없는 논리 및 알고리즘 설계 방식을 설명합니다. 빠른 읽기이지만 각 부분에 필요한 개념을 제공합니다.
Francis Cugler

70

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

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

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

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


55

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의 기본 아이디어 중 하나이므로 스타일을 좋아하든 원하지 않든이 책을 읽는 것이 좋습니다.



난 강력하게 추천 에 대해 C.에 완전히 책을 클러 인해 "현대 컴파일러 구현"의 C 버전, 그것은 낮은 수준의 세부 사항에 의해 불구가 있어요. Java 1st는 OO 디자인이 좋지 않아서 좋지 않습니다. Java 2nd ed는 더 이상 Tiger 언어에 관한 것이 아닙니다. ML을 강력히 추천합니다. ML을 이해하기 위해 유창 할 필요는 없습니다. ML은이 작업에 적합합니다.
akim

44

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

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

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


1
게임 스크립팅 마스터리 (Master Scripting Mastery)는 학습에 유용한 스크립트 가능한 2D 어드벤처 게임이 있기 때문에 훌륭한 학습 리소스입니다. 이를 통해 모든 운동은 특정 목적에 중점을두고 독자에게 동기를 부여합니다.
Dour High Arch

1
Dragon은 문법 기반 파싱에 약간 집중되어 있습니다. 당신이 구문 분석 C와 같은 불가능 깎아 지른듯한 뭔가 ++ 정도 파서 생성기를 사용하려고하는 것이 아니라, 사용할 수있는 경우 예를 들어 손수 LL 문법 당신은 취급 높은 비율 컴파일러는 문법 변환 및 증명 이외의 필드 뭔가 피려 할 수 있습니다
마르코 반을 de Voort 2018 년

27

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

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


5
이 시리즈는 여전히 유용하지만 조금 오래되었다는 데 동의합니다. 그러나 가장 큰 장점은 파싱 트리 유형을 작성하지 않고 어셈블리 언어로 직접 출력하려고 시도한다는 것입니다. 즉, 첫 번째 기사에서 언급 한 내용과 달리 쓰기에 매우 유용하지 않습니다. 통역사.
a_m0d

23

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

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

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


첫 번째 링크는 죽었습니다.
Lynn

20

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


시간이 없다면 컴파일러를 작성하십시오.
Ingo

17

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

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


17

일반적으로 컴파일러에 대한 5 분짜리 자습서는 없습니다. 복잡한 주제이기 때문에 컴파일러 작성에는 몇 달이 걸릴 수 있습니다. 당신은 당신 자신의 검색을해야합니다.

파이썬과 루비는 일반적으로 해석됩니다. 아마도 통역사로 시작하고 싶을 수도 있습니다. 일반적으로 더 쉽습니다.

첫 번째 단계는 공식 언어 설명, 프로그래밍 언어의 문법을 작성하는 것입니다. 그런 다음 문법에 따라 컴파일하거나 해석하려는 소스 코드를 컴퓨터가 이해하고 작동 할 수있는 내부 코드 인 소스 코드의 추상 구문 트리로 변환해야합니다. 이 단계를 일반적으로 파싱이라고하며 소스 코드를 파싱하는 소프트웨어를 파서라고합니다. 종종 파서는 공식 문법을 소스 또는 기계 코드로 변환하는 파서 생성기에 의해 생성됩니다. 파싱에 대한 비 수학적 설명을 좋게하려면 파싱 기술-실용 가이드를 권장합니다. Wikipedia에는 ​​파서 생성기를 비교하여 적합한 것을 선택할 수 있습니다. 선택한 파서 생성기에 따라

언어에 대한 파서를 작성하는 것은 정말 어려울 수 있지만 이것은 문법에 따라 다릅니다. 따라서 문법을 단순하게 유지하는 것이 좋습니다 (C ++과 달리). 이에 대한 좋은 예는 LISP입니다.

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

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

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

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

또한 프로젝트를 진지하게 생각한다면 이론적 컴퓨터 과학 및 그래프 이론에 대한 배경 지식이 좋습니다. 컴퓨터 과학 학위도 도움이 될 것입니다.


++ 당신은 그 모든 것을 아는 것이 좋으며 큰 일이 될 수도 있지만, 일부 전문가들로부터 물건을 크게 다루지 않는 방법을 배웠습니다 . 일을 아는 것이 좋으며, 사용하지 않을 때를 아는 것이 훨씬 좋습니다. 대부분의 경우입니다.
Mike Dunlavey


11

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


10

Dragon Book 은 분명히 "컴파일러 컴파일러"책이지만, 현재 언어와 같이 언어가 복잡하지 않은 경우 Design Patterns 에서 Interpreter 패턴을보고 싶을 것 입니다.

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


10

LLVM을 사용하려는 경우 http://llvm.org/docs/tutorial/ 에서 확인 하십시오 . LLVM의 프레임 워크를 사용하여 처음부터 컴파일러를 작성하는 방법을 가르쳐 주므로 해당 주제에 대한 지식이 없다고 가정합니다.

이 자습서에서는 자신의 파서와 어휘 분석기 등을 작성하는 것이 좋지만 아이디어를 얻은 후에는 들소를 살펴보고 구부리는 것이 좋습니다. 그들은 인생을 훨씬 쉽게 만듭니다.


그러나 Visual Studio로 설정하기위한 문서는 잘못 작성
되었으며

10

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

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

대체 텍스트


10

나는 프로그래밍에 익숙하지 않은 7 년 전에이 질문을 한 것을 기억합니다.

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

그렇습니다. 많은 사람들이 그 책을 읽는 것이 미쳤다고 말하면서 당신은 그 책에서 아무것도 배우지 않을 것이라고 말하지만, 나는 그것에 완전히 동의하지 않습니다.

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

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

나는 내 자신의 컴파일러를 즉시 작성하지 않았지만 묻고 나서 어디서부터 시작해야하는지 알았다. 그리고 지금, 많은 다른 언어를 배우고 드래곤 북을 읽은 후에 글쓰기는 그다지 큰 문제가 아닙니다. (나는 또한 컴퓨터 공학 atm을 공부하고 있지만 프로그래밍에 대해 알고있는 대부분의 내용은 자체 교육입니다.)

결론적으로, 드래곤 북은 훌륭한 "자습서"입니다. 그러나 컴파일러를 작성하기 전에 한 두 언어를 마스터하는 데 시간을 투자하십시오. 향후 10 년 이내에 컴파일러 전문가가 될 것으로 기대하지 마십시오.

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


9

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

@sasb에 의해 http://compilers.iecc.com/crenshaw/ 를 두 번째 로 사용 합니다. 지금은 더 많은 책을 구입하지 마십시오.

왜? 도구 및 언어.

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

수업을 마친 후에는 고급 " 드래곤 북 " 을 시도하십시오 ~ http://en.wikipedia.org/wiki/Dragon_book


9

나는 같은 개념을 조사하고 Joel Pobar의 유망한 기사를 찾았습니다.

.NET Framework 용 언어 컴파일러를 작성하십시오.

.NET Framework 용 언어 컴파일러 작성-원본 문서의 pdf 사본

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

  1. 랑가 쥬 정의
  2. 스캐너
  3. 파서 (주로 관심있는 비트 임)
  4. .Net 프레임 워크 타겟팅
  5. 코드 생성기

다른 주제가 있지만, 정당성을 얻습니다.

C #으로 작성된 사람들을 목표로합니다 (Java가 아닌)

HTH


"Java가 아닌"은 무엇을 의미합니까?
Hejazzman

하하, 미안, 나는 .Net 용으로 작성된 것을 의미했는데, 원칙적으로 java와 비슷합니다. 둘 다 JIT 스타일입니다. :)
dbones

8

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

C 코드를 생성하는 것은 HTML을 생성하는 것만 큼 간단합니다 (인쇄 또는 이와 동등한 것을 사용하십시오). 그러면 C 파서 나 HTML 파서를 작성하는 것보다 훨씬 쉽습니다.


8

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

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

이 제목의이 책은 Edison이라는 Pascal과 같은 언어를 사용하여 마이크로 용 단일 사용자 프로그래밍 환경을 설계하고 작성하는 방법을 설명합니다. 저자는 Edison 컴파일러와 간단한 지원 운영 체제의 단계별 구현에 대한 모든 소스 코드와 설명을 제공합니다 (모든 Edison 자체로 작성 됨 (PDP 11/23의 기호 어셈블러로 작성된 소규모 지원 커널 제외). 전체 소스는 IBM PC 용으로 주문할 수도 있습니다).

이 책에서 가장 흥미로운 점은 다음과 같습니다. 1) 완전하고 자체 포함 된 자체 관리 형의 유용한 컴파일러 및 운영 체제를 작성하는 방법을 보여주는 기능 2) 언어 설계 및 사양 문제와 무역에 대한 흥미로운 논의 2 장에서 꺼집니다.

Per Brinch Hansen Prentice-Hall 1985의 "Brinch Hansen on Pascal Compilers"ISBN 0-13-083098-4

또 다른 이론에 관한 실용주의는 여기에 코드 작성법입니다. 저자는 파스칼-(Pascal "-)"에 대한 컴파일러 및 p- 코드 인터프리터의 설계, 구현 및 완전한 소스 코드 (부울 및 정수 유형 (단, 문자, 실수, 하위 범위 또는 열거 유형은 없음))를 제공합니다. , 상수 및 변수 정의 및 배열 및 레코드 유형 (그러나 팩형, 변형, 세트, ​​포인터, 이름이없는, 이름이 바뀐 또는 파일 유형은 없음), 표현식, 대 입문, 값 및 변수 매개 변수가있는 중첩 된 프로 시저 정의, if 문, while 문, 및 시작-엔드 블록 (함수 정의, 절차 매개 변수, goto 문 및 레이블, case 문, repeat 문, for 문 및 명령문 포함).

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

이 책은 컴파일러의 디자인과 구현을 쉽게 보여줍니다. 특히 저자가 품질, 신뢰성 및 테스트에 관심을 갖는 방식이 마음에 듭니다. 컴파일러와 인터프리터는 특히 언어와 컴파일러 프로젝트의 기반으로 쉽게 사용할 수 있습니다.


8

다리우스 베이컨의 이치빈을 확인해야합니다6 페이지가 넘는 코드에서 C를 대상으로하는 작은 Lisp 방언 용 컴파일러 인 "를 합니다. 대부분의 완구 컴파일러에 비해 장점은 컴파일러가 작성 될 정도로 언어가 완전하다는 것입니다. (타르볼에는 또한 물건을 부트 스트랩하는 통역사가 포함되어 있습니다.)

Ur-Scheme 웹 페이지 에서 컴파일러 작성을 배우는 데 유용한 항목에 대한 추가 정보가 있습니다 .


8
  1. 이것은 광대 한 주제입니다. 이 점을 과소 평가하지 마십시오. 과소 평가하지 않는 내 요점을 과소 평가하지 마십시오.
  2. 드래곤 북이 들립니다 은 검색과 함께 시작해야 할 곳 . :) 더 나은 검색, 결국 그것은 당신의 인생이 될 것입니다.
  3. 자신의 프로그래밍 언어를 구축하는 것은 절대적으로 좋은 운동입니다! 그러나 결국 실제적인 목적으로 사용되지는 않습니다. 이것에 대한 예외는 거의 없으며 아주 먼 사이입니다.

4
드래곤 책을 읽지 않은 경우. 추천하지 마십시오. 실제로 컴파일러를 구현 한 적이 있습니까?

예, 이름에서 알 수 있듯이 Dragon Book은 괴물입니다. 그럼에도 불구하고 매우 심층적이지만 매우 훌륭한 자원입니다. 초보자에게는 권장하지 않습니다 ...
Zachary Murray

2
@ 닐 : 당신은 나에게 구글을하지 않았다, 당신은? lol. blog.280z28.org 하지만 아니요, 나는 그 책을 읽지 않았습니다.
Sam Harwell

나는 현재 그것을 읽고 있습니다 (용 책). 그리고 동시에 Lex / Yacc도 책을 아주 잘 찾고 있습니다. 몸소.
Simeon Pilgrim

1
공평하게, 나는 "듣다 ..."라고 서두를 시작했다. :) # 1과 # 3은 내가 알아야 할 점이 매우 중요하지만 자주 언급되지는 않는다고 생각합니다.
Sam Harwell

8

Fraser와 Hanson 의 LCC 컴파일러 ( wikipedia ) ( 프로젝트 홈페이지 ) ( github.com/drh/lcc )는 "A Retargetable C Compiler : Design and Implementation"이라는 책에 설명되어 있습니다. 읽기 쉽고 코드 생성에 이르기까지 전체 컴파일러를 설명합니다.


이것은 매우 좋은 리소스 덕분입니다.
기드온

7

파이썬은 파이썬으로 작성된 파이썬 컴파일러와 함께 제공됩니다. 소스 코드를 볼 수 있으며 구문 분석, 추상 구문 트리, 방출 코드 등의 모든 단계가 포함되어 있습니다. 해킹하십시오.


7

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

이 과정은 공식 언어 이론에서 컴파일러 구성에 이르는 과정으로, 최소한 간단한 컴파일러를 빌드하는 데 필요한 주제입니다.

  • C.
    Allen I. Holub

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

  • Compiladores. 테오 리아이 Construcción.
    Sanchís Llorca, FJ, Galán Pascual, C. 편집 Paraninfo. 1988.

  • 컴파일러 구성.
    Niklaus Wirth

    Addison-Wesley. 1996.

  • Lenguajes, Gramáticas y Autómatas. enfoque práctico.
    Pedro Isasi Viñuela, 팔로마 마르티네즈 페르난데스, 다니엘 보라 조 밀란 애디슨-웨슬리 이베로 아메리카나 (España). 1997.

  • 컴파일러 디자인의 기술. 이론과 실습.
    토마스 피트 먼, 제임스 피터스

    프렌 티스 홀. 1992.

  • 객체 지향 컴파일러 구성.
    짐 홈즈.
    1995 년 뉴저지 엥글 우드 클리프 프렌 티스 홀

  • Compiladores. Conceptos Fundamentales.
    B. Teufel, S. Schmidt, T. Teufel.

    애디슨 웨슬리 이베로 아메리카나. 1995.

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

    존이 홉 크로프트 Jeffref D. Ullman.
    애디슨 웨슬리 1979.

  • 공식 언어 소개.
    기르기 E. 레 베스.

    맥 그로 힐. 1983.

  • 파싱 ​​기법. 실용 가이드.
    딕 그런, 세리엘 제이콥스
    로스 오토 레르 1995 년
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc : 또 다른 컴파일러 컴파일러.
    Stephen C. Johnson
    Computing Science 기술 보고서 ​​1975 년 Nº 32. Bell Laboratories. 머레이 힐,
    뉴저지

  • Lex : Lexical Analyzer Generator.
    ME Lesk, E. 슈미트 컴퓨팅 과학 기술 보고서 ​​Nº 39, 1975. Bell Laboratories. 머레이 힐, 뉴저지

  • 렉스 & 야크.
    John R. Levine, Tony Mason, Doug Brown.
    오라일리 & 어소시에이트. 1995.

  • 계산 이론의 요소.
    Harry R. Lewis, Christos H. Papadimitriou. 세 군다 에디 시온. 프렌 티스 홀. 1998.

  • 컨트롤에 대한 Construcción 델 Grafo의 Un Algoritmo Eficiente 파라 라.
    살바도르 V. 카 바디 니.
    Compución의 Título de Ingeniero에 대한 최종 정보입니다.
    Facultad de Matemática Aplicada. UCSE 2001.


6

컴파일러 (및 메타 컴파일러)에 대해 더 자세히 알고 싶다면 책이 아니라 기술 문서와 엄청나게 재미있는 학습 경험이 필요합니다.

튜토리얼 : 메타 컴파일러 1 부

이것은 모두 10 페이지짜리 놀라운 기술 논문을 기반으로합니다.

Val Schorre META II : 구문 지향 컴파일러 작성 언어

1970 년대에 이로부터 컴파일러를 빌드하는 방법을 배웠습니다. 마침내 컴파일러가 어떻게 자신을 재생성 할 수 있는지에 대해 마음이 떠오르는 순간이 있습니다 ....

나는 대학 시절의 웹 사이트 작성자를 알고 있지만 웹 사이트와는 아무런 관련이 없습니다.


다른 사람들이 말했듯이, 큰 논쟁은 스시가 학사를위한 최종 작품이라고 생각합니다. 수많은 수학, 컴퓨터 과학 등의 개념을 알아야합니다.
ingconti

이 주제를 모른다면 실제로 심각한 컴파일러를 구축하려고 시도해서는 안됩니다. 그러나 2-3 년의 학부 컴퓨터 과학 교육 (프로그래밍, 데이터 구조, 어셈블리 언어)이있는 경우 MetaII 논문이 도움이 될 것입니다.
Ira Baxter

5

나는 Crenshaw 튜토리얼을 좋아했다 도 . 컴파일러는 입력을 읽고 출력하는 다른 프로그램이라는 것을 분명히 알기 때문입니다.

읽어.

원하는 경우 작동하지만 더 크고 완전한 컴파일러가 실제로 작성되는 방법에 대한 다른 참조를 살펴보십시오.

이 도메인에서 수행 할 수있는 명백하지 않은 사항에 대한 힌트를 얻으려면 On Trusting Trust를 읽으십시오 .


5

절차 적 언어가 아닌 기능적 언어를위한 컴파일러 작성에 관심이있는 경우 Simon Peyton-Jones와 David Lester의 " 기능적 언어 구현 : 자습서 "는 훌륭한 안내서입니다.

기능 평가 작동 방식의 개념 기본 사항은 "핵심"이라는 단순하지만 강력한 기능적 언어의 예제를 통해 안내됩니다. 또한 핵심 언어 컴파일러의 각 부분은 Miranda (하스켈과 매우 유사한 순수 기능 언어)의 코드 예제로 설명됩니다.

몇 가지 다른 유형의 컴파일러가 설명되어 있지만 소위 Core 용 템플릿 컴파일러 만 따르는 경우에도 함수형 프로그래밍이 어떻게 작동하는지 잘 이해할 수 있습니다.


5

당신이 사용할 수있는 BCELApache Software Foundation에서 을 . 이 도구를 사용하면 어셈블러와 유사한 코드를 생성 할 수 있지만 BCEL API를 사용하는 Java입니다. 중간 언어 코드 (이 경우 바이트 코드)를 생성하는 방법을 배울 수 있습니다.

간단한 예

  1. 이 함수를 사용하여 Java 클래스를 작성하십시오.

    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";
        }
    }
    

이제이 클래스로 BCELifier를 실행하십시오.

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

전체 클래스의 콘솔에서 결과를 볼 수 있습니다 (바이트 코드 MyClass.java를 작성하는 방법). 함수 코드는 다음과 같습니다.

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();
}

5

여기에 좋은 답변이 많이 있으므로 목록에 하나 더 추가 할 것이라고 생각했습니다.

10여 년 전에 Project Oberon이라는 책을 받았는데,이 책에는 컴파일러에 대한 매우 잘 쓰여진 텍스트가 있습니다. 이 책은 출처와 설명이 매우 실용적이며 읽기 쉽다는 점에서 두드러집니다. 전체 텍스트 (2005 년판)가 pdf로 제공되므로 지금 다운로드 할 수 있습니다. 컴파일러는 12 장에서 설명합니다.

http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf

니클라우스 위스, 저그 구 트네 흐트

(처리는 그의 컴파일러에 관한 책만큼 광범위하지 않습니다)

나는 컴파일러에 관한 몇 권의 책을 읽었으며 드래곤 북을 두 번째로 사용할 수 있습니다.이 책에 소비 된 시간은 매우 가치가 있습니다.


4

이 책은 지금까지 목록에 포함되어 있지 않습니다.

컴파일러 디자인의 기초 (Torben Mogensen) (코펜하겐 대학교 컴퓨터 과학과)

또한 컴파일러에 대해 배우고 다음 몇 년 안에 해당 산업에 진출 할 계획입니다. 이 책은 내가 볼 수있는 한 컴파일러 학습을 시작하기에 이상적인 이론 책입니다. 복사, 재생산, 깨끗하고 신중하게 작성하는 것은 무료이며 코드없이 일반 영어로 제공하지만 지침 및 다이어그램 등을 통해 정비공을 제공합니다.


:)
Anton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.