전산학은 나날이 발전해서 1990년대의 멀티미디어가 주목받던 시절에 32 poly 출력이 가능한 사운드카드 기능은 이제는 9만원되는 메인보드에 내장된 형태로 공급이 됩니다. 이제는 4K를 처리하는 영상 인코더나 기본으로 16GB램을 요구하는 CG 처리 소프트웨어, 수백와트의 전력을 소모하는 그래픽 카드까지 아주 높은 성능의 멀티미디어 기술이 개발되어 일반화된지 오래입니다.
이들 작동은 물리적인 수준에서 들여다보면 아주 단순한 작동인데요. 컴퓨터와 주변기기가 작동하는 가장 기저의 반응은 두가지 상태밖에 없습니다. (1) 전류가 인가되었다. (2) 전류가 해제되었다. 이 두가지 상태가 반복적으로 나타남으로써 특정한 기능이 작동됩니다. 이 특정한 기능을 나타내는 상태의 연쇄는 임의적이구요. 예를 들면 전류가 두번 인가되고 두번 해제되면 (1′) 데이터를 쓰라, 반대로 전류가 두번 해제되고 두번 인가되면 (2′) 데이터를 읽어라 라고 개발자가 정의했다면 그렇게 작동하도록 하드웨어가 제작됩니다.
그런데 실재로 처리할때는 (1)과 (2)만으로는 안되고, 단위 시간당 예컨데 1초 동안 50억번의 연산을 수행한다면 아주 지루하고 긴 전류의 흐름만을 보게 됩니다.
사람이 다루어야 할 필요가 있었기에 초창기 디지털 컴퓨터들은 이진법을 도입합니다. 컴퓨터가 처리하는 상태는 두가지 이므로 숫자를 두가지 숫자로 처리하는 이진법을 도입해서 0은 전류가 안통하는 상태, 1은 전류가 통하는 상태로 정해서 (1′)은 1100 (2′)는 0011로 표기하자고 정했습니다. 그래서 컴퓨터가 작동하는 명령어나 데이터들을 나타내는 이진법 수는 000010101111010101010110 등으로 매우 길고 복잡합니다.
컴퓨터가 처리할 수 있는 데이터의 뭉치가 커지면서 64비트 CPU가 장착되면 2의 64승개의 경우가 표현됩니다. 이 거대한 수를 0과 1로만 나타내면 매우 길어서 지면이 낭비됩니다. 다 읽고 기억도 안되구요. 그래서 메모리를 구간으로 나누어 주소를 부여하고 그 주소는 16진수로 나타내기로 하게 되었죠. 7비트 메모리라면 0x0, 0x1, 0x2, 0x3, … 0x6까지 7개로 표현이 되고 이게 16GB 램으로 되면 더 길지만 이진수로 표현한 것보다는 짧은 형태로 메모리 주소가 표현되게 됩니다.
프로그래밍의 초창기에는 아주 복잡한 처리는 필요가 없었고, 메모리 특정 비트나 레지스터에서 값을 저장하고 꺼내와서 연산을 시키는 것만으로도 유의미한 작동이 보장되었습니다. 그래서
에서 소개한 것처럼
1 2 3 4 5 6 7 |
mov %ax, $1 loop: add $2, %ax cmp $10, %ax jle loop |
와 같은 어셈블리 언어로 번안이 되도록 했습니다. 이는 이진법으로 표기하면
1 2 3 4 5 6 |
10011111 0000001 00101101 0000010 00110001 00001010 1101001 1011001 |
처럼 되는데요. 컴파일하면 이런 형태로 저장이 되게 됩니다. 컴퓨터가 즉시 이해가능한 형태라고 흔히 말합니다.
하지만 현대 소프트웨어 처리 요구사항처럼 몇백개의 폴리곤을 표현한다든지, 4K 영상을 무압축으로 캡처받아 처리하려면 저위의 코드만으로는 매우 지난한 처리가 필요하고 가능하지도 않습니다. 그래서 더욱 더 번안을 해서 사람이 알아보기 쉽게 만든 코드로 보다 더 고차원의 번안(컴파일)이 가능한 언어들이 개발되어 지금도 쓰이고 있습니다.
1 2 3 4 5 |
count = 1; while (count <= 10) count = count + 2; |
와 같은 C 언어는 위의 명령과 유사합니다. 하지만 알아보기 쉽고, 조합의 가지수가 더 다채롭습니다. 이 장점의 의미는 보다 더 추상화가 고도화된 체제에서 프로그래밍이 가능해지고 더 견고하고 구조화된 작업이 가능하게 된다는 것입니다.
여기서 더 추상화가 진행되면 자료구조, 알고리즘, 디자인 패턴, MVC 이론 등등이 고안이 되죠.
정리하면
(a) 하드웨어의 작동은 전류의 인가와 해제 둘뿐이다
(b) 이진법과 16진법으로 (a)를 표현할 수 있다
(c) 프로그래밍은 (a)와 (b)을 추상화한 것으로 이해도 쉽고 결과물도 구조화되게 해준다
(d) 추상화의 수준이 올라가면 각종 프로그래밍 방법론으로 발전한다
이 두가지구요. 이들의 관련성을 알면 전산학을 배울때 그냥 넘어감없이 찜찜하지 않게 학습이 됩니다. 이러한 개념을 소개하는 책을 자주 읽고 여러권 참고하면 좋습니다.