하버드의 컴퓨터공학 강의를 통해서 C와 컴파일링에 대해서 배워봅니다.
컴파일Compile이란 우리가 작성한 소스코드를 머신코드(오브젝트 코드)로 변환해주는 것입니다.
소스코드란 C, Python, PHP 등과 같이 우리가 직접 프로그래밍 언어로 작성한 코드입니다.
머신코드(오브젝트코드)란 기계의 언어 즉 0과 1로 이루어져 있으며 컴퓨터가 이해할 수 있는 언어입니다.
소스코드는 4단계를 거쳐서 머신코드로 변환됩니다.
- 전처리 Preprocessing
- 컴파일 Copiling
- 어셈블 Assembling
- 링크 Linking
이 네 단계를 통칭해 컴파일이라고 칭합니다.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string name = get_string("What's your name?\n");
printf("hello, %s\n", name);
}
이름을 묻고 받은 이름을 불러주는 간단한 위의 소스코드를 컴파일 하는 과정입니다.
1. 전처리 Preprocessing
...
string get_string(string prompt);
int printf(string format, ...);
...
int main(void)
{
string name = get_string("What's your name?\n");
printf("hello, %s\n", name);
}
컴파일의 전체 과정 중 첫 번째 단계인 전처리는 전처리기 clang에 의해 수행됩니다.
#으로 시작되는 C소스 코드는 전처리기에게 실질적인 컴파일이 이루어지기 이전에 무언가를 실행하라고 알려줍니다.
예를 들어 #include는 다른 파일의 내용을 해당 파일에 포함하라고 알려줍니다.
전처리 과정에서는 #include 부분에 포함된 소스코드와 합쳐졌을 뿐 여전히 C소스코드 형태입니다.
2. 컴파일 Compiling
컴파일러라고 불리는 프로그램은 C코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일합니다.
위에 보이는 것처럼 우리가 작성한 코드가 CPU가 이해할 수 있는 수준의 어셈블리 코드로 변환되었습니다.
어셈블리는 C보다 연산의 종류가 훨씬 적지만, 여러 연산들이 함께 사용되면 C에서 할 수 있는 모든 것들을 수행할 수 있습니다.
컴파일이라는 용어는 소스코드에서 머신코드(오브젝트 코드)로 변환하는 전체 과정을 통틀어 일컫기도 하지만, 구체적으로는 전처리한 소스 코드를 어셈블리 코드로 변환시키는 단계를 말하기도 합니다.
3. 어셈블링 Assembling
소스 코드가 어셈블리코드로 컴파일되면, 어셈블리 코드를 오브젝트 코드로 변환시키는 어셈블링 단계를 거칩니다.
연속된 0과 1의 형태로 변경해주는 것입니다. 이 변환작업은 어셈블러라는 프로그램이 수행합니다.
* 컴파일 되어야할 파일이 딱 한개라면 링크까지 가지않고 컴파일의 작업은 이 단계에서 끝나게 됩니다.
4. 링크 Linking
내 소스코드에 사용된 파일들이 0과 1로 모두 변환되었고 이것을 하나로 합치는 작업입니다.
우리가 작성한 소스코드가 math.h나 cs50.h와 같은 라이브러리 등을 불러와 여러개의 파일로 이루어져 있어서 이를 하나의 오브젝트 파일로 합쳐야 한다면 링크라는 컴파일의 마지막 단계가 추가됩니다.
링커는 여러개의 다른 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합쳐줍니다.
예를 들어, 컴파일을 하는 동안에 CS50라이브러리를 링크하면 머신코드는 이제 GetInt()나 GetString()과 같은 함수를 어떻게 실행할 지 알 수 있게 됩니다.
영상의 자막이 필요한 경우 아래 코스에서 자막을 볼 수 있습니다.
https://www.edwith.org/boostcourse-cs-050/lecture/119011/
[LECTURE] 1) 컴파일링 : edwith
들어가기 전에 우리가 작성한 C 코드를 실행하기 위해서는 컴파일링을 해줘야 합니다. C문법로 작성된 텍스트 형식의 파일은 컴파일링시 구체적으로 어떤 단계를 거쳐서 컴퓨터가 해석 가... -
www.edwith.org
'Learn > IT' 카테고리의 다른 글
하버드 컴퓨터공학 CS50 - C언어 배우기 (0) | 2020.11.07 |
---|---|
알고리즘, 의사코드Pseudo code (0) | 2020.11.03 |
CS50 - 정보의 표현 (0) | 2020.11.02 |
하버드 컴퓨터 과학 강의 듣기 CS50 (0) | 2020.11.01 |