문제

선호하는 언어:C/C++, 자바, 루비.

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

도움이 되었습니까?

해결책

주요 자료 목록:

전설:

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

다른 팁

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

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

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

이 주제에 관해 제가 특히 도움이 되었다고 생각하는 일부 책은 다음과 같습니다. 컴파일러 원리 및 기술 (또는 표지에 귀여운 용이 그려져 있는 Dragon Book).이 책은 몇 가지 훌륭한 이론을 갖고 있으며 정말 접근하기 쉬운 방식으로 문맥 없는 문법을 확실히 다룹니다.또한 어휘 분석기와 파서를 구축하기 위해 아마도 *nix 도구인 lex 및 yacc를 사용할 것입니다.그리고 흥미롭게도 "렉스와 야크"는 Dragon Book이 이 부분에서 중단한 부분을 선택했습니다.

제 생각에는 ML의 최신 컴파일러 구현 최고의 입문 컴파일러 작성 텍스트입니다.거기에 자바 버전 그리고 C 버전 또한 귀하의 언어 배경을 고려하면 어느 쪽이든 더 쉽게 접근할 수 있습니다.이 책에는 유용한 기본 자료(스캐닝 및 구문 분석, 의미 분석, 활성화 기록, 명령어 선택, RISC 및 x86 네이티브 코드 생성)와 다양한 "고급" 주제(OO 및 기능 언어 컴파일, 다형성, 가비지 수집, 최적화 및 단일 정적 할당 형식)을 상대적으로 작은 공간(~500페이지)에 저장합니다.

나는 Dragon 책보다 Modern Compiler 구현을 선호합니다. 왜냐하면 Modern Compiler 구현은 해당 분야를 덜 조사하기 때문입니다. 대신 진지하고 괜찮은 컴파일러를 작성하는 데 필요한 모든 주제를 정말 확실하게 다루고 있습니다.이 책을 다 읽고 나면 필요한 경우 더 깊이 있는 연구 논문을 직접 다룰 준비가 될 것입니다.

나는 Niklaus Wirth의 작품에 대해 매우 애착을 갖고 있음을 고백해야 합니다. 컴파일러 구축. 그것은 사용 가능한 온라인 PDF로.나는 Wirth의 프로그래밍 미학이 단순히 아름답다고 생각하지만 일부 사람들은 그의 스타일이 너무 단순하다고 생각합니다. 예를 들어 Wirth는 재귀 하강 파서를 선호하지만 대부분의 CS 과정은 파서 생성기 도구에 중점을 둡니다.Wirth의 언어 디자인은 상당히 보수적입니다.) 컴파일러 구성은 Wirth의 기본 아이디어를 매우 간결하게 요약한 책이므로 그의 스타일이 마음에 들든 싫든 이 책을 읽어 보시기를 적극 권장합니다.

나는 Dragon Book 참조에 동의합니다.IMO는 컴파일러 구성에 대한 최종 가이드입니다.하지만 하드코어 이론을 준비하세요.

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

특히 아마존에서 저렴하게 구입할 수 있다면 여전히 읽을 만한 가치가 있습니다.컴파일러에 대한 쉬운 소개만을 원한다면 Game Scripting Mastery가 나쁜 방법은 아닙니다.하드코어한 방향으로 나아가고 싶다면 Dragon Book 외에는 만족하지 말아야 합니다.

"컴파일러를 만들어보자" 굉장하지만 약간 구식입니다.(나는 그것이 조금이라도 덜 유효하다고 말하는 것이 아닙니다.)

아니면 확인해 보세요 속어.이는 "컴파일러를 구축하자"와 유사하지만 특히 초보자에게 훨씬 더 나은 리소스입니다.이것은 컴파일러를 가르치는 데 7단계 접근 방식을 취하는 PDF 튜토리얼과 함께 제공됩니다.C++, Java 및 JS의 다양한 SLANG 포트에 대한 링크가 있고 원래 C# 및 .NET 플랫폼을 사용하여 작성된 Python 및 Java의 인터프리터에 대한 링크가 있으므로 quora 링크를 추가합니다.

빌드보다는 강력하고 높은 수준의 도구를 사용하려는 경우 모든 것 스스로 프로젝트를 진행하고 독서를 진행합니다. 이 과정 꽤 좋은 옵션입니다.Java 파서 엔진 ANTLR 작성자의 언어 강좌입니다.해당 과정의 책을 PDF로 다운로드할 수 있습니다. 실용적인 프로그래머.

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

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

시간이 조금 있다면 추천합니다 Niklaus Wirth의 "컴파일러 구성"(Addison-Wesley.1996), 하루 안에 읽을 수 있는 작은 소책자이지만 기본 사항(어휘 분석기, 재귀 하강 파서 및 자체 스택 기반 가상 머신 구현 방법 포함)을 설명합니다.그 후에 심층 분석을 원한다면 다른 평론가들이 제안한 것처럼 Dragon 책을 둘러볼 방법이 없습니다.

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

이 FAQ 당신을 도와야하고, 이 튜토리얼 꽤 유용해 보입니다.

일반적으로 컴파일러에 대한 5분짜리 튜토리얼은 없습니다. 왜냐하면 주제가 복잡하고 컴파일러를 작성하는 데 몇 달이 걸릴 수 있기 때문입니다.당신은 당신 자신의 검색을 수행해야합니다.

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

첫 번째 단계는 공식적인 언어 설명, 즉 프로그래밍 언어의 문법을 작성하는 것입니다.그런 다음 문법에 따라 컴파일하거나 해석하려는 소스 코드를 컴퓨터가 이해하고 작동할 수 있는 소스 코드의 내부 형식인 추상 구문 트리로 변환해야 합니다.이 단계를 일반적으로 구문 분석이라고 하며 소스 코드를 구문 분석하는 소프트웨어를 구문 분석기라고 합니다.종종 파서는 형식적인 문법을 소스 또는 기계어 코드로 변환하는 파서 생성기에 의해 생성됩니다.구문 분석에 대한 수학적이 아닌 좋은 설명을 위해 구문 분석 기술 - 실용 가이드를 권장합니다.Wikipedia에는 ​​자신에게 적합한 파서 생성기를 선택할 수 있는 비교 분석기가 있습니다.선택한 파서 생성기에 따라 인터넷에서 튜토리얼을 찾을 수 있으며 매우 인기 있는 파서 생성기(예: GNU bison)에 대한 책도 있습니다.

귀하의 언어에 맞는 파서를 작성하는 것은 정말 어려울 수 있지만 이는 귀하의 문법에 따라 다릅니다.그래서 저는 (C++와 달리) 문법을 단순하게 유지하는 것을 제안합니다.이에 대한 좋은 예는 LISP입니다.

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

인터프리터를 구축하는 경우 중간 표현을 해석하기만 하면 됩니다.적시에 컴파일할 수도 있습니다.JIT(Just-In-Time) 컴파일에는 LLVM과 libjit를 권장합니다.언어를 사용 가능하게 만들려면 일부 입력 및 출력 기능과 작은 표준 라이브러리도 포함해야 합니다.

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

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

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

아래 책을 살펴보세요.저자는 창작자이다. ANTLR.

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

alt text

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

드래곤 북 이 책은 분명히 "컴파일러 구축" 책이지만, 귀하의 언어가 현재 세대의 언어만큼 복잡하지 않다면 다음의 Interpreter 패턴을 살펴보는 것이 좋습니다. 디자인 패턴.

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

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

튜토리얼에서는 자신만의 파서와 어휘분석기 등을 작성하라고 제안하지만 일단 아이디어를 얻은 후에는 bison과 flex를 살펴보는 것이 좋습니다.그들은 삶을 훨씬 더 쉽게 만듭니다.

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

나는 오베론 놀랍도록 빠르고 간단한 Oberon 컴파일러의 전체 소스가 포함된 책 프로젝트 오베론.

Alt text

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

나는 물었을 때 매우 조심스러웠고 놀랍게도 나는 당신이 여기에 오는 것만큼 많은 비판을 받지 않았습니다.그러나 그들은 나에게 "드래곤북" 내 생각에 이 책은 컴파일러를 작성하기 위해 알아야 할 모든 것을 설명하는 정말 훌륭한 책입니다. (물론 한두 가지 언어를 마스터해야 합니다.더 많은 언어를 알수록 더 즐겁습니다.)

그리고 네, 많은 사람들이 그 책을 읽는 것은 미친 짓이고 거기서 아무것도 배울 수 없다고 말하지만, 저는 그 말에 전적으로 동의하지 않습니다.

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

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

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

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

이 책은 파서/인터프리터 작성 방법을 배우고 싶은 경우에도 좋습니다.

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

나는 두 번째 http://compilers.iecc.com/crenshaw/ ~에 의해 @sasb.지금은 더 많은 책을 사는 것을 잊어버리세요.

왜?도구 및 언어.

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

레슨을 마스터한 후에는 더 고급 레슨을 시도해 보세요. "드래곤북" ~ 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#(Java는 아님)으로 작성되어 처음 시작하는 사람들을 대상으로 합니다.

HTH

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

C 코드를 생성하는 것은 HTML을 생성하는 것만큼 쉽습니다(print나 이에 상응하는 것을 사용). 결과적으로 C 파서나 HTML 파서를 작성하는 것보다 훨씬 쉽습니다.

로부터 comp.compilers FAQ:

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

불행히도 제목의 책은 Edison이라는 Pascal과 같은 언어를 사용하여 Micros 용 단일 사용자 프로그래밍 환경의 디자인과 제작을 설명합니다.저자는 Edison 컴파일러의 단계별 구현 및 Edison 자체로 작성된 간단한 지원 운영 체제의 모든 소스 코드 및 설명을 제시합니다 (PDP 11/23의 상징적 어셈블러로 작성된 작은 지원 커널 제외;IBM PC에 대해서도 전체 소스를 주문할 수도 있습니다).

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

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

여기에 또 다른 Light-oneary Heavy-on-Pragmatics는 여기에서 코드가 될 것입니다.저자는 부울 및 정수 유형을 가진 파스칼 서브 세트 (그러나 문자, 실제, 서브 랑이 또는 열거 된 유형)를 가진 파스칼 서브 세트 인 Pascal- (Pascal "Minus")에 대한 컴파일러 및 P 코드 통역사에 대한 설계, 구현 및 완전한 소스 코드를 제시합니다. , 상수 및 가변 정의 및 배열 및 레코드 유형 (그러나 포장, 변형, 세트, ​​포인터, 이름이 없음, 이름이 바뀌거나 파일 유형), 표현식, 할당 문, 값 및 변수 매개 변수가있는 중첩 프로 시저 정의, 문서, 문서, 문서, 문서, 문서, 문서, 문서, 명령문, 문서, 문서, 문서, 명령문, 변수 매개 변수. 그리고 시작-엔드 블록 (그러나 함수 정의, 절차 매개 변수, GOTO 문 및 레이블, 사례 문, 반복 문, 진술 및 진술).

컴파일러 및 통역사는 소프트웨어 개발 시스템을 만들기위한 일부 Edison 스타일 기능으로 확장 된 Pascal 서브 세트 인 Pascal* (Pascal "Star")로 작성됩니다.IBM PC 용 Pascal* 컴파일러는 저자가 판매하지만 책의 파스칼 컴파일러를 편리한 파스칼 플랫폼으로 쉽게 포팅 할 수 있습니다.

이 책을 보면 컴파일러의 설계와 구현이 쉬워 보입니다.나는 특히 저자가 품질, 신뢰성 및 테스트에 관심이있는 방식을 좋아합니다.컴파일러와 통역사는 특히 더 많은 언어 또는 컴파일러 프로젝트의 기초로 쉽게 사용할 수 있습니다.

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

내 페이지에 컴파일러 작성 방법을 배우는 데 유용하다고 생각한 내용이 더 많이 있습니다. 우르 계획 웹 페이지.

Python은 Python으로 작성된 Python 컴파일러와 함께 번들로 제공됩니다.소스 코드를 볼 수 있으며 여기에는 구문 분석, 추상 구문 트리, 코드 방출 등의 모든 단계가 포함됩니다.해킹하세요.

LCC 컴파일러(위키피디아) (프로젝트 홈페이지)는 Fraser와 Hanson의 저서 "A Retargetable C Compiler:설계 및 구현".이는 매우 읽기 쉽고 전체 컴파일러를 코드 생성까지 설명합니다.

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

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

  • C로 컴파일러 디자인
    앨런 I.홀럽

    프렌티스 홀.1990.

  • 컴파일러.Teoría y Construcción.
    Sanchís Llorca, FJ, 갈란 파스쿠알, C.편집 Paraninfo.1988.

  • 컴파일러 구축.
    니클라우스 워스

    애디슨-웨슬리.1996.

  • Lenguajes, Gramáticas y Automatas.Un foque practice.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán.애디슨-웨슬리 이베로 아메리카나 (España).1997.

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

    프렌티스 홀.1992.

  • 객체 지향 컴파일러 구성.
    짐 홈즈.
    Prentice Hall, Englewood Cliffs, NJ1995년

  • 컴파일러.Conceptos Fundamentales.
    비.토이펠, S.슈미트, T.Teufel.

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

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

    존 E.홉크로프트.제프리 D.울만.
    애디슨-웨슬리.1979.

  • 공식 언어 소개.
    E. 죄르지Révész.

    맥 그로 힐.1983년.

  • 구문 분석 기술.실용 가이드.
    Dick Grune, Ceriel Jacobs.
    impreso por los autores.1995년
    http://www.cs.vu.nl/~dick/PTAPG.html

  • 야크:또 다른 컴파일러-컴파일러.
    스티븐 C.존슨
    컴퓨팅 과학 기술 보고서 ​​Nº 32, 1975.벨 실험실.머레이 힐, 뉴
    저지.

  • 법률:어휘 분석기 생성기.
    중.이자형.레스크, E.슈미트.컴퓨팅 과학 기술 보고서 ​​Nº 39, 1975.벨 연구소.머레이 힐, 뉴저지.

  • 렉스 & 야크.
    존 R.레빈, 토니 메이슨, 더그 브라운.
    오라일리 & 어소시에이츠.1995.

  • 계산 이론의 요소.
    해리 R.루이스, 크리스토스 H.Papadimitriou.세군다 에디시온.프렌티스 홀.1998.

  • Un Algoritmo Eficiente para la Construcción del Grafo de dependencyencia de Control.
    살바도르 V.카바디니.
    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. 이것은 광범위한 주제입니다.이 점을 과소평가하지 마십시오.그리고 그것을 과소평가하지 않으려면 내 요점을 과소평가하지 마십시오.
  2. 나는 듣는다 드래곤북 검색과 함께 시작할 수 있는 (the?) 장소입니다.:) 검색에 능숙해지면 결국 그것이 당신의 삶이 될 것입니다.
  3. 자신만의 프로그래밍 언어를 구축하는 것은 정말 좋은 연습입니다!하지만 결국에는 실용적인 목적으로 사용되지 않을 것이라는 점을 알아두세요.이에 대한 예외는 거의 없으며 매우 아주 드문.

책은 아니지만 컴파일러(및 메타컴파일러)에 대해 더 알고 싶다면 기술 문서와 엄청나게 재미있는 학습 경험을 제공합니다.이 웹사이트는 자체 언어와 다른 언어를 컴파일할 수 있는 완전히 독립된 컴파일러 시스템을 구축하는 과정을 안내합니다.

지도 시간:메타컴파일러 1부

이 모든 내용은 10페이지 분량의 놀라운 기술 문서를 기반으로 합니다.

발 쇼레 메타 II:구문 지향 컴파일러 작성 언어

정직하게 신에게 1964년부터.나는 1970년에 컴파일러를 만드는 법을 배웠습니다.컴파일러가 어떻게 스스로를 재생성할 수 있는지 마침내 깨닫는 놀라운 순간이 있습니다....

저는 대학시절부터 웹사이트 작성자를 알고 있지만 해당 웹사이트와는 아무 관련이 없습니다.

여기에는 좋은 답변이 많이 있으므로 목록에 하나 더 추가하기로 했습니다.

나는 10여 년 전에 Project Oberon이라는 책을 샀는데, 그 책에는 컴파일러에 매우 잘 쓰여진 텍스트가 있습니다.이 책은 출처와 설명이 매우 직접적이고 읽기 쉽다는 점에서 정말 돋보입니다.전체 텍스트(2005년 판)는 PDF로 제공되므로 지금 바로 다운로드할 수 있습니다.컴파일러는 12장에서 논의됩니다:

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

니클라우스 비르트, 위르크 구트크네히트

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

나는 컴파일러에 관한 여러 책을 읽었고 드래곤 책을 두 번째로 읽었습니다. 이 책에 소비한 시간은 매우 가치가 있습니다.

(절차적 언어가 아닌) 기능적 언어용 컴파일러를 작성하는 데 관심이 있다면 Simon Peyton-Jones와 David Lester의 "기능적 언어 구현:튜토리얼"는 훌륭한 가이드입니다.

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

여러 가지 유형의 컴파일러가 설명되어 있지만 소위 Core용 템플릿 컴파일러만 따른다고 해도 함수형 프로그래밍을 작동하게 만드는 요소에 대한 훌륭한 이해를 갖게 될 것입니다.

나는 그것을 좋아했다 크렌쇼 튜토리얼 또한 컴파일러는 일부 입력을 읽고 일부 출력을 작성하는 또 다른 프로그램일 뿐이라는 점을 분명히 하기 때문입니다.

읽어.

원한다면 작업해 보세요. 하지만 실제로 얼마나 더 크고 완전한 컴파일러가 작성되는지에 대한 또 다른 참고 자료를 살펴보세요.

그리고 읽어보세요 신뢰하는 신뢰에 대하여, 이 영역에서 수행할 수 있는 불분명한 작업에 대한 단서를 얻으려면

당신이 사용할 수있는 BCEL 아파치 소프트웨어 재단에 의해.이 도구를 사용하면 어셈블러와 유사한 코드를 생성할 수 있지만 이는 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();
}

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

컴파일러 설계의 기초(Torben Mogensen)(부서에서.코펜하겐대학교 컴퓨터공학과)

나는 또한 컴파일러에 대해 배우는 데 관심이 있고 앞으로 몇 년 안에 해당 업계에 진출할 계획입니다.이 책은 제가 볼 때 컴파일러 학습을 시작하는 데 이상적인 이론서입니다.복사 및 재생산이 자유롭고 깔끔하고 세심하게 작성되었으며 코드 없이 일반 영어로 제공되지만 여전히 지침과 다이어그램 등을 통해 메커니즘을 제공합니다.한 번 볼만한 가치가 있어요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top