상세 컨텐츠

본문 제목

빌드(Build) / 컴파일(Compile)

C / C++

by 부레두 2023. 10. 12. 01:09

본문

0. 용어 ?

컴파일러 : 이러한 작업을 수행하는 프로그램
빌드 : 코드를 실행파일로 만드는 전체 과정의 통칭
컴파일 : 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정

컴파일 과정 도식


1. 빌드 (Build) ?

소스 코드를 기계어로 번역해 실행 파일을 만드는 전체 과정

Type Process
Compile 소스 코드 전체를 기게어로 번역
Interpreted 소스 코드를 한 줄씩 번역하면서 실행
Hybrid 소스 코드 전체를 바이트 코드로 번역한 뒤, 가상 머신에서 한 줄씩 실행

2. 컴파일 세부 과정

  1. 전처리 ( preprocessor ) 과정
    • 소스 코드 파일을 전처리기가 처리
    • cpp로 된 텍스트 파일의 주석을 제거하고, 헤더파일을 삽입해 매크로를 치환해 적용
    • #define 된 부분은 심볼 테이블에 저장되어 같은 문자열을 만나면 내용으로 치환

전처리기가 처리한 결과로 확장된 소스 코드를 포함한 “중간 파일” 생성

  1. 컴파일 ( compiler ) 과정
    • 전단부, 중단부, 후단부로 나눠짐
    • 전처리된 코드를 컴파일러가 문법 및 구문을 검사
    • 어셈블러에 넘기기 전, 중간 코드를 생성
    • front어휘 분석 → 구문 분석 → 의미 분석 → 코드 생성의 순서로 진행
더보기
 > 컴파일 과정 Details <
 
  1. 전단부 ( Front-end )
    • 언어 종속적인 부분을 처리
    • C언어로 작성된 코드와 C++, Java등 다른언어로 작성된 코드들이 다른 모듈에 의해 처리
    • ⇒ 소스코드가 올바르게 작성됬는지 분석, 중단부에 넘겨주기 위한 GIMPLE 트리를 생성

GIMPLE 트리 : 소스코드를 트리 형태로 표현한 자료 구조

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

  1. 중단부 ( Middle-end )
    • 전단부에서 받은 GIMPLE Tree를 SSA( Static Single Assignment ) 형태로 변환
    • ‘아키텍쳐 비종속적인 최적화’를 수행
    • 후단부에서 사용할 RTL ( Register Transfer Language )를 생성
    • 아키텍쳐 비종속적인 최적화 → 서로 다른 CPU에 구애받지 않고 공통적으로 수행할 수 있는 최적화

최적화의 중요성
→ 컴파일 시간이 오래 걸리더라도 프로그램의 수행 속도를 향상시켜 시스템 성능의 효율의 지속적 향상 노림

 

  1. 후단부 ( Back-end )
    • RTL-Optimizer에 의해 최적화를 수행
    • 최적화 종료후 “어셈블리어로 구성된 .s 파일이 생성됨

  1. 어셈블러 ( assembler ) 과정
    • 어셈블리어 코드를 ‘오브젝트 파일’로 변환
    • 오브젝트 파일은 프로그램의 명령어와 데이터가 있는 바이너리 포맷 구조
    • 링커가 여러 개의 바이너리 파일을 하나로 묶을 때 효과적으로 파악하기 위해 갖는 규칙을 생성

  1. 링킹 ( linker ) 과정
    • 오브젝트 파일을 실행 파일로 만들어주는 과정, 링크를 해주는 프로그램을 “링커”
    • 오브젝트 파일들과 프로그램에 사용된 C, 커스텀 라이브러리들을 링크

오브젝트 파일을 실행 파일로 변환


관련글 더보기