Chapter 12.
#프로세서(CPU, 컴퓨터의 두뇌) 의 특징
1. 산술 연산을 할 수 있어서 계산기처럼 수를 더하고(+) 빼고(-) 곱하고(x) 나눌(/) 수 있다.
2. 메모리에서 연산을 수행할 데이터를 가져오거나 연산 결과를 메모리에 저장할 수 있다.
3. 컴퓨터의 나머지 부분(마우스, 키보드, 디스플레이 등의 장치)을 제어할 수 있다.
#프로세서와 계산기의 다른 점
: 프로세서가 비록 단순하긴 하나, 결정을 내릴 수 있다는 것이다.
이 수(number)가 저 수보다 큰지 작은지, 이 정보(information)가 저 정보와 동일한지 아닌지 등의
비교를 수행할 수 있고 그 결과를 기반으로 다음에 무슨 일을 할 지 결정할 수 있다.
"사람의 개입 없이도 작동할 수 있음을 뜻한다."
Chapter 13.
# 모형 컴퓨터(Toy Computer)로 더하기 프로그램 만들기
<가정 사항>
- 해당 모형 컴퓨터에는 '명령어'와 '데이터'를 저장하기 위한 메모리(Memory)가 있다.
- 한 개의 수를 담을 만한 용량의 부가적인 저장 영역인 누산기(accumulator)가 있다.
- 기본 연산을 수행하기 위한 약 10개의 명령어 레퍼토리가 있다.
<10개 명령어 중 6가지 예시>
GET | 키보드에서 수를 입력받아 누산기에 넣는다. (기존 내용 덮어 씀) |
누산기의 내용을 출력한다. | |
STORE M | 누산기 내용 복사본을 메모리 위치 M에 저장한다. |
LOAD M | 메모리 위치 M의 내용을 누산기에 적재한다. |
ADD M | 메모리 위치 M의 내용을 누산기의 내용에 더한다. |
STOP | 실행을 중지한다. |
# 첫번째 모형 프로그램
1) GET : 사용자에게 수를 입력받아 누산기에 넣음
2) PRINT : 입력받은 수를 출력
3) STOP : 프로세서에 중지하라고 명령
>> 엄청나게 단조롭긴 하지만, 프로그램이 어떻게 동작하는지 보여주는 데는 충분하다.
# 두번째 모형 프로그램
1) GET : 사용자에게 첫 번째 수를 입력받아 누산기에 넣음
2) STORE FirstNum : FirstNum이라는 메모리 위치에 입력받은 첫 번째 값을 저장
3) GET : 사용자에게 두 번째 수를 입력받아 누산기에 넣음(*기존 내용 덮어씀)
4) ADD FirstNum : 메모리에 저장됐던 첫 번째 수를 현재 누산기에 있는 값(두 번째 수)에 더함
5) PRINT : 결과 합계 값을 출력
6) STOP : 프로그램 실행을 중지
# 분기 명령어
: Idea... 만약 많은 수를 입력받고 더하도록 하려면 어떻게 해야할지?
>> 명령어를 재사용하게 하는 GOTO(분기 또는 점프라고 불림) 명령어를 추가하는 것이 좋겠다.
이것은 일종의 While 반복문이라고 볼 수 있다.
<끝 없이 실행되는 데이터 출력 프로그램>
1) (TOP) GET : 사용자에게 수를 입력받아 누산기에 넣음
2) PRINT : 수를 출력
3) GOTO TOP : TOP으로 돌아가서 다른 수를 입력받음
: Idea... 그렇다면 이 무한루프를 멈추려면 어떻게 해야 할지?
>> 조건을 검사하여 다음에 수행할 작업을 결정하는 명령어인 IFZERO(조건부 분기, 또는 조건부 점프라고 불림)을 추가
이것은 일종의 IF 조건문이라고 볼 수 있다.
<0이 입력되면 실행을 멈추는 데이터 출력 프로그램>
1) (TOP) GET : 사용자에게 수를 입력받아 누산기에 넣음
2) IFZERO Bot : 누산기 값이 0이면 Bot 레이블이 붙은 명령어로 이동
3) PRINT : 누산기 값이 0이 아니므로 그 값을 출력
4) GOTO TOP : TOP으로 돌아가서 다른 수를 입력받음
5) (BOT) STOP
<일련의 수를 합산하는 모형 컴퓨터 프로그램>
1) (TOP) GET : 사용자에게 수를 입력받아 누산기에 넣음
2) IFZERO BOT : 입력된 수가 0이면 BOT으로 감
3) ADD Sum : 가장 최근 입력받은 값(누산기)에 메모리 위치 Sum에 있는 값을 더함
4) STORE Sum : 그 결과를 메모리 위치 Sum에 새로운 누적 합계로 저장
5) GOTO TOP : TOP으로 돌아가서 다른 수를 입력받음
6) (BOT) LOAD Sum : 누적 합계를 누산기에 적재함
7) PRINT : 출력
8) STOP
9) (SUM) 0 : 누적 합계를 담을 메모리 위치(프로그램 시작 시 0으로 초기화)
어떤 디지털 컴퓨터든 가장 작은 단계로 나누면 기본 명령어만으로 작업을 수행할 수 있다.
# 체계적인 테스트
: 무작위 입력값을 프로그램에 던져주는 것은 효과적이지 않다.
그렇다면 어떤 것이 효과적이고 체계적인 테스트일까?
1) 아무런 수도 입력되지 않은 경우
2) 한 개의 수를 입력해보는 경우
3) 이미 합을 아는 두개의 수를 입력하는 경우(1+2 = 3)
# 메모리 내부 표현
<가정 사항>
- 각 명령어가 숫자형 코드를 저장하는 데는 메모리 위치를 한 개 사용
ex) GET같은 명령어는 메모리를 한 칸만 차지한다.
- 명령어가 메모리를 참조하거나 데이터 값을 사용하면 메모리 위치를 두 개 사용
ex) IFZERO, ADD같은 명령어는 메모리를 두 칸 차지하며 두 번째 칸은 참조하는 위치에 해당
- 어떤 데이터든 한 개의 메모리 위치에 들어간다고 가정
- 명령어들의 숫자 값은 다음과 같이 정의
: GET = 1, PRINT = 2, STORE = 3, LOAD = 4, ADD = 5, STOP = 6, GOTO = 7, IFZERO = 8
<수 합산하기 프로그램의 메모리 표현>
위치 | 메모리 | 레이블 | 명령어 |
1 | 1 | TOP | GET |
2 | 8 | IFZERO BOT | |
3 | 10 | ||
4 | 5 | ADD SUM | |
5 | 14 | ||
6 | 3 | STORE SUM | |
7 | 14 | ||
8 | 7 | GOTO TOP | |
9 | 1 | ||
10 | 4 | BOT | LOAD SUM |
11 | 14 | ||
12 | 2 | ||
13 | 6 | STOP | |
14 | 0 | SUM | 0(초기화) |
'TIL & WIL' 카테고리의 다른 글
CS 스터디_1일 1로그 100일 완성_26챕터 (0) | 2022.06.02 |
---|---|
WIL_220530_DI(의존성 주입), IoC(제어의 역전), Bean (0) | 2022.05.30 |
WIL_220523_객체지향프로그래밍, JVM, Gradle, Maven 그리고 이모저모 (0) | 2022.05.23 |
WIL_220517_JWT, Ajax, Flask 통한 API구현, 미니프로젝트 회고 (0) | 2022.05.17 |
TIL_220318_파이썬, 크롤링, MongoDB (0) | 2022.03.18 |