컴퓨터가 처음 만들어졌을 때, 사람들은 어떻게 프로그래밍을 했을까? 사실, 처음에는 하나의 프로그램을 회로로 구성해서 컴퓨터를 만들었기 때문에 다시 프로그래밍을 할 수 없었다. 초기 컴퓨터는 마치 탁상용 전자계산기와 같았다. 에니악(Eniac)도 배선판을 교체해야 다른 프로그램을 실행할 수 있었는데, 천공카드를 기억장치로 사용했다[1].
실제 프로그래밍은 1949년에 에드박/에드삭과 같은 프로그램 내장형 컴퓨터가 만들어진 이후 가능했다. 프로그램은 기계가 이해할 수 있는 명령어로 구성되어 있는데, 이를 기계어라고 한다. 실제 기계어는 0과 1을 구분할 수 있는 이진수로만 이루어져 사람이 이해하기 어렵다.
그래서 생겨난 것이 어셈블리어(Assembly Language)다. 특히, 에드삭도 이미 오늘날도 같이 initial orders라는 어셈블리어를 사용해서 실행 코드를 작성했다. 실제 에드삭에서 사용한 어셈블리어 언어 예이다[2].
에드삭에서 사용하는 기계어 명령어는 모두 17비트로 이루어져있다. 첫번째 열이 동작코드(Operation code) 이고, 두번째 열인 1비트는 사용하지 않는다. 세번째, 열은 피연산자(operand)인데, 주소를 나타낸다. 마지막 비트는 현재 명령어가 17비트인지 또는 35 비트를 사용하는지 여부를 표시한다.
첫번째 명령어는 T라는 명령코드를 사용했는데, A를 의미하는 누산기(accumulator)에 있는 데이터를 메모리에 입력하고 누산기 데이터를 초기화하는 명령어이다. 두번째 명령어는 H라는 명령코드를 사용했는데, 메모리에서 데이터를 가져와 곱산 레지스터 R에 입력한다.
이와 같이, 기계어는 명령어 자체가 이진수에 불과하기 때문에 사람이 기억하고 바로 코드를 이해하기가 어렵다. 그래서 각각의 명령어를 상징적 기호(mnemonics)로 표현하여 어셈블리(assembly) 언어를 만들었다. 이렇게 표현된 코드를 CPU가 이해할 수 있는 기계어 코드로 변환하는 것으로 어셈블링(assembling)이라고 한다.
초기에는 이를 일일히 손으로 했기 때문에 핸드 어셈블링이라는 말을 사용했다. 물론, 어셈블링 도구가 없으면 지금도 니모닉 변환표를 보고 손으로 직접 어셈블링을 해야 한다. 이처럼 이미 1950년대 부터, 프로그래머들은 어셈블리어를 사용할 줄 알았다.
그런데, 1960년대까지 키보드와 모니터가 상용화되지 않았다. 최초로 모니터와 키보드가 달린 컴퓨터는 1964년 벨연구소와 MIT대학이 함께 개발한 멀틱스(Multics)였고[3], 1970년대 와서 대부분 컴퓨터가 모니터와 키보드가 결합된 터미널을 갖게 되었다. 그렇다면 그 전에는 프로그래머들은 어떻게 코딩을 하고 결과를 확인할 수 있었을까?
초기 프로그래머들은 천공카드를 사용해서 코딩을 했다. 천공카드는 원래 19세기 말에 데이터를 입력하고 저장하는 용도로 사용되었는데, 미국 통계청에서 인구조사를 위해 사용하였다. 지금의 OMR 답안지를 생각하면 이해가 쉽다. IBM은 당시 천공카드 시스템을 개발하여 세계적으로 시스템을 공급하고 있었다. 이 천공카드가 초기 컴퓨터 사용에 큰 역할을 했다.
실제 사용은 이렇다. 우선 프로그래머는 종이에 어셈블리어로 코딩을 했다. 머리속에서 코드를 실행시켜 디버깅을 하고, 그 코드를 명령어 하나 하나 천공 카드에 기입하였다.
이렇게 준비된 천공 카드를 operator에게 전달하면 대신 컴퓨터에 입력해주고 실행 결과를 종이로 출력해서 전달했다. 물론, 현실은 operator에게 천공카드를 전달하려고 줄을 서야 했고, 실행 결과를 받을 때까지 많은 시간을 기다려야 했다. 물론, 결과가 제대로 안나오면 다시 천공카드를 만들고 실행하는 과정을 반복해야했다.
재미있는 것은 천공카드만 복사하면 프로그램을 복사하는셈이여서, 그 때까지만 해도 프로그램 복사는 그저 손으로도 가능했다.
[1] http://www.seas.upenn.edu/about-seas/eniac/operation.php
[2] http://www.cl.cam.ac.uk/~mr10/edsacposter.pdf
[3] http://theinventors.org/library/inventors/blcomputer_keyboard.htm