본문 바로가기

독서 노트

[책] C언어 창시자가 알려주는 <C 언어 프로그래밍>

올해 초 즈음 알게 된 C 언어 프로그래밍 책이다. 무려 C언어를 만든 데니스 리치가 참여하여 쓴 해설서이다. 나무위키에서 C 언어 항목을 읽다가 찾아낸 책인데 여기저기 알아보니 꽤 유명한 책이었다. 책을 읽어보기로 마음먹을 당시에는 마침 육아휴직 중이고 공부하고 싶은 열망이 강해서 금방 읽을 수 있을 줄 알았다. 이런저런 일을 하다 복직도 하고 그러다 보니 책을 다 읽는데 시간이 걸리고 말았다.

이 책은 C 언어를 알려주는 책이지만, 결코 초보자를 위한 책은 아니다. 어느 언어로든 한 번은 프로그래밍해본 사람이 읽기에 적합하다. 호기롭게 첫 프로그래밍 책으로 이 책을 선택한다면 도중에 그만두게 될 가능성이 크다. 왜 그런가 하면 책에 실린 수많은 예제가 다른 입문서의 예제보다 어렵다. 예제 프로그램이 동작하는 원리를 파악하려면 코드를 유심히 살펴봐야 한다. 학교에서 C 언어를 배울 때, 가독성을 위해서는 하지 않는 게 좋다는 방식을 저자는 아무렇지도 않게 사용한다. 예를 들면 아래와 같은 식이다.

if (argc == 1)
    filecopy(stdin,stdout);
else
    while (--argc > 0)
        if ((fp = fopen(*++argv, "r")) == NULL) {
            printf("cat: can't open %s\n", *argv);
            return 1;
        } else {
            filecopy(fp, stdout);
            fclose(fp);
        }

두 번째 if문의 조건식을 보면 안에서 꽤 많은 일을 하고 있다는 것을 알 수 있다. C 언어를 만든 사람이 해설하는 것이어서 그런지, '나는 C 언어가 이렇게 동작할 것을 잘 알기 때문에 이렇게 써도 돼'라고 말하는 것 같았다. 물론 그게 틀렸다는 것은 아니다. 여태 저렇게 코드를 쓸 자신 없어서 여러 줄로 나누어 코드를 작성했던 나의 문제이자 취향의 문제이다.

지금은 경고 처리되는 오래된 방식으로 적힌 코드를 구경하는 것도 신선하다면 신선했다. 예를 들면 함수의 반환 값을 적지 않아도 된다던가. (자동으로 int형을 반환한다) 참고로 이 책은 C89 시절 기준으로 쓰인 해설서이다. 그래서 지금의 문법과 약간의 차이가 있다는 점을 알고 책을 읽는 게 좋다.

아쉬운 점이라면 오타가 간혹 보인다는 것이다. 설명 중에 생긴 오타는 가볍게 넘어갈 수 있는데, 문제는 코드에 오타가 있다. 예제 코드가 쉽지 않다 보니 집중해서 봐야 하는데 갑자기 처음 보는 변수가 나타나면 내가 놓친 게 있나 싶어 다시 처음부터 코드를 읽곤 했다. 정오표가 있나 모르겠는데, 만약 책을 읽고자 한다면 정오표를 찾아서 보는 게 좋을 것이다.

요즘처럼 배울 게 많은 세상에 왜 다시 C 언어 책을 읽었냐 물어본다면 이 언어를 만든 사람의 생각과 철학을 이해해보고 싶어서이다. 아주 완벽히 잘하지는 않지만 그래도 C 언어를 사용하는 데 큰 어려움은 없다. 그런데도 나는 C 언어를 이해하고 있다고 자신 있게 말하지 못한다. 프로그램만 잘 만들면 되지 무슨 철학 타령이냐고 말할 수도 있다. 조금 더 생산적인 언어로 많은 프로젝트를 경험하는 게 효율적일 수도 있다. 그 말에 반대할 생각은 없다. 하지만 한편으로는 '장인정신'을 가지고 프로그래밍을 하는 마음가짐도 필요하지 않을까. 자신이 사용하는 도구가 어떻게 탄생했고 왜 이렇게 생겼는지, 그리고 어떻게 해야 제대로 사용하는지 이해하는 시간을 가져보는 게 그리 헛되지는 않다고 생각한다.