유성이의 공부일지(3) - 혼자공부하는 컴퓨터 구조 + 운영체제 3장
03 - 1. 소스 코드와 명령어
고급언어와 저급언어
- 프로그래밍 언어는 컴퓨터가 이해하는 언어가 아닌 사람이 이해하고 작성하기 위해 쉽게 만들어진 언어임
- 이와 같이 사람을 위한 언어를 고급언어라고 함
- 대부분의 우리가 알고 있는 대부분의 프로그래밍 언어가 고급언어에 속함
- 컴퓨터가 직접 이해하고 실행할 수 있는 언어를 저급언어 라고 함
- 만약 고급 언어로 작성된 소스 코드가 실행되려면 반드시 저급 언어, 즉 명령어로 변환되어야 함
- 저급 언어에는 두 가지 종류가 있는데 기계어와 어셈블리어임
- 기계어는 0과 1의 명령어 비트로 이루어진 언어임
- 어셈블리어는 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어임
고급언어와 저급언어
- 개발자들이 고급 언어로 작성한 소스 코드는 결국 저급 언어로 변환되어 실행됨
- 이에 대한 두 가지 방식인 컴파일 방식과 인터프리트 방식이 있음
- 컴파일 방식으로 작동하는 프로그래밍 언어를 컴파일 언어
- 인터프리트 방식으로 작동하는 프로그래밍 언어를 인터프리터 언어
컴파일 언어
- 컴파일에 의해 소스 코드 전체가 저급언어로 변환되어 실행되는 고급언어
- 컴파일은 컴파일 언어로 작성된 소스 코드는 코드 전체가 저급 언어로 변환되는 과정
- 컴파일을 수행해 주는 도구를 컴파일러라고 함
- 컴파일러는 개발자가 작성한 소스 코드를 훑어보며 소스코드에 문제가 없는지 확인하고 저급언어로 컴파일 함
- 목적코드는 컴파일러를 통해 고급 언어에서 저급언어로 변환된 코드
인터프리터 언어
- 인터프린터에 의해 소스 코드가 한 줄씩 실행되는 고급언어
- 대표적인 언어로는 Python이 있음
- 소스 코드 전체가 저급 언어로 변환되는 컴파일 언어와는 달리, 인터프린터 언어는 소스코드를 한 줄씩 실행함
- 소스 코드를 한 줄씩 저급 언어로 변환하여 실행하는 도구를 인터프린터 라고 함
- 소스 코드 내에 오류가 하나라도 있으면 컴파일이 불가능했던 컴파일 언어
- 인터프린터 언어는 소스 코드를 한 줄 씩 실행하기 때문에 소스 코드 N번째 줄에 문법 오류가 있더라도 N-1번째 까지는 올바르게 수행됨
- 인터프린터 언어는 컴파일 언어보다 실행속도가 느림!!
추가로!!
- 목적 파일은 목적 코드로 이루어진 파일을 말함
- 목적 코드가 실행 파일이 되기 위해서는 링킹이라는 작업을 거쳐야함
03-2. 명령어의 구조
연산 코드와 오퍼랜드
- 명령어는 연산 코드와 오퍼랜드로 구성되어 있음
- 예를 들어 색 배경 필드 값, 즉 명령어가 수행할 연산을 연산코드라고 함
- 즉 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치를 오퍼랜드라고 함
- 연산 코드는 연산자, 오퍼랜드는 피연산자라고 부름
오퍼랜드
- 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치를 의미
- 오퍼랜드 필드에는 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터가 올 수 있음
- 하지만 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기 보다는 많은 경우 즉 메모리 주소나 레지스터 이름이 담김
- 이를 주소 필드 라고 함
- 오퍼랜드가 하나도 없는 명령어를 0-주소 명령어, 하나인 명령어를 1-주소 명령어, 두개를 2-주소 명령어라고 함
연산코드
- 연산코드의 유형은 크게 네 가지로 나뉨
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경
- 입출력 제어
데이터 전송
- 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 : 입출력 장치의 상태를 확인하라
주소 지정 방식
- 유효 주소는 연산의 대상이 되는 데이터가 지정된 위치를 말함
- 오퍼랜드 필드에 데이터가 저장된 위치를 명시 할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 함
- 즉시 주소 지정 방식은 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
- 이런 방식은 표현 할 수 있는 데이터의 크기가 작아지는 단점이 있지만 연산에 사용할 데이터를 찾는 과정이 없어 속도가 빠름
- 직접 주소 지정 방식은 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
- 오퍼랜드 필드에서 표현할 수 있는 데이터의 크기가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효주소에 제한이 생김
- 간접 주소 방식은 유효 주소의 주소를 오퍼랜드 필드에 명시함
- 레지스터 주소 지정 방식은 직접 주소 지정 방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법
- 레지스터 간접 주소 지정 방식은 연산에 사용할 데이터를 메모리에 저장, 그 주소(유효 주소)를 저장한 레스터를 오퍼랜드 필드에 명시하는 방법
추가로!!(2)
- 스택이란 한쪽 끝이 막혀 있는 통과 같은 저장 공간
- 나중에 저장한 데이터를 먼저 빼내는 데이터 관리 방식(후입선출)이라는 점에서 LIFO(리포) 자료구조 라고도 함
- 예를 들어 스택 안에 1-2-3-4-5 순으로 저장하면 빼낼 때는 그 반대
- 스택이 새로운 데이터를 저장하는 명령어가 PUSH
- 스택에 저장된 데이터를 꺼내는 명령어가 POP
- 스택과는 달리 양쪽이 뚫려 있는 통과 같은 저장 공간을 큐라고 함
- 큐는 가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식(선입선출)이라는 점에서 FIFO(피포) 자료구조 라고 읽음