C언어의 컴파일 과정

컴퓨터 구조

목록 보기
7/20

C 언어 컴파일 과정 정리


1. 개요

C 언어로 작성된 소스 코드는 다음 4단계를 거쳐 실행 파일로 변환됩니다.
1. 전처리 (Preprocessing)
2. 컴파일 (Compiling)
3. 어셈블 (Assembling)
4. 링킹 (Linking)

이 과정들은 컴파일러가 내부적으로 한 번에 수행하기 때문에 개발자는 잘 인지하지 못하는 경우가 많습니다.


2. 단계별 설명


1) 전처리 (Preprocessing)

  • 역할: 컴파일 전에 소스 코드를 준비하는 단계.

  • 주요 작업:

    • 외부 라이브러리나 헤더 파일 포함 (#include)
    • 매크로 치환 (#define)
    • 조건부 컴파일 설정 (#ifdef, #ifndef)
  • 전처리 결과: .i 확장자를 가진 전처리된 코드가 생성됩니다.

    예시:

    #include <stdio.h>
    int main() {
        printf("Hello, World!\n");
        return 0;
    }

    전처리 후에는 <stdio.h> 헤더 파일의 모든 내용이 소스 코드에 포함됩니다.


2) 컴파일 (Compiling)

  • 역할: 전처리된 소스 코드를 어셈블리어로 변환.

  • 주요 작업:

    • 소스 코드를 분석하여 문법 오류 검사.
    • CPU가 이해할 수 있는 어셈블리어로 변환.
  • 컴파일 결과: .s 확장자를 가진 어셈블리어 코드가 생성됩니다.

    예시 어셈블리 코드:

    mov rdi, message
    call printf

3) 어셈블 (Assembling)

  • 역할: 어셈블리어 코드를 기계어로 변환.

  • 주요 작업: CPU가 직접 실행할 수 있는 목적 코드 생성.

  • 어셈블 결과: .o 확장자를 가진 목적 파일이 생성됩니다.

  • 이 단계에서 생성된 파일은 실행 가능하지 않으며, 다른 목적 파일들과 결합이 필요합니다.

    예시: 목적 파일은 0과 1로 이루어진 이진 파일 형태로 저장됩니다.


4) 링킹 (Linking)

  • 역할: 여러 목적 파일을 하나로 결합하여 실행 파일 생성.

  • 주요 작업:

    • 외부 라이브러리 및 다른 소스 코드에서 정의된 함수와 변수 참조 연결.
    • 실행 가능한 파일을 생성.
  • 링킹 결과: 최종 실행 파일 (.exe, .out 등)이 생성됩니다.

    예시:
    메인 파일 main.c에서 함수 helper()가 필요하다면, 링킹 과정에서 helper.c의 목적 파일과 연결해야 실행 파일이 정상적으로 동작합니다.


3. 목적 파일과 실행 파일의 차이

  • 목적 파일 (.o):
    • 컴퓨터가 이해할 수 있는 기계어로 구성.
    • 다른 코드와 연결되지 않아 단독 실행 불가능.
  • 실행 파일:
    • 링킹을 통해 여러 목적 파일이 결합된 최종 파일.
    • 운영 체제에서 실행 가능한 상태.

4. 요약

  • 전처리: 소스 코드 준비 (라이브러리 포함, 매크로 처리 등)
  • 컴파일: 소스 코드를 어셈블리어로 변환
  • 어셈블: 어셈블리어를 기계어로 변환 (목적 파일 생성)
  • 링킹: 여러 목적 파일을 결합하여 실행 파일 생성

이러한 과정들을 거쳐 C 언어 소스 코드는 최종적으로 컴퓨터에서 실행 가능한 상태가 됩니다.
컴파일러 내부 동작을 이해하면 프로그램의 빌드 및 오류 해결에 도움이 됩니다! 😊

0개의 댓글