C/C++ 컴파일러는 어떻게 작동합니까?
10년이 넘는 C/C++ 코딩 기간 동안, 저는 다음과 같은 패턴을 발견했습니다. 매우 훌륭한 프로그래머들은 컴파일러 내부에 대한 자세한 지식을 가지고 있는 경향이 있습니다.
저는 상당히 훌륭한 프로그래머이고, 특별한 컴파일러 "superstitions" 모음을 가지고 있기 때문에, 제 지식을 재부팅하고 기초부터 시작하고 싶습니다.
온라인 자료나 좋아하는 책에 대한 링크를 추천해 줄 수 있는 사람?특히 C/C++ 컴파일, 최적화, GCC 및 LLVM에 관심이 있습니다.
Dragon book부터 시작..(코드 최적화 및 코드 생성에 대해 더 강조)
Decaf or Cool과 같은 교육용 프로그래밍 언어를 위한 장난감 컴파일러를 작성해 보십시오. 프론트엔드를 위해 파서 제너레이터(lex 및 yacc)를 사용할 수 있습니다(생활을 좀 더 쉽게 하고 더 즉흥적인 것에 집중할 수 있도록).
그런 다음 gcc 소스 코드 검색과 함께 gcc 내부 책을 읽습니다.
- GCC 내부 매뉴얼.
- CPP 내부 매뉴얼
- LLVM 설명서
컴파일러 텍스트도 좋지만, 독학을 하기에는 좀 무겁습니다.Jack Crenshaw는 다운로드하여 읽을 수 있는 일련의 기사들인 "Lets Build a Compiler"라는 "Book"을 가지고 있습니다.이 방법은 "Learn By Doing" 방법론을 따르는데, 이 방법은 여러분이 그 과목에 대한 정규 수업을 듣는 것으로부터 아무것도 얻지 못했거나 수강한지 너무 많은 시간이 흘렀다면 좋습니다(제 경우입니다.그것은 여러분의 손을 잡고 학계만이 관심을 갖는 람다 미적분학과 깊은 이론적인 문제들을 여러분에게 스치는 대신 컴파일러를 쓰는 것으로 여러분을 인도합니다.그것은 학교에서 여러 달 전에 Vax에 무엇인가를 적었던 기억만 흐릿하게 남아 있던 뇌세포들을 자극하는 좋은 방법이었습니다.대부분의 교과서들이 첫 장을 통과하기 위해 여러 냄비의 커피를 필요로 하는 것과 달리, 그것은 매우 대화적이고 쉽게 쓰여져 있습니다.일단 이해할 수 있는 근거가 있으면 드래곤 북과 같은 더 전통적인 텍스트를 참고할 수 있습니다. (그리고 개인적으로 저는 데드 트리 버전을 좋아하고 잭의 것을 인쇄했습니다. 노트북보다는 편안한 자세로 읽는 것이 훨씬 쉽습니다.그리고 Ebook 리더기는 아직 실제 책을 읽고 있는 것 같지 않은 것에는 너무 비쌉니다.)
어떤 사람들이 "다운사이드"라고 부르는 것은 그것이 파스칼로 쓰여져 있다는 것이지만, 저는 그것이 누군가가 저에게 처음부터 작동하는 C 프로그램을 줬을 때보다 더 많은 생각을 하게 만들었다고 생각합니다.그 외에도 현재 임베디드 시스템에서만 사용되고 있는 68000을 염두에 두고 작성되었습니다.다시 말하지만 이것은 문제가 되지 않았습니다. 저는 68000 asm과 68000 asm이 다른 asm보다 읽기 쉽다는 것을 알고 있었습니다.
데드 트리 에디션을 원한다면 The Art of Compiler Design: 이론과 실천.
피트 에디(Pete Eddy)가 언급한 바와 같이 잭 크렌쇼(Jack Crenshaw)의 튜토리얼은 초보자들에게 탁월합니다.그러나 실제 프로덕션 C 컴파일러가 어떻게 작동하는지 알고 싶다면, 코드를 벽에 던져 무언가가 막힐 때까지 만드는 대신 뛰어난 엔지니어들이 설계한 것이라면, 프레이저와 핸슨의 A Retargetable C 컴파일러의 복사본을 직접 받아 보십시오. 설계 및 구현, 매우 깨끗한 컴파일러에 대한 소스 코드를 포함합니다.설계 및 구현에 대한 설명이 코드에 섞여 있습니다.초보자를 위한 첫 책은 아니지만, 세심한 공부에 보답할 것이고, 35달러에 중고책을 받을 수 있습니다.
더 오랜 시간 동안의 허튼소리를 위해.lcc
, 컴파일 C Faster on Linux를 참조하십시오.
lcc 웹페이지에는 좋은 교재들이 많이 연결되어 있습니다.하지만 제가 정말 좋아하는 인트로 텍스트는 잘 모릅니다.
추신: Uni에서 바가지 써서 죄송합니다.
http://se-radio.net/podcast/2007-07/episode-61-internals-gcc
Fabrice Bellard의 otcc 소스 코드 참조
정확히 알고 싶은 것에 따라 파이프와 필터 패턴을 살펴봐야 합니다. 제가 알기로는 지난 몇 년 동안 많은 컴파일러에서 이와 유사한 것이 사용되었기 때문입니다.
컴파일러 지식이 너무 오래되지 않은 경우 다음과 같이 작동합니다.
소스 코드를 기호 표현으로 구문 분석
상징적인 표현을 정리하고, 약간의 정규화를 합니다.
특정 규칙에 기초한 기호 트리의 최적화
심볼릭 트리를 기반으로 실행 코드를 작성합니다.
물론 종속성 등입니다.그것도 해결해야 합니다.
그리고 물론 gcc나 javac 소스코드를 보는 것이 더 자세한 이해에 도움이 될 것입니다.
소스 코드를 집어 컴파일러에 읽어 주는 것도 가치가 있을 수 있습니다.GCC가 20년 이상의 언어 진화에 대한 완전한 호환성을 부담하고 있기 때문에 최선의 첫 번째 선택인지 의문입니다.그러나 내부 참조 매뉴얼 중 하나에 의해 안내되는 출처를 읽는 것은 교육적일 것이라고 확신합니다.
가상 머신의 바이트 코드에 내부적으로 컴파일되는 스크립팅 언어의 소스를 살펴보는 것을 진지하게 고려해 보고 싶습니다.여러 언어들이 그 설명에 맞지만, 저는 루아부터 시작하겠습니다.언어는 작고 VM은 참신합니다.소스코드도 작고 제가 본 비트들은 가볍게 언급은 했지만 아주 명확했습니다.
만화경을 한번 보세요.LLVM을 사용하면 며칠 안에 자신만의 컴파일러를 작성할 수 있습니다.
언급URL : https://stackoverflow.com/questions/1085490/how-do-c-c-compilers-work
'bestsource' 카테고리의 다른 글
HTML 요소의 내용이 오버플로되는지 확인 (0) | 2023.09.26 |
---|---|
큰 HTML 문자열로 jQuery 개체 만들기 (0) | 2023.09.26 |
Angular 2 + TypeScript로 배열을 복사합니다. (0) | 2023.09.26 |
"바쁜 기다림"과 "잠"의 절충점은 무엇입니까? (0) | 2023.09.21 |
C에서 운영체제가 POSIX인지 확인하려면 어떻게 해야 합니까? (0) | 2023.09.21 |