학습목표
1. 고급 언어와 저급 언어의 차이
2. 컴파일 언어와 스크립트 언어의 차이
3. 명령어를 구성하는 연산 코드와 오퍼랜드
4. 명령어의 주소 지정 방식
고급 언어(high-level programming language)
: 사람이 이해하고 작성하기 쉽도록 만들어진 언어
예) C, C++, Java, Javascript 등 대부분의 프로그래밍 언어
저급 언어(low-level programming language)
: 컴퓨터가 이해하고 실행할 수 있는 언어
저급 언어의 종류
이진수로 표현된 기계어 | 십육진수로 표현된 기계어 |
---|---|
코드 전체가 저급 언어로 변환되는 과정(컴파일)을 거친다.
컴파일러(컴파일을 수행해 주는 도구)는 소스 코드 전체를 훑어보며 저급 언어로 컴파일 하고 소스 코드 내에 오류가 하나라도 있으면 컴파일에 실패.
컴파일이 수행되어 저급 언어로 변환된 코드를 목적 코드(object code)라고 한다.
인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어.
NOTE. 컴파일 언어, 인터프리터 언어 칼로 자르듯 구분 될까?
스크립트 언어인 파이썬도 컴파일을 하고, 자바도 컴파일과 인터프리트를 동시에 수행한다. 즉, 하나의 언어가 반드시 둘 중 하나의 방식으로만 작동한다고 생각하는 잘못된 개념이며, 고급언어가 저급 언어로 변환되는 대표적인 방법에는 컴파일과 스크립트 방식이 있다고 이해하자.
텍스트로 이루어진 파일 = 텍스트 파일
목적코드로 이루어진 파일 = 목적 파일
실행 코드로 이루어진 파일 = 실행파일 (예, .exe 확장를 가진 파일)
목적 코드가 실행 파일이 되기 위해서는 링킹이라는 작업을 거쳐야 한다.
명령어는 연산코드와 오퍼랜드로 구성되어 있다.
명령어 | |
---|---|
연산 코드 | 오퍼 랜드 |
연산코드(연산자): 명령어가 수행할 연산
오퍼랜드(피연산자): 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치
연산 코드 필드 연산 코드가 담기는 영역
오퍼랜드 필드 오퍼랜드가 담기는 영역
명칭 | 오퍼랜드 갯수 |
---|---|
0-주소 명령어 | 오퍼랜드가 하나도 없는 경우 |
1-주소 명령어 | 오퍼랜드가 하나인 경우 |
2-주소 명령어 | 오퍼랜드가 두 개인 경우 |
3-주소 명령어 | 오퍼랜드가 세 개인 경우 |
연산 코드 유형
연산코드(연산자) | 설명 |
---|---|
MOVE | 데이터를 옮겨라 |
STORE | 메모리에 저장하라 |
LOAD(FETCH) | 메모리에서 CPU로 데이터를 가져와라 |
PUSH | 스택에 데이터를 저장하라 |
POP | 스태의 최상단 데이터를 가져와라 |
연산자 | 설명 |
---|---|
ADD / SUBSTRACT / MULTIPLY / DIVIDE | 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행하라 |
INCREMNET / DECREMENT | 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라 |
AND / OR / NOT | AND / OR / NOT 연산을 수행하라 |
COMPARE | 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라 |
연산자 | 설명 |
---|---|
JUMP | 특정 주소로 실행 순서를 옮겨라 |
CONDITIONAL JUMP | 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라 |
HALT | 프로그램의 실행을 멈춰라 |
CALL | 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라 |
RETURN | CALL을 호출할 때 저장했던 주소로 돌아가라 |
연산자 | 설명 |
---|---|
READ(INPUT) | 특정 입출력 장치로부터 데이터를 읽어라 |
WRITE(OUTPUT) | 특정 입출력 장치로 데이터를 써라 |
START IO | 입출력 장치를 시작하라 |
TEST IO | 입출력 장치의 상태를 확인하라 |
: 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법
유효 주소(effective address): 연산의 대상이 되는 데이터가 저장된 위치