킹의 개발일지

C 프로그래밍 본문

프로그래밍 언어/C

C 프로그래밍

k1ng 2022. 11. 28. 11:15

수업시간에 배운 c언어로 아주 열심히!! 만든 소스파일들이 있다고 하자. 열심히 만들었으니 소스파일을 실행시켜 노력의 결실을 맺고싶다. 하지만! 소스파일 하나만으로는 내가 의도한 결과를 볼 수 없다..

 

그럼 어떻게 해야할까?!

 

바로 실행 파일(executable file)을 생성해야한다! 실행파일은 .exe 확장자를 가지는 파일인데, 게임을 다운받거나 할 때 많이 보았을것이다. (lol.exe..)

 

아래 그림에는 c언어로 작성된 코드가 실행 파일로 만들어지는 과정을 나타내고 있다.

 

c언어 실행파일 생성 순서, 출처 tcp shcool

 

1. 소스 파일 작성

프로그래밍에서 가장 먼저 해야할 작업은 바로 소스 파일을 작성하는것이다. 실행 파일을 만들기 위해서는, 당연히 우리가 만든 소스 파일이 있어야한다. vs이나 코드블럭 등, IDE에서(물론 메모장에서도 만들 수 있다.) 열심히?.. 코드를 작성하고나면 *** .c 파일을 만들수 있다. 이것이 바로 소스 파일이다. c언어로 만들어진 소스 파일은  .c 확장자를 가진다.

 

2. 선행처리기(preprocessor)에 의한 선행처리

c언어로 소스 파일을 만들다 보면 # include, #define... 등 '#'이 들어간 구절을 볼 수 있을 것이다. 이는 선행처리 문자로, 선행처리 지시문의 처리 작업을 해달라는 것을 의미한다.

 

이러한 선행처리 작업은 선행 처리기(preprocessor)가 수행한다. 선행처리기는 코드를 생성하거나 하는것이 아니라 컴파일을 하기전에 컴파일러가 작업하기 좋도록 소스를 재구성 해주는 역할을 한다.

이름에 걸맞게 컴파일러 전에 '선행처리' 된다!

 

선행처리 지시자에는 여러가지가 있는데, 대표적으로 #include, #define, #ifndef 등이 있다 선행처리 지시자가 하는일은 나중에 다시 포스팅 하도록 하겠다.

 

3. 컴파일러(compiler)에 의한 컴파일

이제껏 우리가 작성한 코드는 사실 컴퓨터가 이해할 수 없다. 물론 나도 가끔 이해할 수 없긴하지만... 여튼 컴퓨터는 0과 1로 이루어진 이진수로 작성된 기계어만 이해할 수 있다. 똑똑한 줄 알았지만 사실 멍청한것이 아닌가?

따라서 우리가 작성한 소스 파일을 컴퓨터가 알아볼 수 있는 기계어로 변환시켜야 하는데, 이 작업을 컴파일(compile)이라고한다.

 

컴파일은 컴파일러에 의해서 수행되며, 컴파일이 끝나서 기계어로 변환된 파일을 오브젝트(목적 파일) 파일이라고 한다. 그래서 이 파일의 확장자는 .o가 된다.

 

c언어로 작성한 소스 파일을 목적파일로 만들고 메모장으로 열어봤는데, 위 그림처럼 나왔다. 저것이 기계어란 말인가..

사실 이 파일은 main 함수의 인스트럭션들을 인코딩하기 위한 바이너리 파일이다. 그래서 목적 파일을 텍스트 편집기로 열어보면 위 처럼 쓰레기 같은 데이터로 보일 것이다!

 

4. 링커(linker)에 의한 링크

컴파일러에 의해 생성된 오브젝트 파일은 운영체제와의 인터페이스를 담당하는 시동 코드(start-up code)를 가지고 있지 않는다.

 

여기서 스타트업 코드는 고급언어로 쓰여진 소프트웨어의 실행을 준비하는 어셈블리 언어 코드의 작은 블럭이다. 

그리고 이런 스타트업 코드는 스택을 위한 공간을 할당, 초기화하고 프로세서의 스택 포인터를 초기화 해준다. 또한 힙을 생성하고 main함수를 호출하는 등의 다양한 일을 한다.

 

또한, 대부분의 C 프로그램에서 사용하는 C 표준 라이브러리 파일도 포함되어 있지 않다. 이게 무슨 소리냐 하면 printf 같은 함수를 쓰기위해 해당 함수가 쓰여진 헤더 파일을 (#include <stdio.h>)봐! 라고 명령했지만 아직 결합되지 않은 상태이기 때문에 링킹 과정없이는 printf같은 함수는 실행될 수 없다.

 

때문에 링킹은 하나 이상의 오브젝트 파일과 라이브러리 파일, 시동 코드 등을 합쳐 하나의 파일로 만드는 작업을하는 과정이라고 볼 수 있다.

 

링크는 링커(linker)에 의해 수행되며, 링크가 끝나면 하나의 새로운 실행 파일이나 라이브러리 파일이 생성된다!! 드디어..!

 

5. 실행 파일(executable file)의 생성

링크 과정이 끝나게 되면 .exe파일이 만들어지는데 이를 통해서 소스 파일에 적었던 내용이 실행될 수 있게 되는것이다! 게임도 실행 시킬 수 있고 특정 앱을 설치 할 수 도 있게 되는것이다! 


c언어를 배우다 보면 평소 생각하지 않았던 컴파일 과정, 메모리 할당, 해제 등 컴퓨터 기저까지 공부 할 수 있게 된다. 언어를 배우면서 그런거 까지? 꿩먹고 알먹기라 할 수 있다! 그래서 c언어를 공부하면서 간간히 포스팅 할 예정이다!  

'프로그래밍 언어 > C' 카테고리의 다른 글

C언어의 메모리 구조, 메모리 동적 할당  (0) 2022.12.05