프로그램의 실행과정

 

C와 같은 고급언어는 프로그램의 작성에는 편리하나, 컴퓨터 자체는 이런 고급언어를 바로 이해하지 못한다. 따라서 사람이 작성한 프로그램을 컴퓨터가 이해할 수 있는 기계어로 바꾸어야 하는데 이 과정을 컴파일(compilation) 이라고 한다. 컴파일은 컴파일러(compiler)라고 부르는 프로그램에 의해 수행된다.

리눅스에서는 보통 gcc를 사용하는데 GNU  C Compiler 의 약자였으며 지금은 GNU Compiler Collection 이라고 하여 GNU에서 개발된 ANSI C 표준을 따르는 C 언어 컴파일러라고 할 수 있다.

다음의 예제를 보자

 

#include <stdio.h>

#define RIGHT 30
#define LEFT   20

int main()
{
        int area;
        area = RIGHT * LEFT;
        printf (AREA = %d\n",area);
        return 0;
}

 

컴파일을 위해서는 리눅스에서

$ gcc -o main  main.c

로 컴파일하면 실행파일 main 이 만들어진다.

-o 는 gcc 옵션으로 파일의 이름을 지정하는 옵션이다.

옵션이 없이 컴파일 하게되면

$ gcc main.c

a.out 라는 이름의 실행파일이 만들어 진다.

컴파일 과정을 보면 단순히 main.c 가 main 이라는 실행파일이 되는 것 뿐이지만 내부적으로는 여러 단계를 거친다.

 

1. C Preprocessing    2. C Compile    3. Assemble    4. Linking

의 과정을 거치는데 그림으로 보면

 

 

 A4_prgprecessing1.png

 

 

C Preprocessing

전처리 과정은 #include #define #ifdef 등 #으로 시작하는 여러 가지를 처리해 주는 과정이다. 파일포함 (헤더파일 등) 과 매크로 치환, 선택적 컴파일, 등등을 처리한다.

C언어 소스코드를 받아서 전처리가 완료된 C언어 소스코드로 만든다.

C Preprocessing을 gcc 컴파일 옵션으로 실행 해보자

$ gcc -E -o main.i main.c

.i 확장자의 파일이 생성되는데 파일을 확인해 보자

 

A4_prgprecessing2.png

 

A4_prgprecessing7.png

 

define 으로 정해준 LEFT 와 RIGHT 가  바뀐것을 볼 수 있다. 

 

 

C Compile

C Compile은 전처리과정을 거친 소스코드를 Assembly 코드로 만드는 일을 한다.

소스 코드를 읽은 후 그구조를 중간 형태의 언어로 바꾼뒤 다시 Assembly 소스 코드로 바꾸는 과정을 거친다.

다음 과정을 또 확인하여 보자

$ gcc -S  main.c

.s 파일이 생성되는데 확인하여 보자.

 

A4_prgprecessing4.png

 

Assemble 과정

Assemble 과정은 Assembly 소스 코드를 relocatable object 코드로 만드는 일은 한다.

이 과정에서 기계어로된 코드가  object 코드로 나오게 된다.

다음 과정을 확인하여 보자

$ gcc -c main.c

$ gcc -c main.s

  .o 파일이 생기는데 확인해보자

 

A4_prgprecessing5.png

 

Linking 과정

Linking 과정은 하나 이상의 오브젝트 파일과 라이브러리로 실행파일이나 오브젝트 파일을 만드는 것이다.

오브젝트 프로그램은 링커에 의해서 시스템 라이브러리, 사용자 라이브러리 파일과 다른 목적 프로그램들과 합쳐서 실행 프로그램을 만든다. 다른 목적 프로그램이란 큰 프로그램을 여러 개의 파일로 나누어 작성할 경우 여러개의 원시 프로그램으로 나누어서 각각을 분리하여 독립적으로 컴파일할 경우에 여러 개의 목적 프로그램이 생기는 것을 말한다. 링커는 이 목적 프로그램들을 한꺼번에 묶는 작업을 수행한다.

실행파일은 컴퓨터 내에 컴파일러가 없어도 그 자체로 바로 실행된다. 실행파일은 로더에 의해서 주 메모리에 적재되어 실행된다.

 

 

A4_prgprecessing6.png