컴퓨터의 계산 방법
컴퓨터와 인간지능 : Donald G. Fink 저, 이기호 역, 이화여대 출판부, 1986, Page 48~60
말할 수 있다는 것은 확실히 할 수 있는 것이다. - 비트겐시타인 (Ludwig Wittgenstein)
컴퓨터의 기본연산이 완전한 전자계산에서 어떻게 사용되는가를 설명하기 위해 대수에서 잘 알려진 예제, 즉 두 개의 연립방정식에서 주어진 값으로부터 그 미지의 값을 컴퓨터가 어떻게 구할 수 있는지 보여주겠다. 이제 인간 계산기에 의해서 사용된 방법으로 시작해서 컴퓨터가 똑같은 과정을 어떻게 밟아가는가를 보자. 인간이 하는 계산 단계를 보면 산술 계산 자체를 하는 것 외에 계산된 수 (합, 차, 곱, 몫) 를 써놓아야 (저장) 하고, 다음 단계에서 그것들이 필요할 때 찾아내야 (검색) 한다. 컴퓨터 또한 수를 저장하고 검색해야 한다.
인간 컴퓨터는 적절한 순서로 각 단계를 수행하면서 계산을 통괄해야 한다. 전자계산기도 똑같은 일을 해야 하며, 제어장치 (control unit) 라는 특별한 장치를 갖는다. 제어장치는 각 명령 지시를 찾아서 컴퓨터의 다른 부분이 각기 단계적으로 수행하는지를 돌본다.
<그림 1> 은 인간의 계산과 기계의 계산간의 유사점을 보여준다.

그림 11 인간과 컴퓨터가 쓰는 계산과정.
연필과 종이로 사람들은 계산에 대한 지시를 쓰고 계산 과정 중에 요구되는 수를 저장한다. 계산 자체에서 인간은 탁상용 계산기를 사용한다. 화살표는 정보의 흐름을 나타낸다. 즉 명령을 읽고 명령 내에서 요구된 결과를 얻기 위해 계산기를 작동시키고 그 결과를 종이 위에 저장하고, 다음 명령에 의해 요구된 수를 저장했던 종이로부터 검색하여 탁상용 계산기에 보낸다. 모든 명령이 만족한 상태로 될 때까지 똑같은 방법을 반복한다.
컴퓨터는 똑같은 과정을 수행한다. 지시문 (instruction) 은 기억장치 (종이에 해당) 에 저장된다. 이 지시문들은 제어장치에 의해서 "읽혀지고" 제어장치는 지시문에서 명시된 단계를 수행하도록 연산장치를 관장한다. 그 결과는 기억장치에 저장된다. 한 지시가 과거에 저장된 수를 요구할 때 제어장치는 그 수를 기억장치에서 연산장치로 옮겨준다. 따라서 계산을 하는 데는 세 가지의 중요한 기능이 있다. 즉 지시문과 수들의 저장 (storage) 과 검색 (retrieval), 연산에 의한 수들의 처리, 프로그램에 언급된 수행과정들의 제어 (control) 등이다.
지시문들은 계산을 시작하기 전에 준비되어 있어야 한다. 우리가 대수문제를 풀 때 프로그램이 준비되어 있다는 것을 의식하지 않더라도 사실은 준비하고 있는 것이다. 우리는 대수와 산술 계산의 단계에 대한 지식을 기억하고 있으며, 적어도 해답을 구하기 위한 기본적인 계획을 마음 속에 가지고 있다. 그 진행 과정은 다음의 매우 간단한 대수문제를 상세히 해결함으로써 설명될 수 있을 것이다.
주어진 연립방정식이
ax + by = c
dx + ey = f
이고 a, b, c, d, e, f 의 값이 주어졌을 때 미지수 x 와 y 의 값을 구하라.
프로그램을 짜기 위한 첫 단계는 x 와 y 가 직접 나타나도록 방정식을 고쳐 써야 한다. 즉 해를 구할 수 있도록 방정식을 일반적인 형태로 고쳐 써야 한다. y 를 "없애기 위해서" 첫째 방정식에는 e 를, 두 번째 방정식에는 b 를 곱해서 그 결과를 뺀 후 x 에 대해 풀면
|
aex + bey = ce bdx + bey = bf x(ae - bd) = ce - bf
|
마찬가지 방법으로 y 를 구하면,

x 와 y 에 대한 이 방정식들을 조사해 보면, 우선 6 개의 곱셈, 즉 ae, af, bd, bf, cd, ce 등이 필요하다. 다음에 이들 곱의 세 개의 차를 만들어야 한다. 즉 ce - bf, af - cd 와 ae - bd 들이다. 마지막으로 이들 차에 대한 두 개의 나눗셈을 필요로 하는데 이들은 각각 x 와 y 의 결과 (ce - bf) / (ae / bd) 와 (af - cd) / (ae - bd) 이다.
우리는 11 개의 산술 계산으로 2 개의 연립방정식의 해를 구하였다. 즉 6 개의 곱셈, 3 개의 뺄셈, 두 개의 나눗셈이다. 이것들은 반드시 순서대로 하여야 한다. 다시 말해서 나눗셈은 뺄셈의 결과를 기다려야 하며 뺄셈은 곱셈이 끝나기 전에 할 수가 없다. 필요할 때 곧 이 모든 결과를 갖기 위해 우리는 종이 위에 그것들을 써서 보관한다.
이제 우리는 프로그램을 쓸 준비가 되었다. 즉
1. 주어진 값 a, b, c, d, e, f 를 써라.
2. 곱셈 ae 를 계산하고 그것을 써라.
3. 곱셈 af 에 대해서 단계 2 를 반복하라.
4. 곱셈 bd 에 대해서 단계 2 를 반복하라.
5. 곱셈 bf 에 대해서 단계 2 를 반복하라.
6. 곱셈 cd 에 대해서 단계 2 를 반복하라.
7. 곱셈 ce 에 대해서 단계 2 를 반복하라.
8. 단계 7 의 결과에서 5 의 결과를 빼라. 그리고 그 결과 ce - bf 를 써라.
9. 단계 6 과 3 의 결과를 사용하여 af - cd 를 얻기 위해 단계 8 을 계속하라.
10. 단계 4 와 2 의 결과를 사용해서 ae - bd 를 얻기 위해 단계 8 을 계속하라.
11. 단계 8 의 결과를 단계 10 의 결과로 나누어라. 그 결과를 써라. 이것이 미지수 x 의 값이다.
12. 단계 9 의 결과를 단계 10 의 결과로 나누어서 그 결과를 써라. 이것이 바로 미지수 y 의 값이다.
a 에서 f 까지의 특정한 값 (30x - 16y) = 12 ; 10x + 6y = 38) 에 대해서 아래와 같은 12 단계를 구성한다.
|
단계 |
저장된 데이타 |
|
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. |
a = 30 ; b = -16 ; c = 12 ; d = 10 ; e = 6 ; f = 38 ae = 180 af = 1140 dd = -160 bf = -608 cd = 120 ce = 72 ce - bf = 680 af - cd = 1020 ae - bd = 340 (cd - bf) / (ae - bd) = 2 (답 x = 2) (af - cd) / (ae - bd) = 3 (답 y = 3) |
곱, 차, 몫을 만드는 데 우리는 적당한 수를 종이 위에 놓아야 한다. 따라서 곱 ae 를 만들기 위해서 a 자리에 30, e 자리에 6 을 놓는다. 이와 같이 자리를 정하는 것은 어떤 의식적인 노력이 아니더라도 가능하다. 종이 위를 보면서 우리의 눈은 문자와 연관된 수를 식별할 수 있지만, 숙달된 솜씨는 산술과 대수에서 많은 연습을 한 결과이다.
컴퓨터는 위치 선정을 위해 매우 명백한 명령을 하여야 한다. 어떤 특정한 장소에 결과를 놓도록 명령하여야 한다. 그 결과를 검색하기 위해 원래의 위치로 다시 돌아가도록 명령되어야 한다. 기억 장치에 있는 각 장소는 "주소 (address)" 또는 "기억장소 (memory location)" 를 갖는다. 기억장소는 하나의 수가 그 장소에 놓이거나, 검색이 될 때마다 정해져야 된다. 기억장소는 도시 거리의 번호처럼 보통 숫자로 주어진다.
인용된 프로그램은 5 개의 특정한 명령을 갖는다. 곱셈, 뺄셈, 나눗셈, 쓰기, 반복하는 것 등이다. 게다가 명백히 이야기되지는 않았지만 여섯 번째 명령문이 있다. 결과를 보라. (어느 어느 단계의) 인간 컴퓨터는 이 6 개의 명령에 대해 무의식적으로 행동하지만, 전자계산기는 명확한 문장을 가져야만 한다.
컴퓨터에 저장된 데이타나 주소, 명령들이 식별되어 제어 장치 속에서 수행되기 이전에 이미 2 진수로 바꿔져야 한다. 따라서 컴퓨터에 사용하는 세 종류의 2 진수가 있다. 즉 데이타를 나타내는 것 (주어진 값, 중간 결과치, 결과치) 과 기억 장소를 위한 것, 그리고 명령어를 위한 것이다. 컴퓨터는 이 수들을 구별해야 한다. 만약 컴퓨터가 명령 번호나 혹은 데이타 숫자 대신 기억장소 번호를 잘못 사용했다면, 굉장한 혼란이 일어나게 된다. 컴퓨터가 어떻게 일을 제대로 수행하는지 알기 위해서 연립방정식의 문제를 마치 컴퓨터가 수행하는 것과 같이 해보자.
"컴퓨터 단어 (computer words)" 로 알려진 숫자와 문자의 모임은 지시문으로 컴퓨터에 나타난다. 이 단어들은 연산기호나 수행될 정보가 발견되거나 저장될 기억장소를 명시한 숫자들을 하나 이상 포함한다.
기계 설계에 따라서 컴퓨터 단어는 여러가지 다른 형태를 갖는다. 제 3 장 (주석 : 7 장에서 우리는 1 개의 기억장소를 갖는 단어를 사용할 것이다. 왜냐하면 대부분의 현대 컴퓨터들이 이런 형태로 만들어지기 때문이다. 여기에 사용된 3 번지 단어 (현재는 거의 안 쓰임) 는 더 간단하고 간략하게 설명된다.) 에서 우리는 4 부분으로 되어 있는 단어를 사용한다. 첫 번째 부분은 수행될 연산을 명시한다. 두 번째와 세 번째는 수행되는 숫자들이 발견되는 기억장소를 준다. 네 번째는 결과가 놓여질 기억장소를 준다. 각 부분은 세 개의 문자 또는 숫자로 구성된다. 그리하여 우리가 생각하는 컴퓨터 단어는 다음과 같다.
|
연산부호 두 번째 기억주소 |
첫 번째 기억주소 세 번째 기억주소 |
연산을 위해 다음과 같은 부호 문자를 사용한다.
|
연산부호 |
의 미 |
|
LOD ("load") MUL ("multiply") SUB ("subtract") DIV ("divide") PRT ("print") |
수를 컴퓨터에 가져와서 그것을 첫 번째 기억주소에서 명시된 기억주소에 놓아라. 첫 번째와 두 번째 기억주소에서 발견된 수들은 곱하고, 세 번째 기억주소에 그 곱을 갈라 놓아라. 첫 번째 기억주소의 수에서 두 번째 기억주소에 있는 수를 빼라. 그리고 그 차를 세 번째 기억주소에 갖다 놓아라. 첫 번째 기억주소에 있는 수를 두 번째 기억주소에 있는 수로 나누고, 그 답을 세 번째 기억주소에 가져다 놓아라. 첫 번째 기억주소에 저장된 수를 프린트시켜라. |
세 개의 수를 갖는 기억주소는 000 에서 999 까지의 임의의 수를 식별할 수 있다. 따라서 컴퓨터는 1,000 개의 서로 다른 기억주소를 갖는다. 프로그램은 순서대로 이것을 사용할 것이다.
이제 2 개의 연립방정식은 풀기 위한 프로그램에서 12 단마다 컴퓨터 지시문들을 쓴다. 카드에 천공된 a 에서 f 까지의 6 개의 주어진 값을 가지고 시작한다. 컴퓨터 a 에서 f 까지의 값들을 읽으라고 할 때, 컴퓨터는 읽는다. 각 단계들은 인간이 짠 프로그램에 상응하도록 번호를 붙이면 컴퓨터 프로그램은 다음과 같이 된다.
|
단계 |
컴퓨터 단어 |
설 명 |
|
1a. 1b. 1c. 1d. 1e. 1f. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. |
LOD 000 LOD 001 LOD 002 LOD 003 LOD 004 LOD 005 MUL 000 004 006 MUL 000 005 007 MUL 001 003 008 MUL 001 005 009 MUL 002 003 010 MUL 002 004 011 SUB 011 009 012 SUB 007 010 013 SUB 006 008 014 DIV 012 014 015 DIV 013 014 016 |
첫 번째 천공된 카드 (수 a 를 나타내는) 를 읽어서 그 수를 기억 장소 000 에 놓아라. b 를 읽고, 그것을 001 이란 장소에 놓아라. c 를 읽고, 그것을 002 라는 장소에 놓아라. d 를 읽고, 그것을 003 이란 장소에 놓아라. e 를 읽어서 그거슬 004 란 장소에 놓아라. f 를 읽고, 그것을 005 란 장소에 놓아라. a 에 e 를 곱하고 그 곱을 006 이란 장소에 놓아라. a 에 f 를 곱하고 그 곱을 007 이란 장소에 놓아라. b 에 d 를 곱하고 그 곱을 008 이란 장소에 놓아라. b 에 f 를 곱하고 그 곱을 009 란 장소에 놓아라. c 에 d 를 곱하고 그 곱을 010 이란 장소에 놓아라. c 에 e 를 곱하고 그 곱을 001 이란 장소에 놓아라. ce 에서 bf 를 빼라. 그리고 그 차를 012 란 장소에 놓아라. af 에서 cd 를 빼고 그 차를 013 이란 장소에 놓아라. ae 에서 bd 를 빼고 그 차를 014 란 장소에 놓아라. (ce - bf) 를 (ae - bd) 로 나누어라. 그 답을 015 란 장소에 놓아라. (af - cd) 를 (ae - bd) 로 나누어라. 그 답을 016 이란 장소에 놓아라. |
이제 계산은 완료되고 기억장소 015 와 016 에 답을 저장한다. 이것들을 검색하기 위해 우리는 2 개의 명령을 덧붙인다.
13. PRT 015 015 에 있는 수 (x 의 값) 를 프린트하라.
14. PRT 016 016 에 있는 수 (y 의 값) 를 프린트하라.
마지막으로 멈추게 하기 위한 명령을 한다.
15. STP.
컴퓨터는 다음 문제에 사용될 수 있도록 기억장소 000 에서 016 까지 저장된 모든 수들은 제거할 준비를 한다.
이 예는 컴퓨터가 20 개의 프로그램 지시문 (단계 1 에 6 단계가 있다) 을 어떻게 수행하고, 그 답을 어떻게 프린트해내는지를 암시한다. 컴퓨터가 컴퓨터 단어로 구체화되어 있는 지시문들을 어떻게 받아들이는지는 아직 설명하지 않았다. 한 가지 방법은 타자지에 타이핑하기 전에 각 지시문이 수행될 것을 기다리면서 오퍼레이터가 컴퓨터의 입력 타자기에 각각의 지시문들을 쳐서 넣도록 하는 것이다. 그러나 이런 절차는 매우 속도가 느리고 만약에 여러 쌍의 연립방정식을 풀어야 한다면 매우 지리한 일이다. 그래서 연습과정을 제외하고는 이런 과정을 거치지 않는다. 오퍼레이터는 정보의 특정한 항목을 요구하거나 혹은 특별한 오류를 고치기 위해서만 타이프를 사용한다. 정상적인 수행에서 컴퓨터는 모든 일을 하도록 준비되어 있다. 사실상 컴퓨터는 인간의 개입없이 완전히 답이 구해지는대로 인쇄하면서 수천 쌍의 연립방정식에 대한 해를 구할 수 있다.
계산이 시작되기 전에 만일 컴퓨터의 기억장치 속에 처음 19 개의 지시문을 기억장소 101 에서부터 119 까지에 (stop 문을 생략하고) 저장하도록 프로그램되어 있다면 컴퓨터는 자기 스스로를 제어할 수 있다. 2 개의 지시문이 프로그램에 더해진다. 그것들은,
16. CLR 000 016 기억장소 000 에서 016 까지에 있는 모든 수를 제거하라.
17. RPT 101 기억장소 101 에 있는 지시문에서 시작하여 계산을 반복하라.
이들 지시문은 기억장소 120 과 121 에 저장된다.
컴퓨터의 시동 스위치가 눌러졌을 때 무슨 일이 일어나는 가를 보자. 컴퓨터는 천공된 카드로부터 첫 번째 주어진 양의 집합 (a 에서 f 까지) 의 다음 집합이 읽혀지고, 해를 구하고, 그것을 프린트하고, 수를 제거시킨다. 그리고 이 과정은 마지막 쌍의 방정식이 해결될 때까지 계속 반복된다.
컴퓨터는 멈추는 지시를 받아야 한다. 그렇지 않으면 천공된 카드들이 다 읽혀진 후까지도 새로운 해를 구하려고 할 것이다. RPT ("repeat"). 지시가 나타날 때마다 수를 세어야 한다 (카운터 회로 내에서) 해를 구하고자 하는 500 쌍의 방정식이 있다고 가정하자. 계산은 카운터가 500 에 도달했을 때 멈추어져야 한다. 그때에 마지막 지시가 나타난다. 즉 STP ("stop"). 카운터가 어떻게 500 에 이르렀는지 스스로 알 수 있을까? 다른 기억장소에 저장된 500 이란 수에서 계수를 뺌으로써 알 수 있다. 그 차가 양수인 한은 500 이 되지 않았다는 것이고 RPT 명령이 수행된다. 그러나 차가 0 이 되는 때 500 에 도달했다는 것이고, RPT 명령은 나타나지 않고 STP 명령이 그 자리에 나타난다.
이런 과정이 계속될 때, 500 쌍의 답은 프로그램이 반복될 때마다 한 쌍씩 프린트된다. 어떤 방정식의 답인지 확실히 하기 위해서 컴퓨터는 계수에 일치하는 회수와 그리고 또한 각각의 답에 연관된 a 에서 f 까지의 값을 프린트하도록 준비한다.
이것은 너무 단순하고 다소 솔직하게 표현된 과정에 대한 설명이다. 사람들에게 기본 원리를 모호하게 하는 우발적인 사항을 일으키게 하지 않는 반면, 주요한 생각을 예증하는 것이 작성된다. 간단히 말하면 컴퓨터는 이런 방법으로 계산한다. 즉 문제는 프로그래머에 의해서 컴퓨터가 수행하는 것이다. 즉 정보를 얻는 장소, 그리고 그 결과가 저장된 곳을 단계적으로 밝히는 일련의 지시들로 만들어진다. 그러면 프로그램은 컴퓨터 속으로 옮겨진다. 즉 각 지시에 대한 컴퓨터 단어는 명시된 기억장소에 자리잡히게 된다. 필요한 때 읽혀지는 입력 자료들은 천공카드상에 저장되거나 혹은 컴퓨터 내의 또 다른 명시된 기억장소로 옮겨진다.
제어장치는 첫 번째 지시가 있는 기억장소를 조사하고 그 지시를 검사하고 그리고 컴퓨터로 하여금 그 지시를 따르도록 하고 결과를 명시된 기억장소에 저장한다. 제어장치는 두 번째 지시가 저장된 기억장소에서 기억장치를 다시 조사하고, 이 지시를 따라서 수행하며 결과를 저장한다. 각각의 명령 지시는 답이 구해지고, 그리고 보통은 인쇄될 때까지 순서대로 행해진다. 만약 새로운 입력 자료를 처리하기 위해 계산이 계속된다면 반복되는 명령 지시를 만날 때마다 제어장치는 첫 번째 지시가 남아있는 기억장소에 저장되었는지 조사하고, 그 프로그램을 단계적으로 반복한다. 반복이 모두 완료되면, 프로그램 카운터는 다음 지시문을 "repeat" 에서 "stop" 으로 바꿔 놓는다.
아직 한 가지 일이 남아 있다. 앞 장에서 우리는 2 진수의 산술계산을 취급하였으며 컴퓨터는 마지막 분석에서 0 과 1 의 두 가지 숫자만으로 작업을 한다는 것을 밝혔다. 그러나 이 장에서는 문자와 10 진수 숫자로 된 컴퓨터 지시문들을 나타냈었다. 또한, 이들 문자와 숫자들을 10 진수로 지적된 기억 장소 안에 배치해 두었다. 이 문자와 10 진수들은 컴퓨터가 그것들을 가지고 작업하기 전에 반드시 2 진수로 바뀌어야 한다. 각 문자와 10 진수가 0 과 1 로만 구성된 부호문자 (code character) 로 대치되어야 하기 때문에, 이런 변환은 2 진수부호화 (binary encoding) 로 알려지고 있다. 이런 번역은 컴퓨터에 들어가는 입력장치에 의해 자동적으로 수행된다. 예를 들면, 입력 타이프는 여러 개의 전기회로 (전형적으로 6 개나 혹 8 개의 회로의 모임이다) 를 포함하는데, 그 전기회로는 타이프의 키에 의해서 작용된다. IBM 모델 1401 에서 각 타이프 키는 각각 8 개의 회로로 작동한다. 6 개는 문자와 수를 위한 부호를 나타내고 하나는 컴퓨터 단어의 시작을 표시하는 "단어 표시 (word mark)" 를 나타내고, 나머지 회로는 부호화하는 과정의 정확성을 검사한다.
가령 모델 1401 형이 타이프에 부호 ADD 를 타이프한다고 가정하자. 여기서 처음에 오는 "A" 는 컴퓨터 단어의 시작이다. 우리가 "A" 란 키를 눌렀을 때 타이프의 회로는 다음과 같은 부호 10110001 를 만들기 위해서 열리고 닫힌다. 우리가 "D" 키를 누를 때는 매번 부호 01110100 이 컴퓨터에 들어간다. 숫자 키를 누를 때는 8 개의 숫자 부호에서 가장 오른쪽 수들은 제각기 동일한 2 진수를 나타냈다. 즉 모델 1401 언어에서 10 진수 9 를 위한 부호는 910 = 10012 이기 때문에 00001001 이다.
부호 문자와 단어의 서로 다른 집합들은 제각기 다른 컴퓨터에서 사용된다. 대부분의 컴퓨터는 문자와 10 진수를 통해서 외부세계와 교신한다. 왜냐하면 이것들은 오퍼레이터에 의해서 가장 쉽게 이해되기 때문이다. 번역하는 과정이 컴퓨터 장치 속에서 만들어져야 하고 오퍼레이터가 직접 0 과 1 에 관해서 알 필요가 없다.
정보는 또한 0 과 1 의 형태로 컴퓨터 기억장치에 저장된다. 각각의 기억장소는 거기에 0 과 1 로 된 모든 부호 단어들을 수용할 수 있도록, 충분한 "기억방 (memory cells)" 을 소유하고 있어야 한다. 큰 수에 대한 기억방의 값은 비싸고 또 단어를 기억장치에 넣는 것과 그것을 찾는데, 시간이 걸리기 때문에 컴퓨터 기억장치의 구조와 컴퓨터 언어의 구조는 시간과 돈의 낭비를 피하도록 신중하게 설계되어야 한다. 제 6 장에서 컴퓨터 기억장치의 조직을 자세히 살펴볼 것이다.
이 장에서는 전자계산의 근본적인 것만을 알아보았다. 그리고 머리말의 예로서 사용된 연립방정식에 대한 해를 계산하는 것은 시합에서 챔피언을 이기는 것과는 현격한 차이가 있다. 컴퓨터가 지적인 일에서 어떻게 사용될 수 있는지를 올바르게 인식하기 위해서는 사고를 컴퓨터 지실 바꾸는 컴퓨터 언어와 논리적인 과정에 대한 더 깊은 이해를 요구한다.