사실 컴퓨터 구조라는 과목은 대학교 전공에서도 한 학기에 제대로 다루기 어려울 만큼 내용이 방대하고 복잡한데요. 알아야 하는 정도는 사람에 따라 다르기 때문에, 이번 토픽에서는 소프트웨어 엔지니어들이 일반적으로 알면 좋을 내용만 선별하여 다루었습니다. 크게 다섯 가지의 주제를 알아봤는데요.
워낙에 방대하고 서로 얽혀 있는 개념이다보니, 상당히 많은 개념을 빠르게 배운 것 같아요. 이제 중요한 포인트를 다시 짚으면서 마지막으로 생각을 정리해 봅시다.
프로그래밍은 추상화의 연속입니다. 여러 차례 추상화를 거쳐서 사람의 언어에 가까운 방식으로 코드를 작성할 수 있죠. 예를 들어 20세 미만의 유저에게만 할인된 금액을 적용한다면,
if user.age < 20:
user.payment.discount(discountRate)
이런 식으로 거의 사람의 언어와 유사하게 쓸 수 있습니다.
실제 컴퓨터가 이 코드를 실행할 때는 더 긴 코드가 되는데요. 예를 들어, 기존 금액에 할인율을 곱해서 다시 저장하는 등의 코드가 실제로는 실행될 겁니다.
여기까지만 이해하면 한 단계만 이해를 한 건데요. 결국 컴퓨터는 몇 단계의 추상화를 거슬러서, 최종적으로는 0과 1로만 구성된 머신 코드에 이르게 됩니다.
0101 1110 1110 1111 1101 1111 1011 0011
1110 1111 0110 0011 1100 0001 0001 1110
1110 1011 1000 0100 0110 0100 0011 0001
1001 1000 0011 0000 0000 0000 0000 0101
이 머신 코드의 최소 단위가 바로 Instruction이고, 이건 CPU의 한 사이클(cycle)에 해당합니다. 모든 컴퓨터 프로그램은 이런 식으로 실행됩니다.
컴퓨터와 프로그램의 최소 단위를 알면 막연히 "어떻게든 되겠지" 하는 걸 넘어서 컴퓨터 구조에 대한 전체적인 감을 잡을 수 있습니다. 마치 우리가 평소에는 기가 바이트나 메가 바이트를 주로 사용하지만, 그 단위를 이루는 비트와 바이트라는 최소 단위가 뭔지 알아야 이 크기가 어느 정도인지 제대로 파악할 수 있는 것 처럼요.
그래서 우리는 컴퓨터 연산의 가장 단순한 단위인 이진법에서부터 시작해서, 논리 연산, 회로, 그리고 CPU, 머신 코드, 어셈블리 코드, 고급 프로그래밍 언어에 이르기까지, 한 단계씩 쌓아가며 살펴봤습니다.
토픽 전체 내용을 정리해 볼까요?