[CS] C 컴파일 과정

박상민·2023년 3월 23일
0

Computer Science

목록 보기
14/29

📌 1. 전처리 과정

  • 헤더파일 삽입
    #include 구문을 만나면 헤더 파일을 찾아 내용을 순차적으로 삽입한다.
  • 매크로 치환 및 적용
    #define, #ifdef 과 같은 전처리기 매크로 치환 및 처리한다.

📌 2. 컴파일 과정 (전단부 - 중단부 - 후단부)

  • 전단부

    1. 어휘 분석 : C 소스코드를 의미가 있는 최소단위로 나눔
    2. 구문 분석 : 토큰으로 파스트리를 만들면서 문법적 오류를 검출
    3. 의미 분석 : 파스트리를 이용해 의미상 오류를 검출
    4. 중간 표현 생성 : 언어 독립적인 특성을 제공하기 위해 트리 형태의 중간표현을 생성
  • 중단부

    💡 최적화가 중요한 이유는 한번 컴파일 되고 나면 변경이 불가능하기 때문에 최적화를 수행함으로써 컴파일 시간이 길어지더라도 프로그램 수행속도를 향상시켜 전체 시스템 성능의 효율을 지속적으로 높여주기 위함이다.

    1. SSA(Static Single Assignment) 구조로 변환

      💡 비종속적인 최적화 : 서로 다른 CPU 아키텍쳐에 구애받지 않고 공통적으로 수행할 수 있는 최적화를 말한다.

      아키텍쳐 비종속적인 최적화를 수행한다.

    1. RTL(Register Transfer Language) 구조로 변환

      💡 RTL : 고급 언어와 어셈블리 언어의 중간 형태

  • 후단부

    RTS로 아키텍처 최적화 수행 - 더 효율적인 명령어로 대체해서 성능 높이기 위함

📌 어셈블 과정

컴파일이 끝난 어셈블리 코드는 어셈블러에 의해 기계어로 어셈블된다.

어셈블러에 의해 생성되는 목적코드(source.o) 파일은 어셈블된 프로그램의 명령어와 데이터가 들어있는 ELF 바이너리 포멧 구조를 갖는다.

다음 단계인 링킹에서 링커가 여러개의 바이너리 파일을 하나의 실행 파일로 묶기 위해서 각 바이너리 정보를 효과적으로 파악하기 위해서 일정한 규칙을 갖게 형식화 해놓는다.

📌 링킹 과정

링커는 오브젝트 파일들과 프로그램에서 사용된 표준 C 라이브러리, 사용자 라이브러리들을 링크한다.

링킹 과정이 끝나면 실행 가능한 실행파일이 만들어지게 된다.

profile
💡 클린코드를 지향하는 Backend Developer

0개의 댓글