1. 소스코드와 명령어
1) 고급언어와 저급언어
(1) 고급언어 : 개발자가 이해하기 쉽게 만든 언어 (ex. C, C++, C#, Phyton...)
- 컴파일 언어
- 컴파일 언어로 작성된 소스 코드는 컴파일러에 의해 저급언어로 변환(= 컴파일)
- 저급언어인 목적코드 생성
- 인터프리터 언어
- 인터프리터에 의해 한 줄씩 실행
- 소스코드 전체가 저급 언어로 변환되기까지 기다릴 필요 없음
(2) 저급언어 : 컴퓨터가 이해하고 실행하는 언어 (ex. 기계어, 어셈블리어)
- 기계어 : 0과 1로 이루어진 명령어로 구성된 저급언어
- 어셈블리어 : 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급언어
2. 명령어의 구조
1) 연산코드와 오퍼랜드
명령어는 연산코드와 오퍼랜드로 구성됩니다.
(1) 연산코드 : 수행할 연산(1. 데이터 전송 / 2. 산술&논리 연산 / 3. 제어 흐름 변경 / 4. 입출력 제어)
(2) 오퍼랜드 : 연산에 사용될 데이터 or 연산에 사용될 데이터가 저장된 위치(= 주소필드)
* 주소필드가 훨~씬 많이 구성됨
2) 명령어 주소 지정 방식
유효주소 - 연산에 사용할 데이터가 저장된 위치
명령어 주소 지정 방식
- 연산에 사용할 데이터가 저장된 위치를 찾는 방법
- 유효주소를 찾는 방법
- 다양한 명령어 주소 지정 방식들
(1) 즉시 주소 지정 방식
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
- 가장 간단한 형태의 주소 지정 방식
- 연산에 사용할 데이터의 크기가 작아질 수 있지만, 빠름
(레지스터나 메모리에 저장할 경우 찾는 과정이 포함되는데 이를 생략하기 때문)
(2) 직접 주소 지정 방식
- 오퍼랜드 필드에 유효 주소 직접적으로 명시
- 유효주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦
(3) 간접 주소 지정 방식
- 오퍼랜드 필드에 유효 주소의 주소를 명시
- 앞선 주소 지정 방식들에 비해 속도가 느림
(4) 레지스터 주소 지정 방식
- 연산에 사용될 데이터가 저장된 레지스터 명시
- 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름
(5) 레지스터 간접 주소 지정 방식
- 연산에 사용할 데이터를 메모리에 저장
- 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
3. 언어 컴파일 과정
['전처리기' - '컴파일러' - '어셈블러' - '링커']
1) 전처리 과정
- 본격적으로 컴파일하기 전에 처리할 작업들
- 외부에 선언된 다양한 소스코드, 라이브러리 포함 (ex. #include)
- 프로그래밍의 편의를 위해 작성된 매크로 변환 (ex. #define)
- 컴파일할 영역 명시 (ex. #if , #ifdef...)
2) 컴파일 과정
- 전처리가 완료되어도 여전히 소스 코드
- 전처리 완료된 소스 코드를 저급언어(어셈블리 언어)로 변환
3) 어셈블 과정 & 링킹 과정
- 어셈블리어를 기계어로 변환
- 목적코드를 포함하는 목적 파일이 됨
+ 목적파일 vs 실행파일
- 목적파일과 실행파일은 둘 다 기계어로 이루어진 파일
- But, 목적파일 != 실행파일
- 목적파일은 링킹을 거친 이후에 실행 파일이 됨
'CS 공부' 카테고리의 다른 글
[CS] {컴퓨터 구조} CPU 심화 (0) | 2025.04.09 |
---|---|
[CS] {컴퓨터 구조} CPU 구조 (0) | 2025.04.08 |
[CS] {컴퓨터 구조} 0과 1로 숫자/문자를 표현하는 방법 (0) | 2025.04.06 |
[CS] {컴퓨터 구조} 컴퓨터 구조의 큰 그림 (0) | 2025.04.05 |
[CS] 값타입과 참조타입 (Value Type & Reference Type) (0) | 2025.03.17 |