컴퓨터구조 란 컴공이라면 누구나 한번쯤 들어봤을 과목이다. 자료구조를 자구, 알고리즘을 알골 이라고 줄여부르듯 우리는 컴퓨터구조를 컴구 라고 불렀다. 그러나 컴퓨터구조 과목은 프로그래밍 과목과는 조금 거리가 있어 대체로 좋아하지 않는다. 일부 대학에선 전공필수과목으로 졸업을 위해선 꼭 들어야 하는 경우도 있다지만 대개 전공선택 과목이라 얼마든지 피할 수 있다.
인스타그램에 '컴구'를 검색하면 불행하고 아프고 노답이라는 사진이 많이 뜬다.
하지만 전공을 살려 실력있는 개발자가 되기 위해서는 꼭 배워야 할 과목이라고 생각한다. 당장 피하더라도 결국 나중에 만나게 되어있다. 프로그래밍을 잘 하기 위해서는 컴퓨터 안에서 프로그램이 어떻게 작동하는지, 컴퓨터의 작동방식은 어떤지 아는 것이 중요하기 때문이다. 대학생활을 돌이켰을 때 조금 후회가 되는 것 중 하나가 이 과목을 듣지 않고 지나쳤다는 것이다. 하지만 이번에 << 컴퓨터 아키텍처 >> 라는 컴퓨터구조 전공도서를 제공받아 독학이라도 할 수 있게 되어 정말 기쁘다. 한빛아카데미 관계자분들께 감사하다는 말씀을 드리고 싶다.
외국 전공도서와의 비교
외국 전공도서 표지 해외의 컴구 전공 책으로는 Morgan Kaufmann 에서 발간한 Computer Organization and Design 이라는 책이 유명하다고 들었다. 심지어 리뷰할 책의 참고문헌 두번째에 수록된 책이기도 하다. 외국 서적을 주 교재로 쓰는 대학에서도 이걸 주로 쓰는 것 같다. 이 책은 리뷰할 책보다 200페이지 정도 더 많은데다 영어라서 아직 다 읽어보지는 못했지만, 몇 가지 겹치는 주제에 대해서는 조금 비교해 볼 것이다. 그나저나 책 표지가 아이패드 주판이라니... 의도는 알겠는데 뭔가 좀 이상하다
구성
책 목차는 아래와 같다.
- 컴퓨터 시스템의 개요
- 컴퓨터의 발전과 성능
- 명령어 집합
- 명령어 집합의 분류와 주소 지정 방식
- 데이터와 디지털 논리회로
- 연산장치
- 데이터 경로
- 제어장치
- 파이프라이닝
- 메모리
- 캐시 메모리
- 가상기억장치
- 주변장치
- 데이터 전송 방식과 버스 구조
- 병렬 처리
목차가 굉장히 알차게 구성되어 있다. 챕터 내부적으로도 세세하게 나누어져 있다. 컴퓨터에 대한 내용을 포괄적으로 다루기 때문에 다른 분야를 공부할 때에도 정말 도움이 많이 될 것 같다.
학습 로드맵 학습 로드맵이 굉장히 친절하다. 사진엔 나와있지 않은 왼쪽페이지에서는 로드맵의 항목별로 어떤 내용을 다루는지 설명도 해준다. 첫 페이지부터 끝까지 보는 것도 좋으면서 필요한 부분만 찾아보기에도 좋은 구성이다. 책 구성만 자세히 읽어도 내용이 머리에 정리되는 기분이 들 정도다.
구성 비교
아래는 Computer Organization and Design 의 목차다.
- Computer Abstractions and Technology (컴퓨터의 간략한 소개)
- Instructions: Language of the Computer (소개: 컴퓨터의 언어)
- Arithmetic for Computers (산술계산을 위한 컴퓨터)
- The Processor (프로세서)
- Large and Fast: Exploiting Memory Hierarchy (메모리 계층)
- Parallel Processors from Client to Cloud (병렬처리)
저자의 의도가 확연히 다름을 알 수 있다. 이 책도 챕터 내부적으로 세세하게 나누어져 있지만 한 챕터당 다루는 내용이 많아 호흡이 긴 편이다. 이 책에서는 파이프라인을 프로세서의 서브챕터로 다루는 식이다. 큰 구성만 놓고 보면 더 간결한 것 같지만 서브 챕터가 방대하고 흐름이 이어지는 구조다보니 원하는 부분만 골라보기가 좀 힘들게 되어있는 것 같다.
디자인
컴퓨터아키텍처 표지 내용이 가장 중요하다고는 하지만 이왕이면 예쁜 것이 좋다. 보기 좋은 음식이 먹기에도 좋은 법. 단언컨대 디자인 만큼은 정말 잘 빠진 책이다. 전공책이라고 못생겨야만 한다는 법은 없으니. 전체적으로 공대 감성을 살리면서도 예쁜 디자인이 참 마음에 든다.
내부 그림
책 내부 그림 책에 그림이 많다. 헷갈릴 수 있는 복잡한 개념은 항상 그림이 첨부되어 이해하기 쉽도록 되어있다. 그림도 깔끔하다. 전체적으로 공을 많이 들인 친절한 책이라는 게 느껴진다. 같은 주제의 외국 서적과 비교하면서 보는데, 이 책의 그림이 정말 친절했다.
다른 책 내부 그림
이건 위에서 언급한 외국 서적의 그림이다. 위의 그림보다 조금 더 간단한 플로우임에도 조금 더 복잡해보인다. 색으로 강조하거나 분리하는 부분도 거의 없다. 잉크를 아끼려고 한 것 같진 않지만, 전반적으로 흑백으로 딱딱하게 설명하는 느낌을 준다. 흑백의 딱딱한 느낌을 좋아하는 사람들도 있지만 색 또한 유의미한 정보라고 생각하는 나에겐 그닥 좋아보이지 않는다.
내용
컴퓨터의 동작 원리를 이해하고자 하는 컴퓨터/전기.전자/정보통신 공학과 학생과 컴퓨터 시스템을 개발하는 연구소 및 기업체의 연구원을 대상으로 합니다.
- 저자 서문 발췌
사전 지식을 크게 요구하지 않아서인지 내용이 머릿속에 잘 들어온다. 그림도 친절하고, 내용도 정리가 잘 되어있다. 그림과 도표 정리가 너무 잘 되어있어서 이해가 빠르게 되는 느낌이 들어서 좋다. 컴퓨터 구조에 대한 기초와 원리를 잘 설명해준다. 그렇다고 마냥 개론적인 내용만 다루는 느낌은 아니고, 깊이있는 부분까지 끌어올려주는 느낌이다. 정말 깊이있고 전문적인 내용은 다른 학술서적이나 논문같은 걸 봐야 할 것 같다. 컴퓨터에 대한 전반적인 내용을 다루기 때문인지 운영체제나 논리회로 등의 내용도 조금 겹친다.
용어를 풀어서 설명 가장 인상깊었던 부분 중 하나는 용어의 원문을 친절하게 잘 설명해준다는 것이다. 외국 서적을 선호하는 이유 중 하나가 바로 용어의 혼란 때문이기도 한데, 이 책은 핵심이 되는 단어들을 영어로 따로 풀어서 설명해준다. 사실 나도 비트에 대해 그저 Bit로만 알고 있었는데, 이 책을 통해 Binary Digit의 줄임말이라는 사실을 다시 배웠다. 용어를 자세히 제대로 알고 있는 건 누군가에겐 사소해 보일 수 있겠지만 내겐 정말 중요한 점이다. 핵심용어를 모두 영어로 따로 알려주는 건 정말 큰 장점이다.
전문용어를 한글로만 설명해주는 건 일부 국내서적의 치명적인 단점 중 하나인데, 이 책은 해당되지 않는다. 나는 갈무리라던가, 단순 우편전송 규약이라던가, 교착상태 같은 용어처럼 굳이 한글화하지 말고 그냥 캡쳐(Capture), SMTP(Simple Mail Transfer Protocol), 데드락(Deadlock) 이라고 부르는 게 맞다고 보는 편이다. 한글화 하면 이해가 빠르고 좋을 수도 있겠지만, 현업에서나 외국에선 영어로 된 원래 용어를 주로 쓰기 때문이다. 한글 용어만을 알고 배우는 것은 크게 보면 텔레비전에 대해 전파상자라고만 배우는 것과 크게 다를 게 없다.
주로 개념을 다루는 책이기 때문에 개발에 직접 참고할 만한 예시나 예제코드같은 건 딱히 없다. 마치 자료구조에서 연결리스트(Linked List)에 대해 원리를 설명해주고 실제 구현코드를 알려주지 않는 것과 비슷하다고 할 수 있다. 누군가는 이게 단점이라고 생각할 수 있지만 나는 이 책의 목적에 충분히 부합되는 현명한 결정이라고 본다. 코드를 다룰 만큼 깊이있는 내용은 앞서 비교대상으로 꼽은 외국 서적이나 프로세서를 깊이 다루는 다른 전문서적을 보면 될 것 같다.
프로그래밍에 직접적으로 연결되는 책은 아니지만, 생각의 폭을 넓히는 데 큰 도움이 되는 책이다.
내용 비교
위에서 언급한 해외 서적은 MIPS 명령어를 중심으로 설명을 한다. 어셈블리로 배우는 컴퓨터 구조 느낌이 강하다. 저 책의 저자 중 한 명이 MIPS의 개발자 멤버라서 그런 것 같다. 아래와 같이 어셈블리 코드가 중간중간 튀어나온다. 그나마 친절한 파트는 C언어로 설명을 하는데, 이마저도 컴파일러 관련 내장 라이브러리를 include 하여 C를 어셈블리에 가깝게 쓴다.
void dgemm (int n, double* A, double* B, double* C) { for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) { double cij = C[i+j*n]; /* cij = C[i][j] */ for( int k = 0; k < n; k++ ) cij += A[i+k*n] * B[k+j*n]; /* cij += A[i][k]*B[k][j] */ C[i+j*n] = cij; /* C[i][j] = cij */ } } ... vmovapd (%r11),%ymm4 mov %rbx,%rax xor %ecx,%ecx vmovapd 0x20(%r11),%ymm3 vmovapd 0x40(%r11),%ymm2 ... 위와 같은 코드가 중간중간 나오니, 책을 제대로 이해하기 위해서는 기본적으로 C도 알아야 하고 어셈블리도 알아야 한다.
특정 파트에 대해서는 아무래도 좀 더 심도깊은 내용을 다루는 것 같다. 그만큼 난이도가 있어서 사전지식을 필요로 한다. 그리고 ARMv7, ARMv8, Intel Core i7 등을 대략적으로 설명을 해주고 넘어가는데, 이러한 점은 좋은 것 같다.
장점과 단점
위에서 장점을 장황하게 설명했는데, 대충 요약을 하자면 아래와 같다.
- 간결한 설명친절하고
- 체계적이고 모듈화된 구성
- 도표와 그림이 많아 이해하기 쉬움
- 쉬운 내용부터 고급 내용까지 찬찬히 다룸
- 핵심용어의 원문을 모두 설명해줌 (* 중요)
- 책이 충분히 공돌이스러우면서도 예쁨
- 책의 옆면
챕터의 호흡이 상대적으로 짧아 내용에 비해 쉽게 느껴지는 느낌
하지만 이 책엔 치명적인 단점이 하나 있다. 연습문제에 해답이 제공되지 않는다는 것이다. 정답을 수록하지 않아서 문제를 풀어도 찝찝한 기분이 든다. 홈페이지에도 정답이 없다. 게다가 연습문제의 구성도 사실 그리 좋게 느껴지진 않았다. 대체로 정보처리기사 시험문제 푸는 그런 느낌이었다. 전반적으로 문제를 통해 깊게 생각할 여지를 준다기보단 낚시용 문제라거나 암기 테스트 느낌이 드는 것들 위주로 구성되어 있다. 다 좋은데 이 점은 확실히 아쉽다.
..굳이 단점을 요약해보자면 아래와 같다.
- 연습문제에 정답이 제공되지 않음 (* 중요)
- 연습문제가 암기유무 측정 위주로 구성됨
- 밑바닥 기초부터 설명하기에 지루해 할 사람이 있을 수 있음
- 프로그래밍으로 직접적으로 연결되지는 않음
- 실제 쓰이는 ARM이나 Intel 프로세서 관련 내용을 직접 다루진 않음
장점만큼 단점도 리스트를 꾸며야 할 것 같아서 조금 두서없이 적어봤지만, 사실 단점의 핵심은 연습문제 하나다. 다음 개정 때 맨 뒷장에 정답을 제공해주면 좋을 것 같다.
마무리 및 평점
이 책은 쉽게 쓰인 책이다. 쉬운 내용부터 깊이있는 내용까지 차근차근 다루기 때문에 체계적으로 이해하고 원리를 배울 수 있다. 전반적으로 중요한 내용을 모두 다루면서도 입문자를 위한 배려도 놓치지 않았다. 도표와 그림으로 친절하게 설명해주기 때문에 술술 읽히는 느낌이다. 그렇다고 마냥 쉽지만은 않으니 컴퓨터 전공자나 진지하게 컴퓨터 전공을 배울 의지가 있는 사람들에게 정말 좋을 것 같다. 개인적으로 이 책으로 컴퓨터구조를 배운 후에 비교 대상으로 꼽았던 MK에서 발간한 Computer Organization and Design 을 훑어보면 정말 좋겠다는 생각이 들었다.
이 책을 통해 진정한 엔지니어로 한 걸음 더 나아가는 계기가 되었길 바란다. 저자의 말대로 컴퓨터의 기능을 활용하는 수준에서 벗어나 언젠가 컴퓨터 기술 발전에 원동력이 되었으면 좋겠다.
이 리뷰의 원문은 https://blog.chann.kr/computer-architecture-hanbit-book-review/ 에서도 볼 수 있습니다.