이전에 C언어로 작성된 코드를 실행시키기 전에 컴파일러를 통해 소스코드를 머신코드로 바꾸는 작업을 clang과 make라는 명령어를 통해 수행하였다.
사실 위의 명령어로 컴파일 진행 시 다음과 같은 네 개의 단계를 거친다.
첫 번째 단계는 천처리인데, 해당 작업은 전처리기에 의해 수행된다.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string answer = get_string("What's your name?\n");
printf("hello, %s\n", answer);
}
위와 같이 작성했던 코드의 #으로 시작하는 부분의 파일로 들어가 해당되는 코드를 현재 파일에 붙여넣는 작업이다.
#include <cs50.h>
#include <stdio.h>
이 부분을
string get_string(string prompt);
int printf(string format, ...
이런식으로 바꿔준다(간단히 표현)
이 작업이 끝나면 전처리기는 새로운 파일을 생성하는데, 여전히 C소스코드 형태이다.
컴파일 단계는 컴파일러를 통해 C코드를 어셈블리어라는 언어로 바꿔주는데, 어셈블리어는 C보다 컴퓨터가 이해할 수 있는 언어에 조금 더 가깝다.
소스코드가 어셈블리어로 변환되면 어셈블 단계를 통해 어셈블리 코드를 오브젝트 코드로 변환시켜준다. 이 작업이 완료되면 실제로 컴퓨터가 이해할 수 있는 2진수로 변환되게 된다.
소스코드에서 오브젝트코드로 컴파일 되어야 할 파일이 한 개라면 컴파일 작업은 끝나지만, include작업같은것을 통해 다른 파일도 오브젝트 코드로 바꿔야하는 경우 링크라는 단계를 추가로 거치게 된다.
프로그램이 여러 파일로 이루어져 있어 여러 개의 오브젝트 코드가 나왔을 경우 하나의 오브젝트 파일로 합쳐야하는데, 이 작업을 링크라고 한다.
네이버 부스트코스 모두를 위한 컴퓨터 과학 (CS50 2019)
https://www.boostcourse.org/cs112/lecture/119011