Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Development Log

[CS50] 배열 - 컴파일링 본문

성장 여행기/CS50

[CS50] 배열 - 컴파일링

gu-su 2022. 3. 25. 18:56
컴파일은 소스코드를 오브젝트 코드로 변환시키는 과정이다.
소스코드 : C언어와 같은 프로그래밍 언어로 작성한 코드
오브젝트 코드(머시코드) : 기계어, 0과 1로 이루어져 있으면 컴퓨터에게 프로그램이 어떻게 실행되어야 하는지 알려주는 코드 

 

컴파일링

// hello.c
#include <stdio.h>
#include <cs50.h>

int main(void)
{
    string name = get_string("What's your name?\n");
    printf("hello, %s\n",name);
}
make나 clang을 사용해서 프로그램을 실행할 때 아래와 같은 4단계를 거친다.
make 명령어 자체는 컴파일러가 아니고, clang이라는 컴파일러를 호출해서 c 소스코드를 오브젝트 코드로 컴파일 하도록 한다. 
$ clang -o hello hello.c -lcs50

 

1. 전처리(Precompile)

  • 전처리기에 의해 수행된다.
  • #으로 시작되는 C소스 코드는 전처리기에게 실질적인 컴파일이 이루어지기 전에 무언가를 실행하라고 알려준다.
#include <stdio.h>
// #include : 전처리에게 다른 파일의 내용을 포함시키라고 알려준다.
// 즉, stdio.h 파일의 내용이 #include 부분에 포함이 된다.

 

1) 아래와 같이 파일을 추가하라는 줄 대신 clang이 해당 파일(stdio.h, cs50.h)에 직접 들어가 해당되는 코드를 가져와서 실행 파일(hello.c)에 붙여 넣는다.

#include <stdio.h>
#include <cs50.h>

 

// hello.c
...
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);
}

 

2. 컴파일(Compile)

  • 전처리기가 전처리한 소스코드를 생성하고 난 그 다음 단계이다.
  • C코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일 한다.
  • 컴퓨터의 뇌인 CPU가 실제로 이해할 수 있는 언어에 조금 더 가까워진다. 

 

3. 어셈블(Assemble)

  • 소스코드가 어셈블리 코드로 변환되고 난 그 다음 단계인다.
  • 어셈블리 코드를 오브젝트 코드(머신코드)로 변환시키는 것이다. 
  • 컴퓨터의 CPU가 프로그램을 어떻게 수행해야 하는지 알 수 있는 명렁여 형태연속된 0과 1들로 바꿔주는 작업이다.
  • 변환작업은 어셈블러라는 프로그램이 수행한다.
  • 소스코드에서 오브젝트 코드로 컴파일 되어야할 파일이 딱 한개라면, 컴파일 작업은 여기서 끝이 난다.

 

4. 링크(Link)

  • 프로그램이 여러 개의 파일로 이루어져 있어 하나의 오브젝트 파일로 합쳐져야 한다면 링크라는 단계가 필요하다.
  • 여러 개의 다른 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합쳐준다.

합치기 전 합친 후

 

think about

1) 만약 컴파일링 과정을 거치지 않기 위해 바로 머신코드로 우리가 원하는 프로그램을 작성하려고 한다면 어떤 문제가 있을까요?

더보기
머신코드는 컴퓨터가 이해하기 위해 만들어진 코드로 0과 1로만 구성되어야 한다.
위의 과정을들 거치지 않고 바로한다면 하나하나 수동으로 직접 변환을 해야하기 때문에 처리속도가 늦어진다. 
사람이 직관적으로 이해하고 작성하기에는 상대적으로 어려움이 있다. 

 

David J. Malan의 강의

 

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

부스트코스 무료 강의

www.boostcourse.org