컴퓨터가 일상에서 빼놓을 수 없는 도구가 된지도 벌써 오래 되었죠. 플로피 디스크가 있던 시절부터 컴퓨터를 다루는 법을 배우긴 했지만, 막상 컴퓨터가 어떻게 구성되었고 어떻게 작동하는지를 배운 적은 없었던 것 같습니다. 크게 관심을 갖지도 않았었구요.
사실 우리가 대부분의 기계를 다루는 방식도 그럴 것 같습니다. 냉장고가 어떻게 동작하는지 원리를 알지는 못해도, 우리는 냉장고에 과일을 저장하고 또 저장된 음료를 꺼내 마시곤 하죠. 에어컨이 어떻게 동작하는지는 몰라도 리모컨의 버튼을 눌러 에어컨을 켜고 끌 수는 있을 겁니다. (프로그래밍에서 추상화라고도 부르는 것과 비슷하다고 할 수 있겠습니다.)
하지만 프로그래머 공부를 시작한 이상 컴퓨터 과학에 아예 무지할 수는 없겠죠. 물론 잘 몰라도 프로그래밍을 못한다는 뜻은 아니지만, 컴퓨터가 동작하는 것을 더 잘 이해할수록 프로그래밍에도 도움이 될 것은 분명해보입니다. 추상화는 사용하는 유저들을 대상으로 하는 것이지 프로그래머도 몰라야 한다는 뜻은 아니니까요.
컴퓨터에서 가장 중요한 핵심적인 부품은 바로 CPU 와 RAM 이라고 할 수 있습니다. CPU 는 Central Processing Unit(중앙 처리 장치) 의 줄임말이고 RAM 은 Random Access Memory(임의 접근 메모리) 의 줄임말이죠.
컴퓨터는 주어진 명령에 따라 데이터들을 조작합니다. 이 때 RAM 에는 컴퓨터가 수행해야 하는 명령들과 이에 필요한 데이터가 저장되고, CPU 는 RAM 으로부터 명령과 데이터를 읽어 적합하게 연산을 처리합니다. 그리고 CPU 가 처리한 연산의 결과는 다음 연산을 위해 사용될 수 있도록 다시 RAM 에 저장됩니다.
컴퓨터가 작동한다고 하는 것은 결국 이렇게 RAM 과 CPU 가 데이터를 주고 받으며 코드를 순차적으로 처리하는 것이죠. 다만 그 동작하는 속도가 우리가 인지할 수 없을 정도로 매우 빠르기 때문에 우리는 어떤 프로그램을 끊김 없이 사용할 수 있는 것이죠. (물론 종종 끊길 때도 있지만요..)
CPU 아키텍처, 즉 CPU 의 구조라고 하는 것은 늘 동일한 것은 아닙니다. 만드는 회사에 따라 달라지는 것이죠. 코드스테이츠 공부를 시작하면서 M1 맥북 에어를 장만해서 사용하고 있는데요. M1 은 애플에서 개발한 ARM 기반의 CPU 라고 할 수 있겠습니다.(실제로는 CPU만은 아닙니다.)
그런가 하면 기존의 맥북에 들어가던 Intel 에서 만드는 CPU 도 있겠죠. 이렇게 구조가 다르면 CPU 를 동작시키는 명령어도 달라지기 때문에 결국 상호간에 호환의 문제가 생깁니다. 같은 프로그램이라 하더라도 다르게 명령되어야 각각의 CPU 가 이를 이해하고 처리할 수 있다는 것이죠.
어떤 게임이 구글 플레이로만 출시되고 애플 스토어에는 출시되지 않았다면, 아마도 안드로이드를 사용하는 개발진밖에 없어서일 겁니다. 이런 경우도 마찬가지로 CPU 아키텍처가 다르고 이에 따라 사용하는 프로그래밍 언어가 다르기 때문에 생기는 문제라고 할 수 있습니다.
컴퓨터가 이해하는 언어를 기계어라고 합니다. 쉽게 말해서 0 과 1 으로만 이루어진 언어라고 할 수 있죠. 하지만 사람이 이를 직접 작성하기에는 무리가 있습니다. 배우기도 어렵고 생산성이 극도로 낮을 수 밖에 없거든요. 그래서 뛰어난 몇몇 형님들이 프로그래밍 언어라는 것을 만들어냈습니다.
프로그래밍 언어는 조금 더 인간 친화적인 언어라고 할 수 있습니다. 일련의 명령어들을 사람이 조금 더 이해하기 쉽게 표현할 수 있도록 한 것이죠. 이해하기 쉽다는 것은 곧 작성하기 쉽다는 뜻이고 생산성이 향상된다는 뜻일 겁니다. 하지만 이렇게 해서는 컴퓨터가 알아들을 수 없으니 컴파일러를 통해 컴파일이라는 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역을 하게 됩니다.
그런가하면 프로그래밍 언어의 한 갈래로 스크립트 언어가 있다고 합니다. 자바스크립트가 이에 해당하는데요. 이런 언어는 컴파일을 해서 CPU 가 직접 읽을 수 있는 언어로 변환하는 대신, 인터프리터라는 것을 통해 실행하게 된다고 합니다. 컴파일러를 사용하는 것이 미리 책을 번역해 출간하는 것과 비슷하다면, 인터프리터를 사용하는 것은 동시 통역과 비슷하다고 생각할 수 있겠습니다.
책을 번역하는 것은 처음에는 번역하는 데 시간이 걸리지만, 한 번 번역해두고 나면 더 이상 딜레이 없이 읽어나갈 수 있죠. 하지만 동시통역은 상대방이 말을 하고 나면, 그 말을 통역하는 과정을 거쳐서 전달하기 때문에 아무래도 딜레이가 생길 수 밖에 없습니다. 인터프리터도 이와 비슷하다고 할 수 있는데요. 작성한 코드를 즉시 실행할 수 있는 장점이 있는 대신, 성능에 있어서는 조금은 희생할 수 밖에 없는 것이라고 생각할 수 있습니다.
다만 컴퓨터의 성능이 매우 우수해지고 있는 만큼 그 차이는 매우 미세하다고 할 수 있습니다. 물론 언제나 좋은 컴퓨터만을 사용하는 것이 아니기 때문에, 컴퓨터의 규모를 제한해야 하는 경우에는 그 차이를 무시할 수 없을 수도 있겠죠. 어떤 언어를 사용해야 할지의 여부는 결국 목표를 어떻게 달성할지에 따라 갈리게 될 겁니다.
위의 내용은 "한 권으로 그리는 컴퓨터과학 로드맵" 이라는 책의 7장, 컴퓨터의 동작 원리 부분을 나름대로 소화하고 정리한 내용입니다. 많이들 추천하시는 책이어서 구매했는데, 내용이 막 그렇게 쉽지는 않은 듯 합니다.
그래도 예전에 읽어봤을 때와 어느 정도 공부를 진행하고 난 지금 다시 읽어보고 비교해보니 확실히 소화되는 영역이 더 많아졌네요. 나중에 또 읽어보면 그만큼 더 이해되는 폭이 넓어지지 않을까 하는 기대를 품게 됩니다. 좋은 책이니까 컴퓨터 과학에 대해 이해하고 싶으신 분들은 한 번 읽어보시기를 추천합니다.