여러분들은 코드를 컴파일할 때 어떤 과정들로 인해 머신코드로 변환되는 것인지 알고 계신가요? make나 clang같은 컴파일러를 사용할 때 과정을 상세히 알려드리겠습니다.
preprocessing
#기호로 시작하는 #include <stdio.h> 줄들은 해당 파일의 실제 코드로 대체됩니다.
즉 clang이 파일에 직접 들어가 해당되는 코드를 가져와서 우리의 파일에 붙여넣는 것입니다.
compiling
소스코드를 머신코드로 바꾸는 단계로
clang와 같은 컴파일러에 의해서 컴파일되면 다음과 같은 어셈블리 코드라는 중간 단계로 바뀝니다. 이는 컴퓨터의 뇌인 CPU가 실제로 이해할 수 있는 언어에 조금 더 가까워집니다.
assembling
clang이 이 어셈블리 코드를 입력으로 받아 0과 1로 이루어진 머신 코드를 만듭니다.
모든 0과 1로 이루어진 각각의 파일을 하나의 큰 파일로 합치는 것입니다.
마치 a.out이나 hello 처럼요.
만약 프로그램이 (math.h나 cs50.h와 같은 라이브러리를 포함해) 여러 개의 파일로 이루어져 있어 하나의 오브젝트 파일로 합쳐져야 한다면 링크라는 컴파일의 마지막 단계가 필요합니다.
이 모든 단계를 컴파일이라고 부릅니다.
컴파일이라는 용어는 소스 코드에서 오브젝트 코드로 변환하는 전체 과정을 통틀어 일컫기도 하지만, 구체적으로 전처리한 소스 코드를 어셈블리 코드로 변환시키는 단계를 말하기도 합니다.