공부 기록일지

유성이의 공부일지(3) - 혼자공부하는 컴퓨터 구조 + 운영체제 3장

메테오유성 2024. 7. 2. 23:34

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(피포) 자료구조 라고 읽음