'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' 프로그램을 컴파일할 수 있을 정도의 실력이면 충분하다.