[CS50] 컴파일링

devheyrin·2022년 4월 4일
0

CS50

목록 보기
2/2

지금까지는 아무것도 모른 채 마구잡이로 코드를 쓰고 돌렸다면, 이제 그 원리를 이해해 보자!

stdio.h

헤더 파일로, c언어로 작성되어있으며 .h로 끝나는 파일이다.

이 파일에는 printf 함수의 프로토타입이 있어서 Clang 컴파일러가 프로그램을 컴파일할 때 printf 가 무엇인지 알려 주는 역할을 한다.

main

프로그램의 시작을 의미하고, 스크래치에서 실행 버튼 ▶️  을 클릭하는 것과 같다.


컴파일의 4단계

make 나 clang 을 사용하면 hello.c 를 hello 라는 실행파일로 만들 수 있다. 이 과정을 우리는 ‘컴파일’이라고 불렀다.

그런데 컴파일 과정은 다음과 같은 4단계로 좀 더 자세히 나누어 볼 수 있다.

  • 전처리
  • 컴파일링
  • 어셈블링
  • 링킹

전처리, preprocessing

첫 번째 단계는 전처리이다. 전처리기에 의해 수행된다.

#으로 시작되는 C소스 코드는 전처리기에게 컴파일 전에 무언가를 실행하라고 알려주는 역할을 한다.

예를 들어 #include 는 전처리기에게 <>라는 파일의 내용을 포함시킬 것을 알려 주는 역할을 한다. #include 를 소스 코드에 포함시키면 전처리기는 새로운 파일을 생성하고(이 파일도 C소스코드 형태이다), stdio.h 파일의 내용을 #include 부분에 포함시킨다.

컴파일링, compiling

전처리가 완료되면 컴파일을 수행한다. 컴파일러라고 불리는 프로그램은 C코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일해준다. 컴퓨터가 이해할 수 있는 언어와 최대한 가까운 프로그램으로 만들어 주는 것이다.

컴파일이라는 용어는 주로 소스코드를 오브젝트코드로 변환하는 과정을 통틀어 말하는 것이지만, 전처리 코드를 어셈블리 코드로 변환시키는 단계를 말하는 것이기도 한다.

어셈블링, assembling

어셈블리 코드를 오브젝트 코드(0과 1로 이루어진 코드)로 변환시키는 단계이다. 어셈블러라는 프로그램에 의해 수행된다. 오브젝트 코드로 변환되어야 할 파일이 딱 한 개라면(다른 헤더파일을 포함하지 않는다면) 컴파일작업은 여기서 종료되지만, 그렇지 않다면 링킹이라는 단계가 추가되어야 한다.

링킹, linking

만약 프로그램이 여러 개의 파일로 이루어져 있어서(math.h, cs50.h 등을 포함한다면) 하나의 오브젝트 파일로 합쳐져야 한다면, 링킹이라는 단계가 필요하다. 링킹 작업은 링커에 의해 수행되는데, 링커는 여러 개의 오브젝트 코드 파일을 실행가능한 하나의 오브젝트 코드 파일로 합쳐준다.

profile
개발자 헤이린

0개의 댓글