CS 기초/배열

[CS50] 컴파일링

담크 2021. 8. 4. 12:49

지금까지 C 코드를 작성하고 실행하기 위해서는 '컴파일링' 이라는것을 해줘야 합니다.

그렇다면 컴파일링이 무엇인지, 컴파일링을 하면 구체적으로 어떤 단계를 거쳐서 컴퓨터가 해석 가능하게 변하는지를 공부해보도록 하겠습니다.

 

우선 컴파일링이란

컴파일 하는 과정을 말하며, 사용자가 작성한 소스코드를 컴퓨터가 이해할 수 있도록 0과 1로 구성된 바이너리 언어 파일로 바꿔주는 것을 말합니다.

#include<stdio.h>

int main(void){
	printf("hello, world\n");
}

이 코드를 실행하려면 clang hello.c로 컴파일 하고, ./a.out 명령을 통해 프로그램을 실행하게 되는데

프로그램을 실행할 때 아래의 4 단계를 거칩니다. (단어가 이해가 안 된다면 영어단어 그대로 보셔도 됩니다.)

1. 전처리 (Precompile)

2. 컴파일링 (Compile)

3. 어셈블링 (Assemble)

4. 링킹 (Link)

 

그림으로 보면 이렇게 나오는데 그럼 각각의 단계에선 어떤 역할이 이루어지는지 자세하게 살펴보겠습니다.

 

 

전처리

전처리기에 의해 수행되며 #으로 시작되는 C 코드는 실질적인 전처리기에게 컴파일이 이루어지기 전에(Precompile) 무언가를 실행하라고 알려주는 행위를 합니다.

예를 들어 #include<stdio.h>를 통해 전처리기에게 <stdio.h>파일의 내용을 가져와서 printf가 무슨 역할을 하는지 알려줘 라고 하는 것과 같습니다.

 

컴파일

전처리 과정이 끝나면 컴파일을 하는데 이는 C를 어셈블리어라는 프로그래밍 언어로 컴파일합니다.

어셈블리어는 컴퓨터가 이해할 수 있는 언어와 최대한 가까운 프로그램으로 만들어줍니다. 

 

어셈블

컴파일 과정에서 소스코드가 어셈블리 코드로 변환되면 이 단계에서 어셈블리 코드를 오브젝트 코드로 변환시켜주는 작업을 합니다. 여기서 CPU가 프로그램을 어떻게 수행해야 하는지 알 수 있는 0과 1을 사용한 코드로 바꿔줍니다.

이러한 변환작업은 어셈블러라는 프로그램이 수행합니다.

* 소스코드에서 오브젝트 코드로 컴파일되어야 하는 파일이 한 개라면 컴파일 작업은 여기서 끝나지만 그렇지 않을 경우 링크라고 불리는 단계가 추가됩니다.

 

링크

만약 프로그램이 <stdio.h>, <cs50.h>, <math.h>... 등 라이브러리를 포함한 여러 개의 파일로 이루어져있어 하나의 오브젝트 파일로 합쳐야 한다면 링크 단계가 필요합니다. 

링크는 여러개의 다른 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합쳐줍니다.

예를 들면 컴파일하는 동안 CS50 라이브러리를 링크하면 오브젝트 코드는 getInt( )나 getString( ) 같은 함수를 어떻게 실행할지 알 수 있게 해 줍니다.

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 배열' 카테고리의 다른 글

[CS50] 문자열의 활용  (0) 2021.08.09
[CS50] 문자열과 배열  (0) 2021.08.08
[CS50] 배열  (0) 2021.08.07
[CS50] 코드의 디자인  (0) 2021.08.06
[CS50] 디버깅  (0) 2021.08.05