책 혼자 공부하는 컴퓨터 구조 + 운영체제를 읽고 공부한 내용을 복기 목적으로 작성한 글입니다.
이해하기 쉽게 잘 설명되어 있는 책이니 관심있으신 분들은 구매해서 보시는걸 추천드립니다!
컴퓨터가 이해할 수 있는 정보는 크게 데이터
와 명령어
로 이루어진다.
데이터 : 컴퓨터와 주고받는 정보나 컴퓨터에 저장된 정보
명령어 : 데이터를 움직이고 컴퓨터를 작동시키는 정보
명령어는 컴퓨터를 작동시키지만,
우리가
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
이렇게 작성한다고 해도, 이걸 컴퓨터가 바로 알아듣지는 못한다.
왜냐면, 위에 작성한 소스코드와 같은 언어는 고급 언어
로, 사람을 위한 언어이기 때문.
C, C++, Python, Java와 같은 프로그래밍 언어는 사람을 위한 언어이다.
위와 같은 언어를 고급 언어
라고 한다.
컴퓨터는 고급 언어를 이해하지 못한다.
컴퓨터가 이해하기 위한 언어는 저급 언어
로, 명령어로 이루어져 있다.
따라서
사람이 고급 언어(프로그래밍 언어)
로 작성한 소스코드가 실행되기 위해서는 저급 언어(명령어)
로 변환되어야 한다.
저급 언어에는 기계어
와 어셈블리어
가 있다.
기계어
는 01010101... 와 같은 0과 1의 명령어 비트로 이루어져 있다.
사람이 보고 이해하기 굉 장 히 어렵기 때문에,
사람이 읽을 수 있는 어셈블리어
가 있다.
어셈블리어를 통해 컴퓨터에서 프로그램이 실행되는 과정을 관찰할 수 있다.
앞서 말했듯,
개발자가 작성한 소스코드를 컴퓨터가 이해하고 실행하기 위해서는 고급 언어
가 저급 언어
로 변환되는 과정이 필요하다.
이 과정은 두 가지로 나뉜다.
소스코드 전체를 한 번에 번역해서 컴퓨터에게 몽땅 주는 방식과, 소스코드를 한 줄 한 줄 번역해주는 방식이다.
대표적으로 C/C+이 컴파일 언어에 해당한다.
소스코드가 저급 언어로 변환되는 과정을 컴파일
이라고 한다.
내가 작성한 소스코드는 컴파일러라는 도구를 통해 컴파일된다.
소스코드 전체를 한 번에 변환해주기 때문에, 소스코드 전반에 오류는 없는지 검사한다.
만약 하나라도 오류가 있다면 컴파일에 실패한다.
소스코드를 저급 언어로 변환하면 목적 파일로 변환된다.
목적 파일에서 연관된 기능들을 링킹한 뒤에 실행파일로 변경되어, 해당 프로그램이 실행된다.
대표적으로 Python이 인터프리터 언어에 해당한다.
소스코드의 각 줄마다 그 때 그 때 저급 언어로 변환해준다.
1, 2, 3, ... , n 번째 줄을 순서대로 차근차근 변환해주기 때문에,
n번째 줄에 오류가 있다면 n-1번째 줄까지는 저급언어로 변환된다.
일반적으로 컴파일 방식이 인터프리터 방식에 비해 빠르다.
하나의 언어가 컴파일 방식과 인터프리터 방식 모두로 변환될 수 있다.
명령어는 연산 코드
와 오퍼랜드
로 구성되어 있다.
예를 들어,
1과 2를 더하라
라는 명령어가 있다고 했을 때,
"더하라"라는 수행해야 하는 연산과, "1과 2"라는 수행할 데이터로 이루어졌다고 볼 수 있다.
여기서 연산코드
가 수행해야 하는 연산. 즉 연산자를 의미하고,
오퍼랜드
가 수행할 데이터, 또는 수행할 데이터가 저장된 위치. 즉 피연산자를 의미한다.
이렇게 연산코드와 오퍼랜드가 합쳐져서 하나의 명령어를 구성한다.
오퍼랜드
는 수행할 데이터 또는 데이터가 저장된 위치를 의미한다고 했다.
일반적으로 오퍼랜드에는 데이터 본체 보다는, 데이터가 저장된 메모리나 레지스터의 주소가 적힌다.
명령어의 길이가 정해져 있을 때, 연산 코드의 길이만큼을 뺀 만큼이 오퍼랜드 필드가 가질 수 있는 크기가 된다.
오퍼랜드에는 여러 개의 데이터가 저장될 수 있다.
만약 여러 개의 데이터를 모두 각 원본 데이터로 저장하게 되면, 하나의 오퍼랜드 필드가 가질 수 있는 크기가 줄어들게 된다.
왜냐하면 오퍼랜드 필드로 표현될 수 있는 크기를 여러 개가 나눠서 가져야 하기 때문이다.
하지만, 만약 오퍼랜드 필드가 데이터가 저장된 위치를 가리킨다면, 해당 오퍼랜드 필드가 표현할 수 있는 데이터의 크기가 하나의 메모리 주소에 저장할 수 있는 크기만큼 늘어날 수 있다.
피연산자 데이터가 저장된 위치를 유효 주소
라고 한다.
그리고, 유효 주소를 찾는 방법을 주소 지정 방식
이라고 한다.
CPU는 여러 가지의 주소 지정 방식을 사용한다.
연산에 사용할 데이터
를 직접 명시하는 방식유효 주소
를 직접 명시하는 방식유효 주소의 주소
를 명시하는 방식연산에 사용할 데이터를 저장한 레지스터
룰 직접 명시하는 방식스택 포인터
를 이용한다오퍼랜드
의 값 + 프로그램 카운터
의 값오퍼랜드
의 값 + 베이스 레지스터
의 값