ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C 프로그램의 동작 과정
    C언어 2020. 3. 16. 13:09

    이번 포스트에서는 C 언어로 작성한 프로그램이 어떤식으로 동작하는지에 대한 순서를 살펴볼 것이다.

     

    1. Editor 를 이용한 프로그램 작성 ( C언어로 작성 된 파일 )

    EX ) 비쥬얼 스튜디오 같은 에디터로 C언어를 이용하여 프로그램을 작성한다 ( 함수, 변수, 조건문, 반복문 등을 이용해 작성 )

     

    2. Compiler 를 이용한 오프젝트 파일 생성 ( 바이너리 형태로 작성 된 코드 )

    Editor 로 작성한 (C 언어 형태) 프로그램을 컴파일러를 사용해 컴퓨터가 인식할 수 있는 바이너리 형태로 작성 된 파일을 생성 한다는 의미이다.

    이때 컴파일과정 내부는 2단계로 나눌 수 있다.  

    1 단계

    Preprocessor (전 처리기) : 컴파일시 가장 먼저 수행 되는 과정으로 선처리 과정을 의미한다. 이 선처리 과정은 코드 영역과, 디렉티브 영역에 있는 내용을 분리하는 과정이라고 볼 수 있다.

    • 코드 영역 : 사용자가 작성한 프로그렘에서 실제로 바이너리 형태로 바뀌어야 하는 부분 즉 해당 프로그램의 내용 중 동작을 명령하는 부분들 (함수와 같은 부분)  을 코드라고 야기한다.
    • 디렉티브 영역 : 실질적으로 동작해야 하는 내용은 아니지만 컴파일러에게 추가적인 정보를 제공하기 위한 부분 예를 들어 코드 영역의 내용중 외부에서 정의 되어있는 함수를 사용할 때 해당 함수가 어디에 위치해 있는지에 대한 정보 ' #include <stdio.h> '  와 같은 영역을 의미한다.
    • 위와 같이 프로그램의 실질적 동작을 의미하는 코드 부분과 추가적인 정보를 제공하는디렉티브 영역을 나누는 선처리 과정이 가장 먼저 일어난다.

    2 단계

    Preprocessor 과정 후 컴퓨터가 인식가능한 바이너리 형태의 파일을 생성한다. 이때 컴파일 과정 내부로는 코드에 작성된 변수와 같이 메모리를 사용하는 요소는 메모리 영역에 배치하는 메모리 배치 과정, 작성된 코드를 어셈블리어로 변환하고 최종적으로는 바이너리 형태로 변환한다.

     

    3. Link 과정

    Link 과정은 Linker 라는 것을 통해 오브잭트 파일을 합치는 과정을 의미한다.

    예를 들어 사용자가 만약 1단계에서 작성한 프로그램이 외부에서 사용하는 함수를 사용하지 않거나, 또는 API를 사용하지 않을 경우에는 Link 과정이 필요 없을 것이다. 왜냐하면 해당 프로그램의 동작은 외부에 있는 기능을 사용하지 않고 작성하였기 때문이다.

    반대로 사용자가 프로그램에 외부에 있는 API기능 또는 printf 함수, gets 함수와 같은 기능을 사용하였다면 해당 프로그램이 동작하기 위해서는 외부에서 가져와 사용한 기능들의 동작역시 함께 추가하여야 할것이다.

    즉 Link 과정은 사용자가 작성한 프로그램이 만약 외부에 있는 기능을 가져다 사용했을 경우 사용한 외부의 기능이 정의되어 있는 바이너리 파일 역시 함께 가져와 합치는 " 사용자 작성 오브젝트 파일 " + " 외부 사용 기능 오브젝트 파일 " 과정을 통해 최종적인 실행 파일 ( exe ) 을 만드는 것을 의미한다.

     

    4. Load 과정

    Load 과정은 Link과정을 통해 만들어진 실행 파일을 실행하는 과정을 의미하며 실행해주는 역할은 Loader 라는 것이 해준다. 이때 Load 과정에서는 프로그램을 컴퓨터의 메모리에 넣는 동작을 시행한다. 따라서 사용자가 작성한 프로그램을 컴파일 과정으로 바이너리 형태의 파일로 생성하며 이렇게 생성한 파일의 내용을 메모리에 넣는 과정을 Load 과정이라 한다.

     

    5.  마지막으로 이렇게 Load 과정을 통해 프로그램이 메모리에 넣어 졌으면 CPU는 해당 메모리에 저장 된 바이너리 형태의 내용을 하나씩 읽어오며 동작하게 된다.

    'C언어' 카테고리의 다른 글

    컴파일 최적화  (0) 2020.03.27
    메모리 구조  (0) 2020.03.16
    스택 프레임 & 재귀함수  (0) 2020.03.13
    포인터의 이해  (0) 2020.03.07
    배열의 이해  (0) 2020.03.05

    댓글

Designed by Tistory.