Compile은 사람의 언어로 작성된 Source Code를 컴퓨터 언어로 표현하는 것이다.
컴파일 전처리 단계에서 주요 Task는 두 가지로 헤더 파일 삽입과 매크로 치환이 있다.
// 1. 헤더 파일 삽입
#include <stdio.h>
// 2. 매크로 치환
#define PI 3
#ifdef _WIN32
#ifdef _WIN64
#define COM "window64"
#else
#define COM "window32"
#elif __APPLE__
#define COM "apple"
#endif
int main(){
printf("%d, %s\n", PI, COM);
return 0;
}

컴파일 과정은 Front End와 Back End로 나뉘고

Lexer와 Parser가 토큰을 주고 받으며 Abstract syntax tree를 생성한다.
Abstract syntax tree에서는 Aseembly 언어로 변환하고 최종적으로는 바이트 코드로 변환하게 된다.

이러한 컴파일 과정 이후에는 컴퓨터는 이해하고 실행할 수 있지만 사람이 읽기 힘든 언어로 나오게 된다.
컴파일 과정을 거꾸로 사람이 읽을 수 있는 언어로 만드는 것이다.(Binary to Human code)
- Linux - gdb
- window - x64dbg
- macOS - LLDB