컴파일링
컴파일은 소스코드를 오브젝트코드로 바꾸는 과정을 말한다.
오브젝트 코드란 0과 1로 이루어진 코드
이전에 clang과 -l를 입력하지 않고 make라는 명령어로 컴파일 하는 과정을 배웠다
여기서 clang이란 컴파일러를 호출해서 소스코드를 오브젝트코드로 만드는 명령어다.
#include <stdio.h>
#include <cs50.h>
int main(void)
{
string name = get_string("What's your name?\n");
printf("hello, %s\n", name);
}
실행 시 터미널에 clang -o hello hello.c -lcs50 입력
위의 과정을 통해 컴파일의 네단계를 볼 수가 있다.
컴파일은 네 단계로 나누어 볼 수 있음
- 전처리(Precompile)
- 컴파일(Compile)
- 어셈블(Assemble)
- 링크(Link)
1)전처리
전처리기를 이용해 컴파일하는 단계
위 코드의 #는 컴파일 이전에 실행시켜달라는 뜻. include는 다른 내용의 파일을 포함시키라는 뜻,
#include<stdio.h>는 printf라는 출력함수를 실행하기 위해서는 stdio.h라는 라이브러리가 (헤더파일,c언어로 작성되어있는 파일임) 필요하므로 소스파일에 합친다.
stdio안에 printf의 프로토 타입이 있어 clang이 컴파일할때 printf가 뭔지 알려준다.
소스코드->소스파일
2)컴파일
컴파일러로 전처리한 소스코드를 어셈블리어로 컴파일함.
어셈블리어는 저수준 프로그래밍 언어임.
(소스코드->오브젝트코드 전체 컴파일 하는 과정을 통틀어서 컴파일이라고도 하고 소스코드->어셈블리어 로 바꾸는 컴파일의 과정 일부분도 컴파일이라 지칭한다.)
3)어셈블
어셈블리 코드를 오브젝트 코드로 변환시키는 단계
만약 소스코드에서 오브젝트 코드로 바꿔줘야할 파일이 딱 한개라면 컴파일은 여기서 끝이난다
4)링크
터미널 창에 입력한 -lcs50 여기서 l은 link 하라는 뜻이다.
cs50헤더 파일에 담긴 C언어또한 오브젝트로 컴파일된다. 링크는 링커를 통해 다른파일의 오브젝트 코드를 하나로 합쳐주는 작업이다.