컴파일의 정의
컴파일은 인간이 이해할 수 있는 언어로 작성된 소스 코드(고수준 언어 : C, C++, Java 등)를 CPU가 이해할 수 있는 언어(저수준 언어 : 기계어)로 번역(변환)하는 작업을 말한다.
사람이 사용하는 C언어나 C++, JAVA 등 일반적인 프로그래밍 언어로 작성된 코드들은 컴퓨터는 이해할 수 없다.
컴퓨터는 무조건 0과1로 이루어진 기계어만 이해할 수 있기 때문이다.
그렇다고 우리가 0과 1로만 프로그램을 작성할 순 없으니 사람이 사용할 수 있는 정도의 언어를 사용하여 컴파일 과정을 거치게 되는 것이다. (참고로 기계어에 가까울 수록 저수준언어 멀 수록 고수준 언어라고 한다)
컴파일 과정은 아래와 같습니다.
1. 전처리(Preprocessing) 단계
간단하게 말하면 말 그대로 먼저 처리할것들을 해치워버리는(?) 그런 단계다.
소스 코드 파일(*.c)을 전처리된 소스 코드 파일(*.i)로 변환하며, 소스 코드에서 주석을 전부 제거한다.
#include 지시문을 만나면 해당하는 헤더 파일을 찾아헤더 파일에 있는 모든 내용을 복사해서 소스 코드에 삽입한다. (헤더파일은 컴파일 대상이 아니며, 헤더에 있는 내용을 전부 소스코드 파일 내용에 복붙해놓는다고 생각하면 편하다)
#define 지시문에 정의된 매크로를 저장하고 같은 문자열을 만나면 #define 된 내용으로 치환한다.
2. 컴파일 (Compile) 단계
컴파일러(Compiler)를 통해 전처리된 소스 코드 파일(*.i)을 어셈블리어 파일(*.s)로 변환하는 과정이다.
언어의 문법 검사가 이루어진다. 또한 Static한 영역(Data, BSS 영역)들의 메모리 할당을 수행한다.
어셈블리어가 궁금하다면 접은글 참고
기계어는 다른 말로 명령어(Machine Instruction)이라고 부르는데 명령어는 0101010과 같은 이진수로 이뤄진 숫자로 CPU 종류마다 고유한 내용을 가지고 있다.
어셈블리어는 이런 명령어를 사람이 이해할 수 있게 부호화한 것으로 CPU 명령어(기계어)와 1대1로 매칭된다.
3. 어셈블 (Assemble)단계
어셈블러(Assembler)를 통해 어셈블리어 파일(*.s)을 오브젝트 파일(*.o)로 변환하는 과정이다.
어셈블리 코드는 이제 더 이상 사람이 알아볼 수 없는 기계어로 변환되는데 이를 오브젝트 코드라 부르며, 오브젝트 코드로 구성된 파일을 오브젝트 파일(Object File)이라 한다.
4. 링킹 (Linking) 단계
링커(Linker)를 통해 오브젝트 파일(*.o)들을 묶어 실행 파일로 만드는 과정이다.
각각의 목적 코드들을 한데 모아서 하나의 실행 파일로 만들어준다.
해당 게시글은 아래 글들을 참조하여 작성했습니다. (엄청 자세히 나와있으나 잘 이해가 안됨ㅜㅜ)
'프로그래밍 > C++' 카테고리의 다른 글
메모리 구조 (0) | 2022.11.22 |
---|---|
[정리] C++ 시작하기 (0) | 2022.11.21 |
[C++] STL map 컨테이너 (0) | 2022.10.25 |
[C++] STL Deque 컨테이너 (0) | 2022.10.25 |
비트연산자 (1) | 2022.09.05 |
댓글