Language/C++

[C++] 컴파일 과정

마탁이 2020. 12. 15. 16:03

1. hello.c 라는 코드 파일이 있다고 할 때, 과정을 간략히 본다면...

  1) hello.c

        프로세서 (gcc -E -o test.i test.c)

  2) hello.i

        컴파일러 (gcc -S -o test.s test.i)

  3) hello.s

        어셈블러 (gcc -c -o test.o test.s)

  4) hello.o

        링커 (gcc -g -o test test.o)

  5) hello.out (실행 파일)

 

2. 각 과정에서 하는 기능

  1) 전처리기

    - 소스 코드의 주석을 제거, define을 치환하는 과정 수행

 

  2) 컴파일러

    - 어셈블리 파일로 전환

    - 어셈블리 코드는 CPU 명령 조합 (어셈블리어는 CPU에 의존적)

    - front-end

       > 프로그래밍 언어를 처리

       > 소스 코드가 문법에 맞게 작성되었는지 분석

어휘 분석  소스 코드를 의미 있는 최소 단위 토큰으로 나눈다.
구문 분석  토큰으로 파스 트리(Parse Tree)를 생성하여 문법 오류를 검출
의미 분석  파스 트리를 이용해 의미상 오류가 없는지 검사한다.
 e.g) 함수의 매개변수, 변수의 자료형, 값을 0으로 나누는지, 정수와 문자열을 더하는지
중간 코드 생성  트리 형태의 중간 표현 GIMPLE Tree를 생성

    - middle-end

       > 최적화를 수행한다.

         (최적화는 대부분의 상용 컴파일러에서 이루어지고 있다.)

 

    - back-end

       > 최적화가 이루어지며 어셈블리 코드를 수행한다.

 

  3) 어셈블러

    - 오브젝트 코드 파일(목적 코드)로 변환 (오브젝트 코드는 0과 1로 이루어진 이진 코드, 바이너리 포맷 구조)

    - 아직 주소 정보가 확정되지 않은 상태

 

  4) 링커

    - 오브젝트 파일들을 묶어서 실행 코드를 파일로 변환.

    - 어셈블러에 의해 생성된 목적 코드 파일들과 이 프로그램에서 사용된 라이브러리들을 연결시키는 작업

    - printf()와 같은 함수에 대한 라이브러리가 연결된다.

    - 운영체제가 로딩할 수 있도록 주소 정보를 할당한 파일을 만들어 낸다. (링커는 CPU에 의존적)

'Language > C++' 카테고리의 다른 글

[C++] RTTI (RunTime Type Information)  (0) 2020.12.15
[C++] 상속의 3가지 관계와 가상 소멸자  (0) 2020.12.15
[C++] 컴파일 / 런타임 / 논리 오류  (0) 2020.12.15
[C++] 전처리기  (0) 2020.12.13
[C++] 입출력 속도  (0) 2020.12.13