스터디/컴퓨터구조

[혼자 공부하는 컴퓨터구조와 운영체제] 3_명령어

왹져박사 2025. 3. 7. 21:18

챕터3_명령어

💡

고급 언어와 저급 언어의 차이 이해

컴파일 언어와 인터프리터 언어의 차이 이해

명령어를 구성하는 연산 코드와 오퍼랜드

명령어의 주소 지정 방식


소스코드와 명령어

 

고급 언어와 저급 언어

고급 언어

  • 사람을 위한 언어.
  • 대부분의 프로그래밍 언어. 소스코드.

저급 언어

  • 컴퓨터가 직접 이해하고 실행할 수 있는 언어.
  • 명령어로 이루어짐.

→ 고급 언어인 소스코드가 실행되기 위하여 저급 언어인 명령어로 변환 필요

 

저급 언어

기계어

  • 0과 1의 명령어 비트로 이루어진 명령어 모음
  • 십육진수로도 표현

어셈블리어

  • 오직 기계만을 위한 기계어를 사람이 읽기 편한 형태로 번역한 저급 언어
  • 프로그램의 절차를 가장 근본적인 단계부터 추적, 관찰 가능

 

컴파일 언어와 인터프리터 언어

고급 언어가 저급 언어로 변환되는 방식 2가지

 

컴파일 언어

컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어

변환 과정 → 컴파일

컴파일 수행 도구 → 컴파일러

변환된 코드 → 목적 코드

오류가 하나라도 있으면 컴파일 실패

 

인터프리터 언어

인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어

예) Python

변환 실행 도구 → 인터프리터

오류가 있어도 그 전까지 수행

 

  • 일반적으로 인터프리터 언어가 컴파일 언어보다 느림
  • 프로그래밍 언어가 꼭 하나의 방식만으로 작동하지 않음

 

↓ 개인적인 호기심!!!


🤔C++는 컴파일 언어이다. 이를 인터프리트 가능할까?

→ 가능한 방법들이 존재.
1. 인터프리터 방식의 컴파일러 사용
2. C++를 인터프리터 언어로 변환하여 사용 (더 있을 수도..)
https://www.youtube.com/watch?v=6xzR-IR85wM

C++ interpreter를 소개하는 영상. (간단한 소개만 요약)
정확히는 JIT(Just In Time) compiler라고 함.
https://en.wikipedia.org/wiki/Just-in-time_compilation
위 1번 방법의 인터프리터 방식의 컴파일러.

C++는 고성능/저지연/높은 복잡도의 소프트웨어를 빌드하기 위한 컴파일 언어로,
자연스럽게 컴파일-링크-실행 주기에 묶여있다고 한다.
그럼에도 인터프리터를 만든 이유는, 특정 상황에서는 (특히 프로토타입) 인터프리트 방식이 더 적합하기 때문이다.

→ ARM64 CPU에서 작동하는 컴파일러 솔루션 연구 기술 발표 영상.
ARM64란?
워드가 64bit인 CPU 종류. 데스크탑에 사용되는 x64와는 다름.
ARM은 저전력 컴퓨터인 임베디드 컴퓨터에 사용되어 사용할 특정 프로그램에만 최적화된 CPU 아키텍처.

 

 

목적 파일 vs 실행 파일 그리고 링킹

목적 코드로 이루어진 파일 → 목적 파일

실행 코드로 이루어진 파일 → 실행 파일

목적 코드를 연결하는 작업 → 링킹

목적 코드 ——링킹——> 실행 파일

 

 


https://www.youtube.com/watch?v=6xzR-IR85wM

https://en.wikipedia.org/wiki/Just-in-time_compilation

 

Just-in-time compilation - Wikipedia

From Wikipedia, the free encyclopedia Dynamically compiling bytecode to machine code during runtime In computing, just-in-time (JIT) compilation (also dynamic translation or run-time compilations)[1] is compilation (of computer code) during execution of a

en.wikipedia.org

 

 

 


명령어의 구조

 

연산 코드와 오퍼랜드

명령어 = 연산 코드 필드 + 오퍼랜드 필드

명령어가 수행할 연산: 연산 코드/연산자

연산에 사용할 데이터/데이터 저장 위치: 오퍼랜드/피연산자

 

오퍼랜드

오퍼랜드가 담기는 영역: 오퍼랜드 필드/주소 필드

오퍼랜드의 수에 따른 명령어 → n-주소 명령어

0-주소 명령어, 1-주소 명령어, 2-주소 명령어…

 

연산 코드

  • 데이터 전송
  • 산술/논리 연산
  • 제어 흐름 변경
  • 입출력 제어

 

주소 지정 방식

오퍼랜드 필드에 메모리나 레지스터의 주소를 담는 이유?

제한된 명령어의 크기 내에서 다양한 정보를 표현하기 위하여.

정보의 가짓수는 해당 메모리/레지스터의 공간만큼 커짐

 

연산 대상 데이터가 저장된 위치 → 유효 주소

유효 주소를 찾는 방법 → 주소 지정 방식

 

 

즉시 주소 지정 방식

연산에 사용할 데이터를 직접 명시하는 방식

  • 표현 가능한 데이터의 크기가 작아짐
  • 찾는 과정이 없어 다른 방식들보다 빠름

 

직접 주소 지정 방식

유효 주소를 직접적으로 명시하는 방식

  • 표현 가능한 유효 주소의 범위가 연산 코드의 비트 수만큼 줄음

 

간접 주소 지정 방식

유효 주소의 주소를 명시하는 방식

  • 두 번의 메모리 접근 → 위 방식들보다 느림

 

레지스터 주소 지정 방식

연산에 사용할 데이터를 저장한 레지스터를 직접 명시하는 방식

  • 직접 주소 지정 방식보다 빠름
  • 표현할 수 있는 레지스터 주소 범위가 연산 코드의 비트 수만큼 줄음

 

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

연산에 사용할 데이터는 메모리에, 그 주소를 저장한 레지스터를 명시하는 방식

  • 메모리 접근 횟수가 1번으로 줄어듬 → 간접 주소 지정 방식보다 빠름