이미 소장하고 있다면 판매해 보세요.
|
1 컴파일러를 만들어 보자
1.1 이 책의 개요 1.2 컴파일 과정 1.3 C♭ 컴파일러로 컴파일하기 2 C♭과 cbc 2.1 C♭ 언어의 개요 2.2 C♭ 컴파일러 cbc의 구성 1부 소스 코드 해석 3 구문 해석의 개요 3.1 구문 해석 방법 3.2 파서 제너레이터 3.3 JavaCC의 개요 4 어휘 해석 4.1 JavaCC에 의한 스캐너 작성 4.2 구조가 없는 단어의 스캔 4.3 토큰을 생성하지 않는 단어의 스캔 4.4 구조를 포함한 단어의 스캔 5 JavaCC로 파서 작성하기 5.1 EBNF로 문법 작성하기 5.2 애매한 문법과 토큰 미리 보기 6 구문 해석 6.1 정의의 해석 6.2 문장의 해석 6.3 식의 해석 6.4 항의 해석 2부 추상 구문 트리와 중간 표현 7 JavaCC의 Action과 추상 구문 트리 7.1 JavaCC의 액션 7.2 추상 구문 트리와 노드 8 추상 구문 트리 작성 8.1 식의 추상 구문 트리 8.2 문장의 추상 구문 트리 8.3 선언의 추상 구문 트리 8.4 cbc 파서의 실행 9 의미 해석(1) 참조 해결 9.1 의미 해석의 개요 9.2 변수 참조의 해결 9.3 타입 참조의 해결 10 의미 해석(2) 정적 타입 체크 10.1 타입 정의 체크 10.2 식의 타당성 체크 10.3 정적 타입 체크 11 중간 표현의 변환 11.1 cbc의 중간 표현 11.2 IRGenerator 클래스의 개요 11.3 제어 구조의 변환 11.4 부작용이 없는 식의 변환 11.5 좌변값의 변환 11.6 부작용이 있는 식의 변환 3부 어셈블리 코드의 생성 12 x86 아키텍처의 개요 12.1 컴퓨터 구조 12.2 x86계 CPU의 역사 12.3 IA-32의 개요 12.4 데이터 표현과 배치 13 x86 어셈블러 프로그래밍 13.1 GNU 어셈블러에 의한 프로그래밍 13.2 GNU 어셈블러의 문법 13.3 전송 명령 13.4 산술 연산 명령 13.5 비트 연산 명령 13.6 연산의 제어 14 함수 호출과 변수 14.1 호출 규약 14.2 Linux/x86에서의 함수 호출 14.3 Linux/x86에서 함수 호출의 상세 15 식과 문의 컴파일 15.1 컴파일 결과 확인 15.2 x86 어셈블리의 오브젝트 표현과 DSL 15.3 cbc의 x86 어셈블리 DSL 15.4 CodeGenerator 클래스의 개요 15.5 단순한 식의 컴파일 15.6 2항 연산의 컴파일 15.7 변수 참조와 대입 15.8 점프문의 컴파일 16 스택 프레임 할당 16.1 머신 스택의 실행 16.2 인수와 로컬 변수의 메모리 참조 할당 16.3 가상 스택으로 임시 변수 할당 16.4 머신 스택 액세스의 오프셋 조정 16.5 프롤로그·에필로그의 생성 16.6 alloca의 구축 17 최적화 방법 17.1 최적화의 의미 17.2 최적화의 분류 17.3 cbc에서의 최적화 17.4 더욱 강력한 최적화 4부 링크와 로드 18 오브젝트 파일의 생성 18.1 ELF 파일의 구조 18.2 ELF 파일에서의 글로벌 변수 표현 18.3 글로벌 변수의 컴파일 18.4 오브젝트 파일의 생성 19 링크와 라이브러리 19.1 링크의 개요 19.2 링크 19.3 다이내믹 링크와 스태틱 링크 19.4 라이브러리의 작성 20 프로그램의 로드 20.1 ELF 세그먼트의 로드 20.2 다이내믹 링크의 과정 20.3 동적 로드 20.4 GNU ld에 의한 링크 21 위치 독립 코드의 생성 21.1 위치 독립 코드 21.2 글로벌 변수 참조의 구축 21.2 링커 호출의 구축 21.3 프로그램 해석부터 실행까지 22 이 책을 모두 읽고 나서 22.1 서적 소개 22.2 링크·로드에 대해 22.3 다양한 언어 기능 부록 A.1 참고 문헌 A.2 온라인 도큐먼트 A.3 소스 코드 찾아보기 |
|
이 책은 한마디로 컴파일러를 실제로 구축하기 위한 과정을 설명한 책이라고 할 수 있다. 이 책의 특징이나 주요 내용은 서문에 자세히 쓰여 있기 때문에 생략하기로 하겠다.
단지, 역자로서 번역을 해 가면서 느낄 수 있었던 점은 컴파일러의 이론을 다룬 이론서나 해설서가 아니고, 오로지 구축에 목적을 둔 책으로써 프로그램 언어로 쓰여진 소스 코드가 컴퓨터 안에서 어떻게 실행되는지를 순차적으로 설명하고 있어, 컴파일러 스터디를 위한 좋은 책이라고 생각된다. 늘 컴파일러를 사용하면서도 링커, 로더, ELF, 최적화가 무엇인지, dll, lib, h 파일 등이 서로 어떤 연관 관계가 있는지 모르는 경우가 많은데, 이런 부분에 대한 가려움은 다소 해소될 것이다. 또한, x86 아키텍처에서 실제로 움직일 수 있는 코드의 생성을 목적으로 하고 있기 때문에 구축 방법에 대해서도 익힐 수 있으며, 이론 위주가 아닌 실무(실제 구축) 위주이다 보니 책의 내용대로 그대로 따라가다 보면 흥미롭게 배울 수가 있을 것이다. 끝으로, 이 책의 저자는 일본을 대표하는 컴파일러의 권위자 중 한 명이라고 한다. IBM이 컴파일러 프로젝트를 시작할 당시 어드바이스를 구했을 정도로 실력 있는 분이 작성한 실용서인 만큼 구문 해석, 의미 해석, 어휘 해석 등 컴파일러 구축과 관련된 다양한 방면에서 많은 도움이 되리라 믿는다. - 이영희 ---역자 서문 중에서 'C♭' 언어의 컴파일러를 작성한다. C♭은 C언어를 거의 대부분 지원하며, 포인터 연산 등을 포함하여 C언어의 주요 부분이 모두 구축되어 있다. 즉 장난 삼아 만들어 보는 것이 아니라 '현실적인' 컴파일러를 구축한다. 또, 더 구체적으로 내용을 다루기 위해 이 책에서 작성하는 C♭ 컴파일러는 x86계 CPU상에서 동작하는 Linux를 타깃으로 정했다. x86계 CPU를 선택한 이유는 현재 가장 많이 보급되어 있고, 실제 하드웨어를 구하기가 쉽기 때문이다. 또한, Linux를 선택한 이유는 표준 라이브러리나 프로그램 실행 환경 소스 코드가 모두 공개되어 있어서 혼자서도 얼마든지 구조를 조사할 수 있기 때문이다. 특정 언어나 OS에만 제한하는 것을 싫어하는 저자도 환경을 제한하는 편이(한 발자국 앞으로 나아가려는 의미에서는) 오히려 낫다고 생각한다. 왜냐하면 일반적인 구성을 갑자기 설명하는 것보다는 좀 더 구체적인 환경에 대해 이야기하는 것이 훨씬 간단하고 확실하기 때문이다. 마지막 부분에 일반적인 이야기를 다루자는 의견에 대해서는 찬성하지만, 처음부터 일반적인 이야기를 다루자는 의견에는 찬성하지 않는다. 다음 두 번째 특징에 대해 살펴보자. 이 책은 책 제목인 '컴파일러'라는 단어에만 얽매이지 않고, 컴파일러를 중심으로 한 프로그래밍 언어의 실행 환경, 다시 말해서 컴파일러, 어셈블러, 링커, 하드웨어, 실행 환경 모두를 다룬다. 컴파일러에 따라 구축될 프로그램은 컴파일러와 함께 어셈블러, 링커 프로그램, 하드웨어 이 네 가지가 모두 관련되어 동작한다. 따라서, 컴파일러와 프로그램 동작에 대해 알고 싶으면 당연히 이 네 가지를 모두 이해해야 한다. 그러나 '당연'이라는 말이 점점 성립되기 어려워지고 있는 것도 사실이다. 컴파일러와 어셈블러에 관한 책은 많다. 링커에 관한 책도 조금은 있다. 하지만, 컴파일러와 어셈블러, 링커를 통합하여 일관되게 설명한 책은 없다. 컴파일러에 대해 쓴 책은 구체적인 어셈블리 언어를 다룬 책이 따로 있어야 하고, 어셈블리 언어를 쓴 책은 OS의 실행 환경에 대해서도 다루어야 한다. 또, 링크에 대해 쓴 책은 컴파일러에 대한 내용이 없으면 아무 의미가 없다. 그래서 프로그래밍 언어의 실행 환경을 모두 작성하는 것은 어려워 보이지만, 나는 가능하다고 생각한다. 구체적인 언어와 구체적인 OS, 구체적인 하드웨어에 포커스를 두면 프로그램의 동작을 모두 설명하는 것은 불가능하지 않다. 이 책은 그러한 면에 서 무모한 도전을 한 결과라고 볼 수 있다. 이상이 이 책의 기본 방침이다. 다음과 같은 학습이 필요할 경우 이 책을 권장한다. ● 컴파일러나 인터프리터의 내부가 어떻게 되어 있는지 이해한다. ● C언어 프로그램이 동작하는 구조를 이해한다. ● x86 CPU(Pentium이나 Intel Core, Opteron 등)의 구조를 이해한다. ● Linux에서의 링크·로드와 라이브러리에 대해 이해한다. ● Parse(구문 해석)에 대해 배운다. ● 새로운 프로그램 언어를 만든다. 정리해 보자. 이 책은 프로그래밍 언어와 타깃 머신, OS 환경을 구체적으로 선정하여, 프로그램이 동작하는 구조에 대한 모든 것을 설명한다. 순수하게 컴파일러에 흥미가 있는 사람부터 실용적인 목적이 있는 사람까지 폭 넓게 읽을 수 있는 책이다. 꼭 알아야 하는 사전 지식 이 책을 읽는 독자라면 아래와 같은 지식이 있어야 함을 전제로 한다. ● Java 언어의 기초 ● C언어의 기초 ● Linux의 기초 이 책에서 작성할 C♭ 컴파일러는 Java로 작성되어 있기 때문에 Java 코드를 읽을 수 있어야 한다. 언어뿐만이 아니라 Collection 등 기본 라이브러리에 대해서도 설명하지 않는다. 미리 학습해 두기 바란다. 또한, 이 책에서 사용할 Java 버전은 5.0이다. 단, generics이나 foreach 문의 Java 5 특유의 기능에 대해서는 처음 나올 때 간단하게 설명을 넣어 두었다. 또, C♭은 C언어의 서브셋이고, 어셈블러를 이해하기 위해서는 C언어 지식이 있는 편이 이해하기 쉬우므로, 가능한 한 C언어도 알아두기 바란다. 세부 사항까지 자세히 알고 있을 필요는 없다. 포인터와 구조체를 조합해서 사용할 수 있을 정도만 이해하고 있으면 충분하다. 마지막으로, Shell의 사용 방법 등 Linux를 사용하는 상식적인 내용에 대해서는 일절 접할 수 없다. 예를 들면 cd, ls, cp, mv와 같은 기본 커맨드의 사용 방법에 대해서는 설명하지 않는다. 몰라도 되는 사전 지식 이 책에서는 아래와 같은 지식은 전제로 하지 않는다. ● 컴파일러나 인터프리터의 구조 ● 파서 제너레이터의 사용 방법 ● OS에 대한 상세한 지식 ● 어셈블리 언어 또, OS나 CPU에 대해서도 알아두어야 할 지식은 거의 요구하지 않는다. Linux에서 Shell을 사용해서 파일을 다룰 수 있고, gcc 커맨드를 사용해서 C언어의 'Hello, World' 프로그램을 컴파일할 수 있을 정도의 실력이면 충분하다. - 아오키 미네로우(靑木峰郞) ---저자 서문 중에서 |
|
컴파일러, 어셈블러, 링커, 하드웨어, 런타임 환경 등의 언어 처리 시스템의 동작원리를 해부한다.
C 언어를 축소한 C♭ 언어를 통해 컴파일러 구현 원리를 이해한다. C♭ 컴파일러를 중심으로 프로그래밍 언어의 실행 환경이 어떻게 구현되어 있는지 설명한다. 컴파일러, 어셈블러, 링커, 하드웨어, 런타임 환경에 대해 이해할 수 있다. ● 어휘 해석 ● JavaCC로 파서를 작성 ● 구문 해석 ● x86 아키텍처 ● x86 어셈블러 프로그래밍 ● 함수 호출과 변수 ● 식과 문의 컴파일 ● 스택 프레임 할당 ● 최적화 방법 ● 오브젝트 파일의 생성 ● 링크와 라이브러리 ● 프로그램의 로드 ● 위치독립코드의 생성 |