본문 바로가기

게임개발 수업

2022-10-07 컴파일 과정

컴퓨터와 사람은 사용하는 언어가 다르다.

 

컴퓨터는 0과1만 인지할 수 있다. 저장공간을 가장 작은 단위로 나누면 bit가 나온다.

bit는 쉽게 이야기 하면 전기를 담는 수조이다. 

 

한칸한칸이 bit이다.

0 1 0 1 0 1 0 1 1 0

5v의 전압이 들어가면 1

없으면 0

 

이렇게 저장한다. 이렇게 무수히 많은 수조에 0과 1을 저장한다.

0과 1로 저장된 것에 의미를 부여하면 데이터가 된다.

ex) '01010 = a 라고 하겠다. ' 라고 사람들이 의미를 부여하면 데이터가 되는 것이다.

 

우리가 실행하는 코드는 복잡한 일을 수행하는 것 같지만, 컴퓨터는 복잡한 일은 모른다.

 

컴퓨터가 알고 싶어하는 것은

어디부터 어디까지의 수조에 0과 1을 넣고, 어디부터 어디까지의 수조가 0과 1로 되어있나 확인하는 일이다.

 

그래서 우리가 작성한 코드는 컴퓨터가 필요한 언어로 변환이 필요하다.

 

이과정을 컴파일 이라고 한다.

 

컴파일은 4가지 단계(전처리 과정 - 컴파일 과정 - 어셈블리 과정 - 링킹 과정)로 이루어진다.

 

적절한 예시일지 모르겠지만 택배를 예시로 들면

 

오늘 a,b,c동에 택배를 배달해야 한다.

 

1. 전처리

 - 수 많은 택배상자중 오늘 a,b,c동에 나가야 할 택배물건을 찾는 것이다.

 

2. 컴파일

 - 이렇게 찾은 택배물건을 택배차안에 먼저 나갈 순서대로 배치하는 것이다.

 

3. 어셈블리

 - 택배차안에 택배물건을 싣는다.

 

4. 링킹

 - 택배를 배달하면서 같은 주소의 물건을 함께 준다.

 

 

1. 전처리 과정

 

컴파일을 위한 준비과정이다.

 

주석 제거 : 소스 코드에서 주석을 전부 제거한다. 주석은 사람들이 알아볼 수 있게 남긴 내용이지 컴퓨터가 알 필요는 없기 때문이다.

헤더 파일 삽입 : #include 지시문을 만나면 해당하는 헤더 파일을 찾아 헤더 파일에 있는 모든 내용을 복사해서 소스 코드에 삽입한다. 즉, 헤더 파일은 컴파일에 사용되지 않고 소스 코드 파일 내에 전부 복사된다. 헤더 파일에 선언된 함수 원형은 후에 링킹 과정을 통해 실제로 함수가 정의되어 있는 오브젝트 파일(컴파일된 소스 코드 파일)과 결합한다.

매크로 치환 및 적용 : #define 지시문에 정의된 매크로를 저장하고 같은 문자열을 만나면 #define 된 내용으로 치환한다. 간단하게 말해 매크로 이름을 찾아서 정의한 값으로 전부 바꿔준다.

 

2. 컴파일 과정

 

컴파일(Compilation) 과정은 컴파일러(Compiler)를 통해 전처리된 소스 코드 파일(*.i)을 어셈블리어 파일(*.s)로 변환하는 과정이다.

이 과정에서 우리가 일반적으로 컴파일하면 생각하는 언어의 문법 검사가 이루어진다. 또한 Static한 영역(Data, BSS 영역)들의 메모리 할당을 수행한다.

 

컴파일러 구조 

프론트엔드(Front-end)

프론트엔드에서는 언어 종속적인 부분을 처리한다.

미들엔드(Middle-end)

미들엔드에서는 아키텍쳐 비종속적인 최적화를 수행한다.

백엔드(Back-end)

백엔드에서는 아키텍쳐 종속적인 최적화를 수행한다.

 

어셈블리어 정의

기계어는 다른 말로 명령어(Machine Instruction)이라고 부르는데 명령어는 0101010과 같은 이진수로 이뤄진 숫자로 CPU 종류마다 고유한 내용을 가지고 있다.

어셈블리어는 이런 명령어를 사람이 이해할 수 있게 부호화한 것으로 CPU 명령어(기계어)와 1대1로 매칭된다.

 

3. 어셈블리(Assembly) 과정

 

어셈블리(Assembly) 과정은 어셈블러(Assembler)를 통해 어셈블리어 파일(*.s)을 오브젝트 파일(*.o)로 변환하는 과정이다.

오브젝트 파일(Object File) 정의

어셈블리 코드는 이제 더 이상 사람이 알아볼 수 없는 기계어로 변환되는데 이를 오브젝트 코드라 부른다.

오브젝트 코드로 구성된 파일을 오브젝트 파일(Object File)이라 부르며 이 오브젝트 파일은 특정한 파일 포맷을 가진다.

※ 오브젝트 파일 포맷의 종류는 Windows의 경우 PE(Portable Executable), Linux의 경우 ELF(Executable and Linking Format)로 나눠진다.

 

오브젝트 파일 헤더(Object File Header) : 오브젝트 파일의 기초 정보를 가지고 있는 헤더

텍스트 섹션(Text Section) : 기계어로 변환된 코드가 들어 있는 부분

데이터 섹션(Data Section) : 데이터(전역 변수, 정적 변수)가 들어 있는 부분

심볼 테이블 섹션(Symbol Table Section) : 소스 코드에서 참조되는 심볼들의 이름과 주소가 정의 되어 있는 부분.

재배치 정보 섹션(Relocation Information Section) : 링킹 전까지 심볼의 위치를 확정할 수 없으므로 심볼의 위치가 확정 나면 바꿔야 할 내용을 적어놓은 부분

디버깅 정보 섹션(Debugging Information Secion) : 디버깅에 필요한 정보가 있는 부분

 

4. 링킹(Linking) 과정

 

링킹(Linking) 과정은 링커(Linker)를 통해 오브젝트 파일(*.o)들을 묶어 실행 파일로 만드는 과정이다.

이 과정에서 오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들 링크하여 하나의 실행 파일을 만든다.

 

 

출처

https://bradbury.tistory.com/226

'게임개발 수업' 카테고리의 다른 글

STL vector  (0) 2022.11.08
STL 구성요소  (0) 2022.11.08
스택 프레임, 메모리 누수, 가비지 컬렉션, 메모리 단편화  (1) 2022.10.31
메모리 구조  (0) 2022.10.26
2022-10-11 자료형, 연산자 우선 순위  (1) 2022.10.11