[컴퓨터 프로그램의 구조와 해석 - 해럴드 애빌슨 외 2인]
[컴퓨터 과학을 공부하는 이유, 자유로움과 책임]
제 글을 읽어보시는 분들은 느끼셨겠지만 요즘 부쩍 CS 관련 글을 많이 쓰고 있습니다. CS 관련된 글을 자주 쓰는 이유는 간단합니다. 요즘 공부하는 주제가 CS 분야의 주제이고, 흥미롭게 여기는 부분도 컴퓨터 과학 분야이기 때문입니다. 그런데 사실 이는 동어반복이죠. 결국 왜 CS 분야에 관심이 있을까? 라는 질문에 대한 답이 필요합니다.
자유롭고 싶기 때문입니다. 사실 컴퓨터라는 도구가 할 수 있는 있는 일은 전기가 흐르고, 흐르지 않고를 감지해서 값을 내는 것 밖에 없습니다. 하지만 우리가 사용하는 컴퓨터는 그런 수준의 원시적인 기능만 수행하고 있지 않습니다. 컴퓨터로 가능한 일은 컴퓨터로 할 수 없는 일을 열거하고 그 여집합으로 정의하는게 더 쉬울 정도로 방대합니다. 그런데 우리가 사용하는 상대적으로 고차원적인 기능을 구현하는 때에도 컴퓨터가 수행하는 일은 원시적인 일을 수행하는 경우와 동일합니다. 그냥 원시적인 경우보다 더 많이 더 빠르게 일을 수행하는 것일 뿐입니다. 이말인 즉슨 결국 누군가가 우리의 복잡하고 고차원적인 요구사항을 컴퓨터라는 단순한 기계가 인식할 수 있도록 변환해주었다는 것입니다.
그런 일을 수행해주는 도구를 컴파일러, 인터프리터라고 합니다. 인간이 사용하는 언어를 기계가 이해할 수 있는 2진수로 구성된 기계어로 변환시켜주는 도구입니다. 그런데 이 컴파일러(또는 인터프리터)라는 도구 또한 누군가가 만든 것입니다. 내부적으로 인간이 입력한 언어를 어셈블러가 어셈블리 언어로 바꾸고, 그걸 다시 링커가 변환시켜주는 일을 합니다. 그리고 이런 일련의 과정이 가능한 것은, 누군가가 미리 어떤 언어는 어떤 어셀블리어로 그리고 그건 다시 어떤 기계어로 바꾸도록 설계를 해놨기 때문입니다. 그런데, 사실 이 단계까지는 사용자에게 있어서 충분한 자유를 선사합니다. 아직 사용자가 입력해야하는 값이 아주 고차원적인 단계가 아니고, 규칙적으로 변환할 수 있는 수준의 형이하학적인 단계이기 때문에, 단순하고, 그런 단순한 기능들을 어떻게 조합하느냐에 따라서 결과물을 사용자가 의도한 대로 유도할 수 있습니다.
그런데 이 단계까지는 아직 엔드 유저의 단계가 아닙니다. 이 단계에서, 단순한 규칙들을 응용하고 조합해서 본인이 의도한 결과물을 유도하는 일을 수행하는 사람들이 보통 우리가 말하는 컴퓨터 프로그래머라는 직업군의 사람들입니다. 엔드 유저는 바로 이 컴퓨터 프로그래머들이 의도해서 만든 결과물인 프로그램을 사용하는 사람들입니다. 그리고 이 단계까지 오면 이미 많은 부분이 추상화되고, 형이상화되기 때문에 사용자가 조합할 수 있는 경우의 수가 아주 드물어집니다. 그래서 대부분의 경우, 엔드 유저는 소프트웨어 엔지니어의 상상력의 범위 안에서만 행동할 수 있습니다. 이는 편리하면서도 불편합니다. 물론 대부분의 경우, 상용 제품을 만드는 컴퓨터 프로그래머들은 일반적인 상황에 대부분의 유저가 큰 불편함 없이 제품을 사용할 수 있도록 주의깊게 제품을 만듭니다. 하지만 경우에 따라서는 이게 불편할 수도 있습니다. 특히 컴퓨터라는 무궁무진한 잠재력을 가진 도구를 다룰 때는 말입니다.
그러면 사실 답이 하나 밖에 없습니다. 본인이 공부를 해서 엔드 유저보다는 기계에 더 가까운 단계로 내려가는 것입니다. 그래야 본인이 의도한 대로, 컴퓨터라는 놀라운 도구를 다룰 수 있습니다. 그런데 이렇게 기계에 가까운 단계로 내려가면, 사용자는 더 높은 수준의 자유를 누릴 수 있지만, 동시에 많은 것을 고려해야만 합니다. 그저 버튼 하나만 누르면 되었던 것도, 이제는 메모리 할당과 가비지 컬렉션이라는 귀찮은 주제까지 고려해야만, 그나마 굴러가도록 만들 수 있습니다. 그리고 대부분의 경우 그렇게 만든 '프로그램'은 작동이 되더라도, 상용제품으로 수많은 엔지니어가 모여서, 대규모 자본이 투입되어서 만들어진 '프로그램'에 비해서 느리거나 오류를 자주 일으킵니다.
그럼에도 불구하고 컴퓨터라는 도구를 철저하게 내 통제 하에 두고 사용하고 싶은 '덕심'이 있다던가, 혹은 공부하는 과정 자체가 정말 즐겁다던가, 아니면 본인이 원하는 기능을 제공하는 상용 프로그램이 없다면, 직접 공부를 해서 만드는 수 밖에 없겠지요 :) 개인적으로 저는 1, 2번 이유 때문입니다.
1번 이유 때문에 아치 리눅스를 메인 운영체제로 썼었고, 2번 이유로 CS 전공 교과서를 마구 지르고 있으니 말입니다. 그리고 2번 이유로 CS 분야에 대해서 공부해보고 싶은 분이라면 마법사책 (Structure and Interpretation of Computer Programs) 이라는 책 읽어보시면 도움이 될 것 같습니다. 반쯤 책의 도움을 받아서 만든 것이지만 직접 레지스터 기계 시뮬레이터를 구현해보면 진짜 어마어마하게 짜릿합니다.
- 컴퓨터 프로그램의 구조와 해석에 대한 자세한 서평은 2~3회독이 마무리 되어서 내용을 어느정도 수준 이상으로 이해했다는 확신이 들면 작성하려고 합니다. 그 전까지는 가벼운 잡상 글로 대신합니다.