컴퓨터 프로그래밍의 역사 3 - kuimoani/dev-cheatsheet GitHub Wiki
https://github.com/kuimoani/dev-cheatsheet/wiki/컴퓨터-프로그래밍의-역사-2 에 이어서...
1987년에 복원되어 베를린 박물관에 보관중인 Z1 |
1938년 독일의 콘라드 추제(Konrad Zuse)는 28세의 나이에 부모님의 집에서 세계 최초의 기계식 컴퓨터인 Z1을 제작한다. 기계식 답게 톱니바퀴, 철판, 파이프 등 약 3만개의 부품으로 되어 있어서 무게가 1톤에 달했다고 한다. 내부제어는 2진수(Binary)를 사용하지만 입력/출력은 10진수를 사용할 수 있었다. 덧셈 뺄셈만 가능했지만 반복계산으로 곱셈, 나눗셈도 가능했고 Bool과 2진 부동소수점을 사용하여 간단한 프로그래밍도 가능했다. 컴퓨터의 구조는 이후에 설명될 폰노이만의 아이디어와 상당히 비슷하며 현대의 컴퓨터 처럼 CPU, 메모리, 입력, 출력, 저장장치가 구분되어 있었고 동력은 전기모터를 사용했다.
Z1의 아키텍처 |
위의 이미지는 1989년에 복원된 Z1의 메모리와 프로세서의 구조를 설명하는 이미지인데 몇 가지만 설명하자면
- 메모리와 프로세서는 각각 독립적으로 구동할 수 있게 각자의 Cycling unit을 가지고 있다.
- 사이클이 서로 다른 메모리와 프로세서간에 값을 주고 받을 수 있도록 인터페이스(버퍼) 메모리가 있다.
- CPU는 2개의 부동소수점(Floating Point) 레지스터를 가진다.
- Decoder는 천공카드에서 한번에 8bit를 읽을 수 있었는데 2bit는 opcode에 사용하고 6bit는 메모리의 주소를 지정하는데 사용했다.
- 즉, 64 words (8 bits * 8 layers) 메모리를 참조 할 수 있다. (원래 Z1은 16words 였지만 복원하면서 64words로 업그레이드 했다.)
- 산술연산용으로는 2bit로 opcode를 사용하고 나머지 6bit는 메모리 참조용으로 사용했고, I/O 작업용으로는 메모리참조가 필요 없기 때문에 opcode로 3bit를 사용했다. 즉, 총 8개의 명령어(덧셈, 뺄셈, 곱셈, 나눗셈, 메모리 읽기, 메모리 쓰기, 10진수용 패널에서 읽기, 10진수용 디스플레이로 출력하기)가 있었다.
Z1은 입력장치로 버려진 35mm 영화필름 재사용하여 펀칭을 해서 사용했고 10진수 4자릿수를 입력할 수 있는 키보드도 있었다.
Z1의 기계식 키보드 |
내부 계산은 2진수로 이루어지지만 입출력은 10진수를 사용했다는 것에서 현대 컴퓨터와 비슷한 점이 있다. Z1의 가산기(Z1 Adder)는 여러개의 철제 패널과 파이프로 구성되어 있는데, 파이프의 위치를 움직여서 0과 1을 구분하는 방식이었다. Z1 가산기의 작동방식이 궁금하다면 http://zuse-z1.zib.de/simulations/z1/adders/wgl/에서 시뮬레이션 해 볼 수 있다.
![]() |
---|
Z1의 가산기 동작원리 |
가내수공업으로 만든 Z1은 정밀도가 부족하여 제대로 작동하지는 못했고 주목도 받지 못했다. 다행히 다른 발명가가 관심을 보여 재정적 지원을 받고 1940년에 Z2를 제작한다. 기계식으로 만들어진 Z1의 산술 및 제어로직을 약 600개의 계전기(Relay)로 교체했고 메모리 사이즈를 기존 16 words 에서 64 words로 업그레이드 했다.
이때 독일 정부 관계자들을 모아 부모님댁에서 Z2를 시연했는데 이후 독일 정부의 지원을 받아 Z3 개발을 시작한다.
Z3를 개발하면서 원격조종 미사일의 공기역학 계산을 위한 특수목적 컴퓨터인 S1과 S2를 만들었다. 특히 S2는 미사일 날개에서 측정된 아날로그 데이터를 디지털로 변환하여 계산했다고 한다. 이는 최초의 아날로그 디지털 변환기가 될 수도 있겠지만 공개적으로 발표된 적이 없어서 정확히 알려진 바는 없다.
1941년에 약 2,600개의 계전기(Relay)를 사용하여 성능이 대폭 향상된 Z3를 완성했다. 이후 계전기를 전자식 스위치로 업그레이드하기 위해 독일정부에 자금 지원을 요청했지만 전쟁에 중요하지 않다는 이유로 거절당했고 이후로 정부의 자금지원을 받지 못했다.
1943년에는 연합군의 폭격을 맞고 대부분의 자료가 소실된다. 다행히 당시 개발중이던 Z4는 다른 곳으로 이전하여 보전했지만 독일의 패전으로 인한 경제, 정책, 외교 문제로 인해 개발이 중단되었다가 1949년에 Z4가 완성되고 판매까지 되면서 Z4는 세계 최초의 상업용 컴퓨터가 된다.
1960년에 복원되어 뭰헨 박물관에 전시중인 Z3 모형 |
컴퓨터의 역사를 검색해보면 추제의 Z1이 없고 미국의 MARK-I 부터만 등장하는 자료가 많은데, 이는 추제가 전범국의 미사일 개발에 도움을 줬던 공학자였기 때문에 학계에서 그동안 의도적인 배제가 이루어져 온게 아닌가 싶다. Z1부터 Z3까지의 원래 이름은 V시리즈였는데 하필 나치독일의 보복용 폭탄(...) 이름이 V(Versuchsmodell)시리즈였기 때문에 1945년 독일 패전 이후 Z시리즈로 개명했다. 또한 추제는 건축공학을 전공한 후 비행기 구조 설계 일을 하다가 이후 가족과 지인들의 지원만으로 부모님집에서 Z1과 Z2을 만들었기 때문에 독일 내외의 기존 컴퓨터 관련 공학자들과 교류도 딱히 없었다. 대부분의 자료는 나중에 알려진 것들이고 Z1은 1989년이 되어서야 복원되었다.
현대의 컴퓨터의 아버지는 폰노이만이라던가 엘런튜링 등을 자주 언급하지만, 추제는 이들보다 먼저 독자적으로 컴퓨터를 완성하였고 튜링의 "튜링완전" 이론이 나오기도 전에 이미 튜링완전한 컴퓨터를 만들었다. 이는 추제가 사망 후 Z3를 가지고 1998년에 검증된 것이다. 독일이 패전하지 않았다면 현대의 우리는 콘라드 추제의 컴퓨터 체계를 사용하고 있을지도 모른다.
- 1939년 독일이 폴란드를 침공하여 2차 세계대전이 시작된다.
- 1944년 미국의 IBM이 MARK-I 을 완성한다.
- 1945년 일본이 항복하면서 2차 세계대전이 끝난다.
1945년 전쟁이 끝나고 딱히 할 일이 없어진 콘라트 추제는 최초의 고급프로그래밍 언어인 플랑칼쿨을 고안한다. 일단 기계어(Machine code)로 프로그래밍 하는게 너무 어렵기도 했고, 수학자 출신이 아니었기 때문인지 평소에도 수학적 체계보다는 보편실용적인 언어를 만드는데 더 관심이 많았다.
플랑칼쿨로 TPK알고리즘을 구현한 예제노트 |
위의 예제는 Donald Knuth 과 Luis Trabb Pardo가 1977년 "The Early Development of Programming Languages"라는 책에서 초기 프로그래밍 언어가 어떤 식으로 발전했는지 비교하기 위해 배열, 산술계산, 서브루틴, 조건식, 반복식 등 기본적인 기능을 포함한 알고리즘이다. 위의 플랑칼쿨의 TPK알고리즘을 C언어로 구현하면 아래와 같다.
#include <math.h>
#include <stdio.h>
double f(double t)
{
return sqrt(fabs(t)) + 5 * pow(t, 3);
}
int main(void)
{
double a[11] = {0}, y;
for (int i = 0; i < 11; i++)
scanf("%lf", &a[i]);
for (int i = 10; i >= 0; i--) {
y = f(a[i]);
if (y > 400)
printf("%d TOO LARGE\n", i);
else
printf("%d %.16g\n", i, y);
}
return 0;
}
보다시피 현대 프로그래밍 언어에 있는 개념이 상당 수 있다는 것을 알 수 있는데, 흥미로운 점은 그동안 전통적인 수학에서 쓰이지 않은 "할당(assignment)"라는 연산자를 사용했다는 것이다. 예를 들어 수학에서 "Z + 1 = Z" 의 "="은 Equal의 의미로 쓰여졌는데, 플랑칼쿨은 "Z + 1 ⇒ Z" 처럼 "⇒"기호를 사용하여 할당의 의미로 사용했다. 이는 어찌보면 알고리즘과 자료구조가 중요한 전산수학의 탄생을 알리는 대목이기도 하다.
1948년에는 플랑칼쿨에 대한 소개와 이를 사용한 체스게임 엔진을 포함하여 논문을 발표했는데 대중의 관심도 받지 못하기도 했고 컴퓨터회사를 차리고 바빠서인지 플랑칼쿨 연구를 더 깊이 진행하지도 못했다. 결국 실제 컴퓨터에서 돌려보지는 못한 채 이론으로만 남게 되었다.
영미권 자료에서는 여전히 잘 안나오는 경우가 많다 |
- https://en.wikipedia.org/wiki/Plankalk%C3%BCl
- https://craftofcoding.wordpress.com/2021/06/21/plankalkul-the-first-language-i/
- https://craftofcoding.wordpress.com/2021/06/23/plankalkul-the-first-language-ii/
한편 영국에서는.....
https://github.com/kuimoani/dev-cheatsheet/wiki/컴퓨터-프로그래밍의-역사-4 에서 계속...