일반적으로 컴파일은 아래의 순서로 이루어집니다.
- 전처리 과정(preprocessor)
- 컴파일 과정(compiler)
- 어셈블러 과정(assembler)
- 링킹 과정(linker)
전처리 과정
소스 코드 파일을 전처리기가 처리한다.
.cpp로 된 텍스트 파일(소스코드)의 주석을 제거하고, 헤더파일을 삽입하며 매크로를 치환하여 적용합니다.
* 여기서 매크로는 #define 뒤에 적혀있는것을 의미합니다. #define Pi 3.14 라고 써있으면 PI가 매크로, 3.14는 매크로 상수라고 부르며 PI라는 문자를 3.14로 치환해줍니다.
컴파일 과정
전처리된 소스코드를 컴파일러가 문법 및 구문을 검사하며, 어셈블러에 넘기기 전 중간 코드를 생성합니다.
front-end, middle-end, back-end 크게 3부분으로 나눌 수 있으며
front에서 소스코드가 문법에 맞게 되어있는지 확인하고 중간코드를 생성합니다.
middle에서는 최적화가 이루어지고 back에서도 최적화 및 어셈블리 코드를 생성합니다.
어셈블러 과정
컴파일된 중간 코드를 어셈블러가 읽어들인 후 기계어로 변환합니다. 이때 오브젝트 파일 생성
오브젝트파일은 바이너리 포맷구조를 갖습니다.
*바이너리 포맷구조: obj파일은 메모장으로 열리지가 않습니다. 열게되면 깨져보이게 됨.(즉 눈으로 읽을 수 없는 파일)
- 기본적으로 바이너리와 텍스트 파일로 구분하면 쉽다. 메모장에 넣었을때 우리 눈으로 보이면 텍스트 파일 안보이면 바이너리 파일
- 말그대로 이진 파일이다. (실행 가능한 파일로 보면 된다.)
링킹 과정
어셈블러에 의해 생성된 파일들과 프로그램에 사용된 라이브러리들을 연결시키는 작업이 이루어집니다.
추가내용
macOS에서는 windows에서와 다르게 컴파일할때의 일부 중간파일들 (.obj, .s, .i등)이 생성되지 않습니다.
그 이유를 찾아보니 macOS에서는 컴파일러가 컴파일 및 링크 과정을 한번에 수행하여 최종실행파일을 생성하기 때문이라고 합니다.
심지어 windows에서는 .obj(오브젝트파일_목적파일)이지만 macOS에서는 .o(목적파일)이 생성됩니다. 일시적으로 생성되고 다시 지워집니다.
mac에서는 dSYM이라는 파일이 함께 생성되는데 해당파일은 디버깅시 중요한 역할을 한다고 합니다.
* 재미난 사실
사실 컴퓨터는 16진수로 연산을 합니다. 2진수 연산이 아니다.(0.5byte 자료형을 찾을 수 없는 이유)
10진수 -> 10의 자리에서 올라가고
16진수 -> 16의 자리에서 올라감(a,b,c,d,e,f가 표현할때 필요한 이유)
메모리를 찍어봐도 16진수로 나오는것을 볼 수 있다.
'프로그래밍 > C,C++' 카테고리의 다른 글
[C/C++] Swap 예제를 통해 포인터 맛보기 (0) | 2023.06.07 |
---|---|
[C/C++] 로또 번호 셔플 예제 (0) | 2023.06.07 |
배열(array) 예제와 함께 가볍게 알아보기 (0) | 2023.06.05 |
형변환(type casting) (0) | 2023.06.05 |
[오류_C/C++] clang: error: linker command failed with exit code 1 (use -v to see invocation) 에러 (0) | 2023.06.05 |