전반적인 느낌: 무엇보다도 번역이 매끄럽고 읽기가 편한 필체입니다. 컴파일러라는 어렵고 방대한 분야를 다룸에 있어서, 책에서 제시하고자 하는 내용의 범위를 명확하게 제시하고, 가능한 한 독자에게 어렵게 느끼지 않도록 차근차근 따라오게 하려는 저자의 의도가 반영되어 있습니다.
책의 내용: 이 책에서는 컴파일 과정을 크게 4단계(구문해석 -> 의미해석 -> 중간표현의 생성 -> 코드 생성)로 구분하고 이를 중심으로 설명합니다. 원론적인 내용보다는 Cb언어를 제안하고, 이 언어의 코드를 예시로 실제 컴파일러의 구축에 필요한 내용설명에 중점을 두고 있습니다. 여기서 Cb언어란 C언어의 축소판입니다. 새로운 언어를 정의하는 것보다 기존의 언어에서 해석하는데 모호한 부분을 제거한 언어를 정의해서 그 언어에 적합한 컴파일러를 구축하는 과정을 책에서 제시하고 있습니다.
물론 C언의 축소판인 Cb언어의 컴파일러 구축을 위해서는 C언어를 잘 알아야 합니다. 그리고 컴파일러는 Java로 구현하므로 Java언어도 잘 알고 있어야 합니다. 리눅스 관련 지식은 따로 없으셔도 될 듯 합니다.
가장 기억에 남는 부분은 "12장. x86 아키텍처의 개요"입니다. 이 장에서는 기초적인 개념을 위주로 컴퓨터 구조에 대해 설명합니다. CPU의 개발역사와 x86이란 무엇인지부터 시작하여 CPU에 대하여 다루고, 메모리 부분에서는 C언어 포인터와 연계하여 메모리 관련 설명을 합니다. AMD64 명칭의 유래, 다양한 레지스터의 종류. C언어의 분기 등의 문법적인 요소의 처리과정. 수치값과 데이터형의 저장 방식을 다룹니다. 예전에 구조체 타입의 변수는 크기가 4바이트의 배수 단위로 할당된다거나 4바이트 수치값이 메모리상에서 1바이트씩 꺼내서 보면 반대로 저장되어 있는 경우에 리틀엔디안, 빅엔디안 차이라고 막연히 알고 있었는데 이번기회에 예전에 가졌던 의문점들이 많이 해소되기도 했습니다.
문자열 분석의 마법사인 정규표현을 간략하게 하기 위해 정규표현식을 이해하기 복잡하게 구성할 수도 있습니다. 그러나 간단한 규칙부터 시작해서 처리못하는 문제점을 짚어가며 수정, 확장해 나갑니다. 살을 붙여 설명하는 방식이 눈에 정말 좋은것 같습니다.
책의 구성: 다른 책들에 비해 목차가 상당히 상세하다고 할 수 있습니다. 책의 시작부분에서 전체적으로 본문에서 다룰 내용은 무엇인지, 이해를 돕기 위한 주변 지식으로 어떤 사항들이 필요로 하지만 해당 영역들을 실제로는 이 책에서는 다루지 않는다고 친절하게(!) 언급합니다.
컴파일러 구축에 관한 주제를 여러 개의 소주제로 나눈 여러장으로 구성하고, 각 장은 다수개의 절을 포함하고 있습니다. 장과 절의 시작부분에 한 문장씩을 할애하여 이장에서는 어떤 내용을 다루는지, 이절에서는 어떤 내용을 다루는지 명시하고 있습니다. 마지막 부분에서는 다음장에서 다룰 내용을 언급하기도 합니다. 학습하는 입장에서 또는 참고 서적으로 활용하는 관점에서 볼때 한 장을 다 읽기 전에 원하는 내용을 미리 알수가 있어서 필요한 정보를 빨리 습득하는데에(?) 많은 도움이 될 것 같습니다.
한가지 특이한 점은 22장에서는 추가적인 지식습득을 위한 참고서적에 대해 다루고 있다는 것입이다. 컴파일러, 구문해석, 어셈블러, 링크와 로드, 예외, 가비지 컬렉션, 함수형 언어 등등. 대부분이 원서이거나 출판된지 상당한 시간이 지난 서적들이어서 직접 구하는 것은 쉽지 않겠지만, 그 목록을 별도의 챕터로 제공한다는 점에서 상당한 의미가 있다고 생각합니다.
좋은점:
이 책에서 다른 컴파일러 책들과 달리 가장 유용하다고 느끼는 부분은 어셈블러 문법을 다룬다는 점입니다. 또한 MASM과 GNU as의 차이점도 짚어주고 있습니다. 어셈블러의 문법은 처음보는 독자에게는 생소하고 어렵게 느껴질테지만 저자는 좌절하지 않도록 다양한 명령들에 대한 의미와 함께 자세하게 설명해줍니다. gcc의 -S 옵션 설명을 시작으로 소스파일이 실행파일로 변환되는 과정을 살펴보고 각 단계에서 일어나는 일들을 설명합니다(C언어의 어셈블러 언어로의 출력, 이 어셈블리 언어의 GNU 어셈블러로 어셈블처리, 생성된 오브젝트 파일의 링크로 실행가능한 파일 생성). 이 책에서 구현하는 cbc(Cb언어의 컴파일러)도 이 사상을 모방하고 있다고 합니다.
아쉬운점:
일명 드래곤 북이라 불리던 컴파일러에서 다루던 오토마타 관련 내용은 자세히 언급하지 않습니다. JavaCC 자체에 대한 설명은 다루고 있지 않습니다.