C언어 컴파일 과정
1. 전처리기
C 언어에서 전처리기는 소스 코드를 컴파일하기 전에 특정한 변환 및 처리 작업을 수행하는 도구이다. 전처리기 명령은 # 기호로 시작하며 주로 소스 코드의 특정 부분을 조건부 컴파일하거나 매크로로 대체하는 등의 작업을 수행한다.
01 헤더 파일 포함(#include)
외부에서 선언된 헤더 파일을 현재 소스코드에 포함시킨다. 이를 통해 다양한 라이브러리나 다른 소스 코드 파일에서 선언된 내용을 현재 파일에서 사용할 수 있다.
#include <stdio.h>
02 매크로 정의(#define)
매크로는 코드 중복을 방지하고 가독성을 향상시키기 위해 사용된다.
#define PI 3.14159
03 조건부 컴파일 (#if, #ifdef, ...)
조건부 컴파일 지시문은 컴파일 영역을 지정하거나 조건에 따라 코드를 포함시키거나 제외할 때 사용된다.
DEBUG 매크로 코드 예시
DEBUG매크로가 정의 되어 있으면 디버그 로그를 출력하는 LOG매크로를 정의하고 그렇지 않으면 LOG매크로를 빈 문자열로 정의하고 있다.
#ifdef DEBUG
#define LOG(message) printf("Debug: %s\n", message)
#else
#define LOG(message)
#endif
2. 컴파일러
컴파일 과정(compiling)에서 전처리된 소스 코드를 어셈블리 언어로 변환한다.
"Hello, World!" 컴파일 결과 예시
section .data
hello db 'Hello, World!',0
section .text
global _start
_start:
; write 'Hello, World!' to stdout
mov eax, 4 ; system call number (sys_write)
mov ebx, 1 ; file descriptor (stdout)
mov ecx, hello ; pointer to the string
mov edx, 13 ; length of the string
int 0x80 ; interrupt to invoke system call
; exit the program
mov eax, 1 ; system call number (sys_exit)
xor ebx, ebx ; exit code 0
int 0x80 ; interrupt to invoke system call
3. 어셈블러
어셈블 과정(assembling)과정에서 어셈블리 언어로 작성된 목적 코드를 기계어로 변환한다. 그 결과로 목적코드를 생성한다.
"Hello, World!" 어셈블링 결과 예시
00000000: b801000000 mov eax, 1
00000005: bb01000000 mov ebx, 1
0000000a: b904000000 mov ecx, 4
0000000f: ba00000000 mov edx, 0
00000014: cd80 int 0x80
00000016: b801000000 mov eax, 1
0000001b: bb00000000 mov ebx, 0
00000020: cd80 int 0x80
목적 파일 vs 실행 파일
목적 파일(Object File)
어셈블러는 목적 코드를 포함하는 목적파일을 생성한다. 목적 파일은 여러 목적 코드 섹션과 각 섹션의 정보를 포함하고 있다. 일반적으로 바이너리 형식으로 저장된다. 이는 링커에 의해 여러 목적 파일이 결합되어 하나의 실행파일이 생성되기 전까지 완전한 프로그램이 아니다.
실행 파일(Executable File)
링킹이 완료된 후에 생성되며, 프로그램이 실제로 실행될 수 있는 형태이다. 링킹은 여러 목적 파일 하나로 결합하고, 주소를 조종하며, 외부라이브러리와의 연결을 수행하는 등의 작업을 수행한다. 컴퓨터의 운영체제에 의해 직접 실행 가능한 형태로 해석되어 프로그램이 메모리에 로드되고 실행한다.
4. 링커
링킹(Linking)은 각기 다른 목적 코드를 하나의 실행 파일로 묶는 즉 연결 시켜주는 작업이다. 결과적으로 실행 파일이 된다.
참고 : 본 내용은개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제강의를 수강하여 작성하였습니다.
'책 > 혼공 컴퓨터구조+운영체제' 카테고리의 다른 글
컴퓨터 구조 - 레지스터(프로그램 카운터, 명령어 레지스터, 메모리 주소 레지스터등), 스택 주소 지정방식, 변위 주소 지정 방식 (0) | 2023.11.19 |
---|---|
컴퓨터 구조 - ALU,플래그,제어장치 (0) | 2023.11.18 |
컴퓨터 구조 - 명령어의 구조(연산코드, 오퍼랜드),명령어 주소 지정 방식 종류 (0) | 2023.11.09 |
컴퓨터 구조 - 고급언어(컴파일언어,인터프리터언어)와 저급언어(기계어, 어셈블리어) (0) | 2023.11.02 |
컴퓨터 구조 - 정보단위(비트,바이트,워드,이진수,십육진수) (0) | 2023.10.21 |
댓글