컴파일러는 프로그래밍 언어로 작성된 소스 코드를 기계어로 변환하는 프로그램이다.
평소에 작성하는 코드는 사람이 이해하기 쉬운 고수준 언어이지만 컴퓨터는 기계어 0과 1로 된 코드만 이해할 수 있다.
컴파일러는 이 둘을 연결해주는 역할을 하며, 소스 코드를 실행 가능한 프로그램으로 변환해준다.
컴파일러의 주요 역할
1. 코드 변환 : 프로그래머가 작성한 코드를 컴퓨터가 실행할 수 있는 기계어로 변환
2. 코드 최적화 : 성능 향상을 위해 중복 코드 제거, 실행 속도 개선, 메모리 최적화 등을 수행
3. 오류 감지 : 코드에 문법 오류, 의미 오류가 있는지 검사
컴파일러 동작 과정
1. 전처리 Preprocessing
컴파일 전 코드에서 #include, #define 같은 전처리기 지시문을 처리하는 단계로
이 과정에서는 헤더 파일 포함, 매크로 치환, 조건부 컴파일 처리, 주석제거 작업이 수행된다.
헤더파일 포함처리
#include <stdio.h> 같은 헤더 파일을 코드에 삽입해 사용 가능하게 만듦
전처리기가 헤더 파일의 내용을 그대로 포함시킴
매크로 치환
#define 으로 정의된 코드를 변경시킨다.
컴파일 타임에 텍스트 그대로 대체된다. 예로 #define PI 3.141592
조건부 컴파일
#if 와 같이 특정 조건에 따라 코드 포함 여부를 결정한다.
2. 어휘 분석
소스 코드를 토큰 단위로 분석해 의미를 구분하는 단계이다.
토큰은 키워드, 식별자, 연산, 숫자 리터럴 등으로 분류된다.
int x = 10 + 20;
[int] [x] [=] [10] [+] [20] [;]
어휘 분석 후, 프로그램은 코드를 토큰의 나열 형태로 변환하고 다음 단계로 진행된다.
3. 구문 분석
토큰이 프로그래밍 언어의 문법에 맞게 작성되었는지 검사하는 단계
int x = 10; 정상
int x = ; 오류
4. 의미 분석
코드가 문법적으로 맞더라도, 논리적 오류가 있는지 검사하는 단계
int x = "Hello"; 오류
5. 중간 코드 생성
플랫폼 별 독립적인 중간 코드를 생성하는 단계
중간 코드는 CPU 아키텍처에 관계없이 공통적으로 사용할 수 있다.
이후에 실제 실행 환경에 맞춰 기계어 코드로 변환이 이루어진다.
6. 최적화
코드의 실행속도를 높이고 메모리 사용을 줄이기 위해 최적화를 수행하는 단계이다.
int x = 5+3; => int x = 8;
7.기계어 코드 생성
최적화된 중간 코드를 CPU 가 실행할 수 있는 기계어로 변환하는 단계
8. 링킹
여러개의 개별 컴파일된 객체 파일과 라이브러리를 연결해 실행 파일을 생성하는 단계
'CS' 카테고리의 다른 글
객체지향 프로그래밍 OOP (0) | 2025.02.13 |
---|---|
실행 플랫폼 별 생성되는 기계어 코드가 다른 이유 (0) | 2025.02.10 |
DI & DIP 의존성주입과 의존관계 역전원칙 (0) | 2024.12.11 |
String 문자열의 불변성 (1) | 2024.09.02 |
2의 보수 (0) | 2024.07.14 |