고급 언어와 저급 언어
개발 언어는 고급 언어이다. 이런 언어는 개발자가 읽고 쓰기 편하게 만들어진 언어이다. 고급 언어로 작성된 소스 코드가 컴퓨터 내부에서 실행될 때는 저급 언어로 변환되어 실행된다.
- 고급언어
- 개발자가 이해하기 쉽게 만든 언어
- 저급언어
- 컴퓨터가 이해하고 실행하는 언어
컴파일 언어와 인터프리트 언어
컴파일 언어
인터프리트 언어
- 인터프리터에 의해 한 줄씩 실행
- 소스 코드 전체가 저급 언어로 변환되기까지 기다릴 필요 없음
컴파일 언어 vs 인터프리트 언어
과정 살펴보기
Compiler Explorer
godbolt.org
명령어의 구조
기계어, 어셈블리어도 명령어이다.
오퍼랜드
연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치를 저장
오퍼랜드가 담기는 공간을 주소필드라고도 부른다.
연산 코드
연산 코드의 종류와 생김새는 CPU마다 다르다.
공통적인 연산 코드의 종류는 크게 4가지가 있다.
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경
- 입출력 제어
대표적인 연산 코드의 종류
데이터 전송
- MOVE : 데이터를 옮겨라
- STORE : 메모리에 저장하라
- LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
- PUSH : 스택에 데이터를 저장하라
- POP : 스택의 최상단 데이터를 가져와라
산술/논리 연산
- ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행하라
- INCREMENT / 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)
연산에 사용할 데이터가 저장된 위치
명령어 주소 지정 방식 (addressing modes)
- 연산에 사용할 데이터가 저장된 위치를 찾는 방법
- 유효 주소를 찾는 방법
- 다양한 명령어 주소 지정 방식들
즉시 주소 지정 방식 (immediate addressing mode)
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
- 가장 간단한 형태의 주소 지정 방식
- 연산에 사용할 데이터의 크기가 작아질 수 있지만, 빠름
직접 주소 지정 방식 (direct addressing mode)
- 오퍼랜드 필드에 유효 주소 직접적으로 명시
- 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦
간접 주소 지정 방식 (inderect addressing mode)
- 오퍼랜드 필드에 유효 주소의 주소를 명시
- 앞선 주소 지정 방식들에 비해 속도가 느림
레지스터 주소 지정 방식 (register addressing mode)
- 연산에 사용할 데이터가 저장된 레지스터 명시
- 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름
레지스터 간접 주소 지정 방식 (register indirect addressing mode)
- 연산에 사용할 데이터를 메모리에 저장
- 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
C언어의 컴파일 과정
소스코드는 위 과정을 거쳐 실행파일이 된다.
전처리 과정(preprocessing)
- 본격적으로 컴파일하기 전에 처리할 작업들
- 외부에 선언된 다양한 소스 코드, 라이브러리 포함
- 프로그래밍의 편의를 위해 작성된 매크로 변환
- 컴파일할 영역 명시
컴파일 과정(compiling)
- 전처리가 완료 되어도 여전히 소스코드
- 전처리 완료된 소스 코드를 저급 언어(어셈블리 언어)로 변환
어셈블 과정(assembling)
- 어셈블리어를 기계어로 변환
- 목적 코드를 포함하는 목적 파일이 됨
목적 파일 vs 실행 파일
- 목적 파일과 실행 파일은 둘 다 기계어로 이루어진 파일
- But, 목적 파일과 실행 파일은 다르다
- 목적 파일은 링킹(linking)을 거친 이후에야 실행 파일이 된다.
'CS > 컴퓨터 구조' 카테고리의 다른 글
메모리와 캐시 메모리 (1) | 2023.05.20 |
---|---|
CPU의 성능 향상 기법 (0) | 2023.05.12 |
CPU의 작동 원리 (1) | 2023.05.08 |
데이터 (0) | 2023.03.20 |
컴퓨터 구조 개요 (0) | 2023.03.15 |