소스 코드와 명령어
고급 언어와 저급 언어
프로그래밍 언어에서의 소스 코드는 컴퓨터 내부에서 명령어로 변환
소스 코드처럼 사람을 위해 만들어진 언어를 고급 언어, 컴퓨터가 이해하는 언어를 저급 언어라고 함
저급 언어에는 두 종류가 있다
- 기계어: 0과 1의 명령어 비트로 이루어진 언어
- 어셈블리어: 기계어를 읽기 편한 형태로 번역한 언어
컴파일 언어와 인터프리터 언어
고급 언어가 저급 언어로 변환되는 방식
- 컴파일: 컴파일러에 의해, 컴파일 언어(고급 언어)가 목적 코드(저급 언어)로 변환되는 과정
- 인터프리터: 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 방식
컴파일은 소스 코드 전체가 변환되지만 인터프리터는 한 줄씩 차례대로 실행한다
따라서 컴파일은 소스 코드 전체에 오류가 하나라도 있으면 에러가 발생하지만, 인터프리터는 오류가 있는 줄에 도달하기 전까지는 정상적으로 수행된다
컴파일이 인터프리터보다 빠르다!
목적 파일 vs 실행 파일
링킹: 목적 파일이 실행 파일(.exe, .o 등등)으로 변환되는 과정
목적 코드가 여러 개 있을 때 서로의 기능을 연결 짓는 작업을 수행한다
명령어의 구조
연산 코드와 오퍼랜드
오퍼랜드: 연산에 사용할 데이터 or 데이터의 주소 (=피연산자)
오퍼랜드의 개수가 N인 명령어를 N-주소 명령어라고 칭한다
연산 코드: 명령어가 수행할 연산 (=연산자)
연산 코드의 유형에는 아래 네 개가 있다
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경: 실행 순서 제어, CALL과 RETURN이 속함
- 입출력 제어
주소 지정 방식
유효 주소(피연산 데이터의 주소)를 찾는 방법
- 즉시 주소 지정 방식: 연산에 사용할 데이터를 직접 명시
표현할 수 있는 데이터의 크기가 작아지지만 속도가 빠르다
- 직접 주소 지정 방식: 유효 주소를 직접 명시
표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식보다 크지만 여전히 오퍼랜드 표현 범위가 연산 코드의 비트 수에 영향을 받는다
- 간접 주소 지정 방식: 유효 주소의 주소를 명시
표현할 수 있는 범위가 넓어졌으나 두 번의 메모리 접근이 필요해서 상대적으로 느리다
- 레지스터 주소 지정 방식: 연산에 사용할 데이터를 저장한 레지스터를 직접 명시
표현할 수 있는 레지스터의 크기에 제한이 생기지만 속도가 빠르다
- 레지스터 간접 주소 지정 방식: 연산에 사용할 데이터를 메모리에 저장하고, 그 주소를 저장한 레지스터를 명시
간접 주소 지정 방식과 유사하지만 메모리 접근 횟수가 한 번으로 줄어들어서 좀 더 빠르다