개정판 이전의 책을 학교 도서관에서 잠깐 본 뒤로 이 책을 잊고 있었다.
그러다가 최근 기회가 되어서 다시 이책을 보게 되었다. 기존에 나온 국내 도서 중에서 유닉스/리눅스 계열의 프로그래밍 유틸리티들을 정말 많이 설명하고 있다고 평가하고 싶다.
책의 전반적인 내용들은 주로 개발과 관련된 내용으로써 컴파일과 링킹, 디버깅, 에디트, 빌드를 비롯하여 버전관리 프로그램까지 유닉스/리눅스 환경에서 주로 쓰이는 굵직굵직한 유틸리티들을 다루고 있다.
책의 용도는 짬짬히 코딩하다가 참고하는 용도나 컴파일러, 링킹, 그리고 실행파일 포맷, 디버깅에 대해서 기본적으로 알아야 할 것에 대해서 학습하고 싶은 사람들에게 적당한 것 같다. 유닉스 리눅스 계열의 유틸리티 도서가 윈도우에 비해서 상대적으로 별로 없어서 그런지 같은 출판사의 윈도우 유틸리티 책 보다 좀 더 괜찮다는 느낌이 든다. 또한 책의 중간중간에 저자가 터미널로 실행한 실행화면이 포함되어 있어서 보다 의미전달이 명확하다는 느낌이다.
개인적으로 책의 설명중에서 가장 유익했던 내용은 gcc나 gdb와 관련된 내용이었다. 책의 저자가 과거에 개발했던 컴파일러 개발과 관련된 경험 덕분인지, gcc의 동작원리나 사용법, 그리고 옵션에 대해서 정말 잘 알고 있다는 느낌을 받았고, 자연스럽게 이어지는 컴파일, 링킹 과정에서의 세세한 동작들, 그리고 시스템 프로그래밍의 전반적인 부분에서 적절한 설명과 예시가 들어가 있었다는 점에서 유익한 내용이었다.
가령 예를 들어서 컴파일 과정에서 생성되는 gimple 트리를 확인하는 부분이 매우 흥미로웠다. for 문이 컴파일되면서 goto문으로 이루어진다는 사실 말이다. 또한 그 뒤에 나오는 ssa파일을 만드는 단계 또한 컴파일러의 동작 결과를 직접적으로 느낄 수 있는 지면을 제공해줬다는 점에서 매우 고마웠다.
책을 읽으면서 아쉬운 부분은 172page에 나오는 함수의 원형과 관련된 설명이다. 함수의 원형이 먼저 선언이 되어 있어야 함수 호출이 가능한 것처럼 설명이 되어 있는데, 대부분의 C언어 컴파일러에서는 함수의 원형이 선언이 되어 있지 않아도 암시적으로 호출이 가능하게끔 되어 있다. 필자도 그것에 대해서 잘 알고 있는 듯 하지만, 뒤에 가변인자와 관련된 설명에 있어서 예시를 들은 printf의 사례는 좀 부적절했다고 생각을 한다. 가변인자 함수라고 해도 함수의 원형이 없어도 충분히 호출이 가능하기 때문이다.
또한 463page에 언급이 된 "모든 프로세스는 실행될 때 위와 같은 4기가 바이트의 가상 주소 공간을 가진다." 라는 내용은 어디까지나 32bit 운영체제에서 통용되는 이야기이다. 이 부분은 누구나 다 아리라고 판단이 되지만 약간 잘못 받아들여질 여지가 있지 않나 싶다. 필자도 알고 있었겠지만 약간의 보충 설명이 있었으면 더 좋았을 거라고 생각한다.
465page 이후는 주로 스택프레임과 관련된 내용이 설명이 되어 있다. 살펴보니 c의 함수 호추 규약인 cdecl 을 기준으로 맞춰져 있다. 엄연히 이야기해서 thiscall, fastcall 등과 다른 약간 다른 방식으로 스택프레임이 만들어지기 때문에 설명을 할때 어느정도 언급이 필요하지 않을까 생각한다. 그리고 함수 스택프레임을 이루는 과정에 있어서 프롤로그와 에필로그에 대한 설명 또한 부족하다.
에디트는 주로 vim을 다루고 있으며, 따라서 vim을 주로 쓰는 사람들에게는 충분히 유용한 정보가 담겨 있다고 생각한다. 나의 경우 팁이 매우 유용하게 느껴졌다.
책을 읽으면서 저자에게 책을 써줘서 굉장히 감사하다고 말하고 싶다. 간만에 비빔밥처럼 필요한 영양이 골고루 들어 있다는 느낌이랄까.