# 소스 코드와 명령어
## 고급 언어와 저급 언어
### 고급언어
컴퓨터가 이해하는 언어가 아닌 사람이 이해하고 작성하기 쉽게 만들어진 언어 -> '사람을 위한 언어'
### 저급언어
컴퓨터가 직접 이해하고 실행할 수 있는 언어
- 기계어
0과 1로 이루어진 언어
- 어셈블리어
0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어
## 컴파일 언어와 인터프리터 언어
고급언어가 저급언어로 변환되는 크게 두가지 방식이 있다
- 컴파일 언어
컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어이다. 컴파일러는 개발자가 작성한 코드 전체를 쭉 훑어보며 소스 코드에 문법적인 오류는 없는지, 실행하는 데 불필요한 코드는 없는지 등을 따지며 소스 코드를 처음 부터 끝까지 저급 언어로 컴파일한다. 이때 소스 코드 내에서 오류가 하나라도 있다면 컴파일에 실패한다.

- 인터프리트 언어
이터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어이다. 소스 코드 전체가 저급 언어로 변환되는 컴파일 언어와는 달리 인터프리터 언어는 소스 코드 한줄씩 실행한다. 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구를 인터프리터 라고한다. 인터프리터 언어는 소스 코드를 한 줄씩 실행하기 때문에 소스코드에 오류가 발견되기 전까지의 코드는 올바르게 수행한다.
# 명령어의 구조
## 연산 코드와 오퍼랜드
### 연산 코드
명령어가 수행할 연산
연산 코드 유형
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경
- 입출력 제어

### 오퍼랜드
연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치
- 오퍼랜드 필드에는 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있다. 많은 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담긴다. 그래서 오퍼랜드 필드를 주소 필도라고 칭하기도 한다.
## 주소 지정 방식
정보의 용량을 늘리기 위해 오퍼랜드 필드에 명령어를 직접 할당하는 것이 아닌 주소를 할당한다. 오퍼랜드 필드에 데이터가 저장된 위치를 명시 할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 한다.
### 즉시 주소 지정 방식
연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식

### 직접 주소 지정 방식
오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식이다. 표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식 보다 크지만 주소를 표현할 수 있는 범위가 연산 코드의 비트 수만큼 줄어들었다.

### 간접 주소 지정 방식
유효 주소의 주소를 오퍼랜드 필드에 명시한다. 직접 주소 방식 보다 표현할 수 있는 유효 주소의 범위가 넓어지지만 두번의 메모리 접근이 필요하기 때문에 다른 주소 지정 방식들보다 일반적으로 느리다.

### 레지스터 주소 지정 방식
연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법이다. 일반적으로 CPU 외부에 있는 메모리에 접근하는 것보다 내부에 있는 레지스터에 접근하는 것이 더 빠르다. 그러므로 레지스터 주소 지정 방식은 직접 주소 지정 방식보다 빠르다.

### 레지스터 간접 주소 지정 방식
사용할 데이터를 메모리에 저장하고, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법이다.
