관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

명령어 3 - C 언어의 컴파일 과정 본문

알고리즘 및 자료 관리/컴퓨터 구조 & 운영체제

명령어 3 - C 언어의 컴파일 과정

huenuri 2024. 10. 15. 05:37

이 학습 내용은 책에는 없는 내용인데 따로 학습해 본다. C 언어가 컴파일되는 과정을 실습을 통해 직접 알아보려고 한다. 따로 책으로 학습을 진행했는데 강의가 있어서 이것도 함께 들으며 정리해 보았다.


 

목적 파일 VS 실행 파일

목적 코드로 이루어진 파일을 목적 파일이라고 부른다. 마찬가지로 실행 코드로 이루어진 파일을 실행 파일이라고 부른다. 윈도우의. exe 확장자를 가진 파일이 대표적인 실행 파일이다.

목적코드는 컴퓨터가 이해하는 저급 언어이다. 그렇다면 목적 파일과 실행 파일은 같은 의미일까? 그렇지 않다. 목적 코드가 실행 파일이 되기 위해서는 링킹이라는 작업을 거쳐야 한다. 링킹이 무엇인지 간단한 예시를 통해 알아볼 것이다.

 

예를 들어 캄파일 언어로 help.c와 main.c라는 두 개의 소스 코드를 작성했다고 가정해 보자. 각각의 소스 코드 내부에 아래와 같은 내용이 담겨 있다.

  1. helper.c 안에는 'HELPER_더하기'라는 기능이 구현되어 있다.
  2. main.c는 helper.c에 구현된 'HELPER_더하기' 기능과 프로그래밍 언어가 기본으로 제공하는 '화면_출력'이라는 기능을 가져다 사용한다.

 

이들을 컴파일하면 각각의 소스 코드로부터 목적 코드가 생긴다. helper.c와 main.c의 목적 파일은 각각 helper.o, main.o라고 지칭하겠다.

 

 

main.o는 저급 언어니까 바로 실행할 수 있을까? 실행할 수 없다. main.o는 main.c 내용이 그대로 저급 언어로 변환된 파일일 뿐 main.c에 없는 'HELPER_더하기'나 '화면_출력'은 어떻게 실행하는지 알지 못하기 때문이다.

따라서 main.o가 실행되면 main.o에 없는 외부 기능들, 즉 'HELPER_더하기' 기능과 '화면_출력' 기능을 main.o와 연결 짓는 작업이 필요하다. 이러한 연결 작업 링킹이다. 링킹 작업까지 거치면 비로소 하나의 실행 파일이 만들어진다.


 

 

 

 

 

C 언어 실행 파일을 만들면 이렇게 실행 파일까지 한 번에 해결되지만 내부적으로는 이러한 과정을 거친다.

 

 

 

전처리기

전처리 확장자는 i라고 쓴다.

 

 

 

 

컴파일 예시 직접 살펴보기

 

C 언어로 작성이 위의 소스 코드를 gcc라는 컴파일러로 컴파일을 했다.  여기에 명령어를 주면 전처리가 완료된 실행 파일을 얻을 수 있다.

 

 

 

 

외부에서 사용되는 소스 코드를 내 소스 코드에 그대로 가지고 오는 과정이 전처리 과정의 일부이다. 즉, 전처리는 컴파일을 하기 위한 준비를 하는 것이다.

 


 

 

 

컴파일러

 

 

이 소스 코드를 컴퓨터가 이해할 수 있는 저급 언어로 변환해주어야 한다.

 

 

컴파일 예시 직접 살펴보기

 

 

 

이 소스 코드를 어셈블리어로 변환환 과정이다. 앞서 어셈블리어는 CPU, 컴파일러의 종류에 따라 다른 모습을 띤다고 이야기했었다. 따라서 각자의 소스 코드는 다르게 만들어 수 있다.


 

 

 

어셈블러

 

 

목적 파일을 어셈블하게 되면 이러한 파일이 만들어진다.

 

 

이것은 0과 1로 이루어진 파일이다.

 

 

 

그리고 이러한 파일도 열어서 볼 수 있다. 우리가 print 하려고 했던 문자열도 목적 코드로 만들어서 볼 수 있다.


 

 

 

 

 

왼쪽의 있는 파일을 목적 코드로만 실행하면 실행이 되지 않는다.

 

 

이 둘을 연결시켜 주는 링킹이 필요하다.

 

 


 

 

 

 

학습을 마치고

책으로 읽기만 할 때는 솔직히 무슨 말인지 잘 이해가 되지 않았는데 강의를 통해 직접 예시로 보여주는 컴파일 과정도 보면서 많은 것들을 배울 수 있었다.

하나라도 놓치지 않고 가르쳐 주시려는 강사님의 열정이 보였다. 처음으로 어셈블러를 변환하는 과정도 살펴보았는데 나중에 이런 코드도 직접 작성해보고 싶다.