📢 본 글은 혼공학습단 미션과 함께 정리해보는 글 입니다.
개발자가 작성한 코드를 컴퓨터가 바로 직독직해할 수 있는 것은 아니다.
모든 소스 코드는 컴퓨터 내부에서 명령어로 변환
된다.
컴퓨터가 직접 이해하고 실행할 수 있는 언어를 뜻한다. 기계어와 어셈블리어가 있다.
0과 1의 명령어 비트로 이루어진 언어
다.0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 언어
다.사람을 위해 만들어진 언어
를 뜻하며, 우리가 알고 있는 대부분의 프로그래밍 언어
가 고급 언어에 해당된다.
컴파일 방식으로 작동하는 프로그래밍 언어
를 뜻한다.컴파일
은 컴파일러에 의해 소스 코드가 저급 언어로 변환
되는 것이다. 이때 만들어진 저급 언어를 목적 코드 (= 원시 코드)
라 한다.인터프리트 방식으로 작동하는 프로그래밍 언어
를 뜻한다.인터프리터
에 의해 소스 코드가 한 줄씩 실행되는 언어
이다.소스 코드 마지막에 이를 때까지 한줄씩 저급 언어로 해석하며 실행해야 하기 때문
이다.컴파일 언어와 인터프리터 언어는 딱 잘라 구분될 수 없다.
인터프리터 언어인 파이썬도 컴파일을 아예 하지 않는 것은 아니며, 자바 또한 저급 언어가 되는 과정에서 컴파일과 인터프리트를 동시에 실행한다.
프로그래밍 언어를 컴파일 언어와 인터프리터 언어로 구분하기보다는고급 언어가 저급 언어로 변환되는 방법이 컴파일과 인터프리터
라고 생각하는 게 좋다.
명령어의 구조는 다음과 같이 구성된다.
명령어는 무엇을 대상으로 무엇을 수행하라
는 구조로 이루어져 있다.
명령어가 수행할 연산
을 연산 코드
(operation code, 연산자)라 한다.연산에 사용할 데이터
또는 연산에 사용할 데이터가 저장된 위치 (이것을 더 많이 사용)
를 오퍼랜드
(operand, 피연산자)라고 한다.n-주소 명령어
라고 한다.오퍼랜드에는 연산에 사용할 데이터가 저장된 위치를 저장
할 수도 있다고 하였다. (그리고 이 경우가 더 많다.)
이 이유는 명령어 내에서 표현할 수 있는 데이터의 크기가 제한되기 때문
이다.
전체 명령어가 16비트이고 연산 코드 필드가 4비트인 2-주소 명령어에서는 오퍼랜드 필드 당 6비트만 쓸 수 있다. 즉 가지의 정보를 표현할 수 있다. 만약 오퍼랜드가 많아진다면 표현할 수 있는 데이터는 적어질 것이다.
그런데 오퍼랜드 필드 안에 메모리 주소가 담긴다면, 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커진다.
한 주소에 16비트를 저장할 수 있는 구조이므로 오퍼랜드에 다른 주소값을 저장해둔다면 해당 주소를 통해 표현할 수 있는 데이터 크기는 가지일 것이다.
레지스터 이름을 넣어두면 이 또한 표현할 수 있는 정보의 가짓수는 해당 레지스터가 사용할 수 있는 공간만큼 된다.
연산의 대상이 되는 데이터가 저장된 위치
를 유효 주소라고 한다.
CPU는 자신이 실행해야 할 명령어에 쓰일 데이터들을 찾아야 한다.
그리고 이들의 위치를 찾는 방법을 주소 지정 방식
이라고 한다.
즉 주소 지정 방식
은 유효 주소를 찾는 방법
을 뜻한다.
레지스터에 대해 더 공부해야만 이해할 수 있는 주소 지정 방식들은 더 나중에 다룬다.
스택과 큐에 대해 개념 정리하기
LIFO
, Last-In-First-Out) 구조이다.FIFO
, First-In-First-Out) 구조이다.자바에서는 스택과 큐를 ArrayDeque
로 구현할 수 있다.
ArrayDeque<Integer> queue = new ArrayDeque<>();
queue.addFirst(5); // [5] → poll 방향도 같다면 스택 (pollFirst), 반대라면 큐 (pollLast)
queue.addLast(2); // [5, 2] → 스택, 큐 구현 시 활용
queue.pollFirst(); // [5] 제거 → 큐 구현 시 활용
queue.pollLast(); // [2] 제거 → 스택 구현 시 활용
부족하거나 보완할 점이 있다면 댓글 부탁드립니다 😃