본문 바로가기

Computer Science/Computational thinking

컴퓨팅 사고 | 컴파일링

✔ 학습목표

컴파일링의 네 단계를 설명할 수 있다.

 

 

컴파일링

지금까지는 아무것도 모른 채 코드를 컴파일했다면, 이제부터는 연습과 응용을 통해 동작 원리를 이해할 수 있을 것이다.

 

C 코드로 작성된 쉬운 예시(hello.c)를 보자.

 

#include <stdio.h>

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

 

"hello, world"를 출력하는 프로그램이다.

 

우선 main 이라는 함수가 있다. 이는 프로그램의 시작점으로 실행 버튼을 클릭하는 것과 같다. main 함수 안의 printf는 출력을 담당하는 함수이다. 이 함수를 사용하기 위해 stdio.h 가 필요하다. stdio.h는 C언어로 작성된 헤더 파일로, printf 함수의 프로토 타입을 담고 있다. 

 

C언어 강의에서 우리는 clang -o hello hello.c 라는 명령어를 사용해 프로그램을 컴파일했다. 더 간단히는 make 프로그램을 사용하기도 했다. make나 clang을 사용해서 프로그램을 실행할 때 컴퓨터는 아래의 네 단계를 거친다.

 

 

 

1) 전처리(Precompile)

첫번째 단계는 전처리로, 전처리기에 의해 수행된다. #으로 시작되는 C 소스코드는 전처리기에게 실질적인 컴파일이 이루어지기 전에 무언가를 실행하라고 알려준다. 예를 들어 #include <stdio.h>와 같은 줄이 코드에 포함되어 있으면, 전처리기가 stdio.h 에서 필요한 내용을 가져와 파일을 생성하는 식이다. 

 

 

2) 컴파일(Compile)

컴파일 단계에서는 컴파일러라 불리는 프로그램이 C 코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일한다. 컴파일이라는 용어는 소스 코드에서 오브젝트 코드로 변환하는 전체 과정을 통틀어 일컫기도 하지만, 구체적으로 전 처리한 소스코드를 어셈블리 코드로 변환시키는 단계를 말한다.

 

 

3) 어셈블(Assemble)

어셈블 단계에서는 어셈블리 코드를 오브젝트 코드로 변환한다. 이는 컴퓨터의 중앙처리장치가 프로그램을 어떻게 수행해야하는지 알 수 있도록 명령어 형태인 연속된 0과 1로 만들어 주는 작업이다. 변환작업은 어셈블러라는 프로그램이 수행한다.

 

 

4) 링크(Link)

링크 단계에서는 링커가 여러개의 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합친다. 소스 코드에서 오브젝트 코드로 컴파일 되어야 할 파일이 한 개라면, 컴파일 작업은 어셈블 단계에서 끝난다. 하지만 프로그램이 여러 개의 파일(math.h나 cs50.h와 같은 라이브러리 포함)로 이루어져 있어 하나의 오브젝트 파일로 합쳐져야 한다면 이 단계가 필요하다.

 

예를 들어 컴파일 하는 동안 cs50 라이브러리를 링크하면 오브젝트 코드는 GetInt()나 GetString()과 같은 함수를 어떻게 실행할지 알 수 있게 된다.

 

 

이 네 단계를 거치면 최종적으로 실행가능한 파일이 완성된다.

 

 

 

 


 

이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.

 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org