1일 1로그 100일 완성 IT지식 - Day 13

김정동·2023년 5월 26일
0

(Wembley Kids Computer Toy Baby Laptops for Kids 1 2 3-6 Years Activity Electronics Number)

모형 컴퓨터로 더하기 프로그램 만들기

물리적으로 존재하지 않는 컴퓨터가 프로세서를 통해서 어떻게 작동하는지 알아보자. 시뮬레이션 속의 모형 컴퓨터를 만들면 이해하기 쉽다.

모형 컴퓨터에는 10가지 명령어가 있고 각 메모리 위치에 한개의 수 또는 한개의 명령어가 담겨있다. 작동을 시작하면 첫 번째 메모리부터 단순한 사이클을 반복한다.

인출(fetch) : 메모리에서 다음 명령어를 가져온다.
해석(decode) : 명령어가 무슨 일을 하는지 알아낸다.
실행(execute) : 명령어를 실행한다, 인출단계로 되돌아간다.

첫 번째 모형 프로그램

실제 명령어를 넣어보자
GET
PRINT
STOP

실행이 시작되면 첫 번째 명령어는 사용자에게 수를 입력하도록 요청하고, 두 번째 명영어는 그 수를 출력, 세 번째는 프로세서에 중지하라고 하게된다.
엄청 단조롭지만 이것이 컴퓨터의 작동법이다.

두 번째 모형 프로그램

두번째는 메모리에 값을 저장 후 그 값을 가져오는 것이다. 명령어는 다음과 같다.

GET 첫 번째 수를 입력받아 누산기에 넣는다.
STORE FirstNum FirstNum이라는 메모리 위치에 첫 번째 수를 저장한다.
GET 두 번째 수를 입력받아 누산기에 넣는다.
ADD FirstNum 첫 번째 수를 누산기에 있는 값에 더한다.
PRINT 결과 합계 값을 출력한다.
STOP 프로그램 실행을 중지한다.
FistNum : 첫 번째 입력 수를 담을 메모리 위치

여기서 생각해야할 부분은 첫 번째 입력받은 수를 담을 공간을 확보해야 한다는 점이다. 두 번째 GET 명령어를 실행하면 값을 덮어 써야 하므로 누산기에 첫 번째 수를 그대로 둘 수 없다. 그 값은 명령어가 아닌 데이터이므로 명령어로 해석되지 않을 메모리 공간 어딘가에 저장해두어야 한다.

또한 다른 곳에 저장해두었으므로 그 위치도 나타낼 방법이 있어야 한다. 해결책은 데이터 위치에 이름을 부여하는 것이다. 그래서 첫 번째 입력 값의 이름이 FirstNum으로, 목적이나 의미를 내포하도록 짓는 것이 좋은 습관이다.

이 프로그램을 확장해서 세 개의 수를 더하도록 하려면 어떻게 해야할까? 일련의 STORE, GET, ADD 명령어를 한번 더 추가하는 것으로 충분하다. 하지만 그런 방법으로는 1,000개의 수를 더하도록 확장하기는 힘들다.

그래서 새로운 명령어인 GOTO, 분기 또는 점프라고 불리는 명령어이다. 이 GOTO명령어를 사용하면 다음 명령어가 아닌 지정된 위치로 이동하여 명령어를 실행하도록 프로세서에 지시한다.

덧셈 명령어를 바꾸게 되면 이렇게 된다.
GET 수를 입력받아 누산기에 넣는다.
PRINT 수를 출력한다.
GOTO TOP Top으로 돌아가서 다른 수를 입력 받는다.

근데 이걸로는 충분하지 않다. 명령어를 재사용할 수는 있지만, 아직 중대한 문제가 남아있다. 이대로는 반복되는 명령어, 즉 루프가 멈출 방법이 없다. 다행히 컴퓨터에는 조건부 분기 또는 조건부 점프라는 기능이 있다.
값이 0인지 검사하여 만일 그렇다면 특정 명령어로 건너뛰는 명령어를 사용하는 것이다.
이 간단한 모형에도 IFZERO라는 명령어가 있다.
이 명령어를 사용하면 다음과 같다.

GET 수를 입력받아 누산기에 넣는다.
IFZERO Bot 누산기 값이 0이면 Bot(tom) 레이블이 붙은 명령어로 이동한다.
PRINT 누산기 값이 0이 아니므로 그 값을 출력한다.
GOTO TOP Top으로 돌아가서 다른 수를 입력 받는다.
STOP

이렇게 GOTO와 IFZERO를 조합하면 어떤 조건이 참이 될 때까지 명령어 실행을 반복하는 프로그램을 작성할 수 있다.

작성된 프로그램이 잘 작동하는지 확인하려면 어떻게 검사해야할까? 그러려면 체계적인 테스트 케이스가 필요하다. 그냥 무작위 입력을 프로그램에 던져 주는 것은 효과적이지 않다.

메모리 내부 표현

지금까지 프로세서가 어떻게 동작하는지 봤지만 명령어와 데이터가 메모리 안에서 어떻게 표현되는지는 잘 모른다.
간단히, 명령어가 각자의 숫자형 코드를 저장하는 데 메모리 위치를 한 개 사용하며, 명령어가 메모리를 참조하거나 데이터 값을 사용하면 바로 다음 위치도 사용한다고 가정하자. 그럼 GET은 메모리 위치를 한개, IFZERO나 ADD는 다른 위치를 참조하니 메모리 두 칸을 차지한다.

https://www.cs.princeton.edu/courses/archive/fall14/cos109/toysim.html

실험은 여기서 해볼 수 있다.

profile
개발자 새싹🌱 The only constant is change.

0개의 댓글