컴퓨터
컴퓨터는 compute, 계산하다라는 동사와 -er, 특정 행동을 하는 사람이나 물건을 뜻하는 접미사의 합성어이다.
단어에서 알 수 있듯이 컴퓨터는 계산하는 물건 그 이상 그 이하도 아니다.
여느 다른 무생물이 그러하듯 컴퓨터는 생각을 하지 않는다.
보통 컴퓨터 하면 똑똑하다는 이미지를 많이 떠올리지만
이는 똑똑한 것을 무엇으로 정의하느냐에 따라 달라진다.
다른 사람이 생각하지 못하는 방법을 생각해내어 영리하게 문제를 푸는 것을 똑똑하다 한다면
컴퓨터는 세상에서 제일 멍청한 물건일 것이고
어떤 어려운 수가 얼마나 많든 간에 계산을 오차없이 정확하게 해내는 것을 똑똑하다 한다면
컴퓨터는 세상에서 제일 똑똑한 물건일 것이다.
결론적으로 컴퓨터는 생각하는 능력이 없는 계산기에 불과하며
컴퓨터가 할 수 있는 일은 사람이 어떤 명령을 내리느냐에 따라 달라진다.
그래서 사람이 컴퓨터에게 하는 명령이 바로 전세계의 수많은 프로그래머가 밤낮으로 매달리는 ‘코드’이다.
##코드는 어떻게 이루어지는가##
인간과 컴퓨터의 관계는 직장 내 상사와 부하 직원의 그것과 같다.
고객이 회사에게 주문을 넣는다.
그 주문은 간단한 목적으로 이루어져있다. 가령, “학교를 지어라” 라는 주문이라고 하자.
그러면 그 주문을 받은 회사의 사장은 부장에게 그 주문을 전달한다.
“학교를 지어라”는 주문을 받은 부장은 그 부서의 팀들에게 할 일을 할당한다.
그러면 그 팀들은 “재료를 구입한다.”, “토지를 알아본다.” 등의 세분화된 일을 부여받을테고,
그 팀의 말단 직원들은 그 부서의 임무에 따라 건축 자재를 나르든 부동산을 알아보러 다니든 할 것이다.
그러니, 고객이 말한 “학교를 지어라”라는 말이
부서에선 “여기저기 정도에 학교를 얼마만큼의 크기로 지어라” 라는 말이 되고
팀에선 “어디서 재료를 구하고 면적을 재고 어디어디 땅에다가 이렇게 이렇게 지어라” 라는 말이 된다.
고객은 건축업자가 아니기 때문에 맨 밑에서 직원들이 무슨 일을 하는지 알 리가 없다.
그래서 관련 업체한테 부탁하는 거고,
그 관련 업체는 각 위치에서 자기에게 부여된 일을 해결하기 위해 어떤 일을 해야하는지 정하고 실행한다.
이를 인간과 컴퓨터의 관계에 대입시켜보자.
인간이 컴퓨터에게 명령한다.
예를 들어 “3과 5를 더한 수가 뭔지 알려주세요.” 라고 물어봤다고 한다.
프로그래머는 간단한 코드를 작성한다.
int a = 3;
int b = 5;
printf("%d", a + b);
그리고 그 코드를 컴파일러에게 넘긴다.
컴파일러는 이 코드를 컴파일해서 어셈블리어를 작성한다.
mov eax, 3
mov ebx, 5
add eax, ebx
call print_int
그리고 최종적으로 이 코드를 어셈블러가 기계어로 바꾼다.
110111011…..
그리고 이 기계어를 컴퓨터에 읽히면 비로소 콘솔 창에 8라는 값이 출력되는 것이다.
왜 이런 과정을 거칠까?
컴퓨터는 죽었다 깨어나도 인간이 말하는 “3과 5를 더해라” 라는 말을 알아들을 수 없다.
왜냐면 앞서 말했듯 그저 물건이기 때문이다.
그러나 3과 5를 더해서 그 값을 출력하는 과정은 어디 회로에 1을 보내고 어쩔 땐 0을 보내고… 굉장히 복잡하다.
계산 값만 필요한 사람들이 그 과정을 다 알 수도 없고 알 필요도 없으니
맨 위, 혹은 그 바로 아래 단계만 알자는 것이다.
맨 위는 일반 사람이다. 프로그래밍 분야 외에 있는 사람이다.
그 바로 아래 단계는 프로그래머다. 프로그래머의 종류에 따라, 건축회사 말단 직원 바로 위에 있는 단계에서 일하곤 한다.
한 마디로 인간은 기계어를 할 수가 없으니 ‘코드’라고 하는 중간 다리를 놓는 것이다.