본문 바로가기

CS-Study

컴퓨터 구조 : 소스코드와 명령어 그리고 명령어의 구조

728x90

📗 고급 언어와 저급 언어

고급 언어 : 개발자가 읽고 쓰기 편하도록 만든 언어

예) C, C++, JAVA, Python ...

 

저급 언어 : 컴퓨터가 이해하고 실행하기 위해 만든 언어 (=명령어)

 

고급 언어가 작성된 소스코드가 컴퓨터 내부에서 실행될 때는 저급언어로 변환된다.

 

 

✔ 저급 언어의 종류

- 기계어 : 0과 1로 이루어진 명령어로 구성된 저급 언어

 

- 어셈블리어 : 기계어를 읽기 편한 형태로 번역한 저급 언어

 

✔ 고급 언어의 종류

- 컴파일 언어

 

- 인터프리터 언어

 

💻 컴파일 언어

- 컴파일 언어는 소스 코드를 저급 언어로 변환하는 컴파일러를 사용하여 프로그램을

먼저 컴파일 한 뒤 실행한다.

- 컴파일러가 소스 코드를 전부 훑어 본 뒤 컴파일을 진행하기 때문에 실행 파일을 생성하며

개발자는 빌드 단계를 거치게 된다.

- 컴파일 도중 오류가 발생하면 소스 코드 전체가 실행 되지 않는다.

- 속도가 빠른 장점이 있다.

 

💻 인터프리터 언어

- 소스 코드를 직접 실행하는 인터프리터를 사용해서 프로그램을 실행한다.

- 인터프리터에 의해 소스 코드를 한 줄씩 읽어들이고 해당 줄을 해석하며 실행한다.

- 소스 코드 전체가 저급 언어로 변환될 때 까지 기다릴 필요가 없다.

- 코드 수정과 디버깅이 편리한 장점이 있다.

 

✔ 왜 컴파일 언어가 인터프리터 언어보다 빠를까?

컴파일 언어는 프로그램 실행을 위해 전체 소스 코드를 확인해야 하는 작업을 거쳐야하고

인터프리터 언어는 한 줄씩 읽어들이며 전체가 저급언어로 변환될 때 까지 기다릴 필요가 없는데

왜 컴파일 언어가 더 빠른 것일까?

 

- 컴파일러는 소스 코드를 컴파일 하는 과정에서 정적 분석을 통해 변수의 자료형을 

미리 파악하는 등의 최적화를 수행한다. 

- 컴파일러는 전체 코드를 한번에 분석하고 최적화 할 수 있다. 

ex) 루프 언롤링(반복횟수줄이기), 인라인 함수 

 

✔ 세상에는 컴파일 언어와 인터프리터 언어 2가지 밖에 없나?

컴파일, 인터프리트는 고급 언어가 저급 언어로 변환되는 대표적인 2가지 방식이지

이 세상 모든 언어가 컴파일, 인터프리트 언어 둘 중에 하나라고 할 순 없다.

 

📗 명령어의 구조

명령어의 구조는 다음과 같다.

 

수행할 연산 + 연산에 사용될 데이터 / 연산에 사용될 데이터가 저장된 위치
= 연산 코드 + 오퍼랜드

 

기계어와 어셈블리어도 명령어이기 때문에 이 들도 연산 코드와 오퍼랜드로 이루어짐

 

💻 오퍼랜드

오퍼랜드에는 연산에 사용될 데이터가 담기기는 하지만

연산에 사용될 데이터가 저장된 위치(주소)가 더 자주 담긴다.

따라서 오퍼랜드가 담기는 공간을 '주소 필드' 라고 부르기도 한다.

 

✔ 오퍼랜드에는 왜 데이터 뿐만 아니라 저장 위치도 저장하는 걸까?

저장 위치에 대한 정보를 오퍼랜드에 담으면 표현하는 정보의 크기가 제한 받지 않을 수있기 때문이다.

 

위와 같이 명령어의 크기가 16비트라고 가정했을 때, 연산 코드 4비트를 제외한 

각각의 오퍼랜드의 크기는 6비트 씩이다. 이때 오퍼랜드가 표현할 수 있는 데이터는

2^6 = 64 가지 밖에 안된다.

 

하지만 한 오퍼랜드에 데이터의 저장 위치를 담게 되면

오퍼랜드 필드로 표현할 수 있는 데이터 크기는 2^16 가지가 된다.

 

📗 명령어 주소 지정 방식

연산에 사용할 데이터가 저장된 위치(유효 주소)를 찾는 방법이다.

유효 주소를 찾는 방법이라고도 한다.

 

💻 즉시 주소 지정 방식

연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방법이다.

가장 간단한 방법이나 데이터의 크기가 제한될 수 있다.

하지만 데이터 저장 위치를 찾기 위해 메모리에 엑세스할 필요가 없으니 보다

빠른 방법이라고 할 수 있다.

 

💻 직접 주소 지정 방식

오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방법이다.

유효 주소를 표현할 수 있는 크기가 연산 코드 만큼 줄어드는 문제점이 있다.

 

💻 간접 주소 지정 방식

유효 주소의 주소를 오퍼랜드에 명시하는 방법이다.

유효 주소를 오퍼랜드의 크기에 구애 받지 않고 충분히 표현할 수 있지만

주소를 찾기 위해 메모리 엑세스를 하는 횟수가 많아지기 때문에 

앞선 방식들에 비해 속도가 느리다.

 

💻 레지스터 주소 지정 방식

연산에 사용할 데이터가 저장된 레지스터를 명시하는 방법이다.

메모리 접근 보다 레지스터로의 접근이 훨씬 빠르기 때문에

직접 주소 지정 방식 보다 속도가 빠르다.

 

💻 레지스터 간접 주소 지정 방식

연산에 사용할 데이터를 메모리에 저장하고 메모리의 주소를

저장한 레지스터를 오퍼랜드 필드에 명시하는 방법이다.

 

 

학습 출처

https://www.youtube.com/watch?v=kFWP6sFKyp0&t=8456s

 

728x90
반응형