Computer Science (CS)/CS

컴파일 과정 이해하기

eune7 2025. 2. 6. 22:19
728x90
반응형

 

 

 

 

컴파일과 인터프리터의 차이를 공부하면서

컴파일 과정에서 실행 파일을 만든다는 것을 알았어요.

그럼 또 궁금하잖아요

컴파일 과정이 어떤지

 


0. 과정

컴파일 과정은 크게 전처리 -> 컴파일 -> 어셈블리 -> 링킹 과정을 거친다.

 

1. 전처리 (Pre-processing)

컴파일은 사람의 언어를 기계어로 변경해주는 과정이다.

기계에게 주석과 같은 사람의 언어를 필요도 없고 용량만 잡는 데이터이기 때문에 이를 전처리기를 통해 제거한다.

대표적으로 아래 세가지를 제거한다.

주석 제거  
헤더 파일 삽입 C언어에서 헤더 파일을 가져올 때 #include stdio.h와 같이 코드를 작성하는데 해당 코드는 #include 전처리 지시자를 통해 stdio.h 헤더 파일을 전부 복사하여 소스코드 파일 내로 붙여넣는 작업을 한다.
메크로 치환 및 적용 #define 지시문으로 정의된 값으로 치환해준다.

 

 

2. 컴파일 (Compilation)

컴파일 과정에서는 컴파일러를 통해 기계어 전단계인 어셈블리어로 변환해주는 과정이다.

컴파일러는 아래 세 가지 과정을 거친다.

어셈블리어
0과 1로 구성된 기계어를 사람이 이해할 수 있게 부호화한 언어이다.

 

1) 프론트엔드 (Front-end)

프론트엔드는 보여지는 부분을 체크할 것 같다는 예상처럼 언어의 문법적인 부분을 확인한다.

확인 후 다음 과정인 미들엔드로 넘어가기 위해 GIMPLE 트리 구조를 생성한다.

GIMPLE 트리 구조
C, C++, Java와 같이 다양한 언어들에 맞게 문법을 확인한 후
언어의 종속을 받지 않는 독립적인 형태의 트리 구조이다.

 

2) 미들엔드 (Middle-end)

미들엔드는 아키텍쳐로부터 독립적인 형태로 변환한다.

해당 형태를 Static Single Assignment(SSA)라고 부른다.

그 후 마지막 과정인 백엔드로 넘어가기 위해 RTL 구조를 생성한다.

RTL 구조
Register Transfer Language의 약자로써 고급 언어와 어셈블리 언어의 중간 형태이다.

 

3) 백엔드 (Back-end)

백엔드는 아키텍쳐로부터 종속적인 형태로 변환한다.

특정 아키텍쳐에 종속되는 것이기에 성능을 높일 수 있지만 다른 아키텍쳐에는 적용이 안되게 된다.

 

 

 3. 어셈블리 (Assembly)

어셈블러를 통해 어셈블리어를 기계어인 오브젝트 코드로 작성된 오브젝트 파일로 변환한다.

오브젝트 파일은 아래와 같은 구조이다.

오브젝트 파일 헤더 오브젝트 파일의 기초 정보를 갖고 있음
텍스트 섹션 기계어로 변환된 코드를 갖고 있음
데이터 섹션 데이터(전역 변수, 정적 변수)를 갖고 있음
심볼 테이블 섹션 소스 코드에서 참조되는 심볼들의 이름과 주소가 정의되어 있음
재배치 정보 섹션 심볼의 확정 위치를 정의할 부분
디버깅 정보 섹션 디버깅에 필요한 정보를 갖고 있음

 

심볼
함수나 변수를 식별할 때 사용하는 이름
심볼 테이블 안에는 오브젝트 파일에서 참조되고 있는 심볼 정보가 있다.

 

즉, 심볼 테이블 섹션에는

오브젝트 파일에서 참조되고 있는 심보 정보만 있을 뿐 다른 파일의 심볼 정보는 가지고 있지 않습니다.

그래서 다음 단계인 "링킹" 과정이 필요합니다.

 

4.링킹 (Linking)

링커를 통해 오브젝트 파일들과 사용되는 라이브러리 파일들을 링크하여 실행 파일로 만드는 과정이다.

 

우선 링커는 심볼 해석 과정을 통해 심볼과 참조하고 있는 심볼을 매칭시켜줍니다.

그 후 데이터의 주소나 코드의 메모리 참조 주소를 재배치해줍니다.

재배치한 정보는 재배치 정보 섹션에 저장됩니다.

 

참고로 라이브러리를 링크하는 방법은 정적 링킹동적 링킹이 있다.

정적 링킹
정적 라이브러리일 경우 사용되는 방식
링커가 프로그램에 필요로 하는 부분을 라이브러리에서 찾아 실행파일에 복사하는 방식

동적 링킹
동적 라이브러리일 경우 사용되는 방식
라이브러리 주소를 통해 접근하여 필요한 내용을 가져오는 방식
동적 링킹은 암시적 링킹, 명시적 링킹으로 더 세부화하여 나눠진다.

 

 

 

728x90
반응형