첫 프로그램과 컴파일 과정
지난 편에서는 개발환경을 설치하고 hello.c를 실행해서 화면에 Hello, C language!를 띄워봤습니다. 코드는 몇 줄 안 되지만, 그 안에는 C언어의 핵심 개념들이 다 들어있어요. 이번 편에서는 그 코드를 한 줄씩 뜯어보고, gcc hello.c -o hello 명령을 실행했을 때 컴퓨터 내부에서 실제로 어떤 과정이 일어나는지 살펴보겠습니다.
코드 한 줄씩 뜯어보기
먼저 지난 편에서 썼던 예제를 다시 가져와 봅시다.
#include <stdio.h>
int main(void) {
printf("Hello, C language!\n");
return 0;
}
#include <stdio.h>:stdio.h는 “standard input/output(표준 입출력)”의 줄임말입니다. 이 줄은 “printf 같은 입출력 함수를 쓰겠다”고 컴파일러에게 미리 알려주는 역할을 합니다. 이걸 빼면printf가 어디서 온 함수인지 몰라서 컴파일 에러가 납니다.int main(void): C 프로그램은 항상main함수에서 실행이 시작됩니다. 즉, 아무리 코드가 길어도 프로그램의 시작점은 항상main이에요.int는 이 함수가 끝날 때 정수값을 반환한다는 뜻이고,void는 “입력값(매개변수)이 없다”는 뜻입니다.printf("Hello, C language!\n");: 괄호 안의 문자열을 화면(정확히는 표준 출력)에 출력하는 함수입니다. 끝에 붙은\n은 줄바꿈 문자로, 다음 출력이 새 줄에서 시작되게 해줍니다.return 0;:main함수를 종료하면서 운영체제에 0이라는 값을 돌려줍니다. 관례적으로 0은 “프로그램이 정상적으로 끝났다”는 의미로 쓰입니다. 만약 오류가 있었다면 0이 아닌 값을 반환해서 문제가 있었음을 알릴 수 있어요.
컴파일 과정, 정확히 무슨 일이 일어날까?
gcc hello.c -o hello라는 명령 한 줄을 실행하면 사실 컴퓨터 내부에서는 네 단계가 순서대로 진행됩니다.
- 전처리(Preprocessing):
#include,#define같은#으로 시작하는 전처리 지시문을 처리하는 단계입니다.#include <stdio.h>가 있으면, 그 자리에stdio.h파일의 내용이 통째로 복사되어 들어갑니다. - 컴파일(Compilation): 전처리가 끝난 C 코드를 어셈블리어 코드로 변환합니다. 이 단계에서 문법 오류(세미콜론 누락, 괄호 짝이 안 맞는 경우 등)가 있으면 바로 에러가 발생합니다.
- 어셈블(Assembly): 어셈블리 코드를 컴퓨터가 직접 이해할 수 있는 기계어, 즉 오브젝트 파일(
.o또는.obj)로 변환합니다. - 링킹(Linking): 오브젝트 파일과
printf같은 라이브러리 함수들을 하나로 묶어서 최종 실행 파일(hello또는hello.exe)을 만듭니다.printf의 실제 구현 코드는 우리가 작성하지 않았는데도 실행이 되는 이유가 바로 이 링킹 단계 덕분입니다.
이 네 단계를 직접 눈으로 확인해보고 싶다면, 각 단계마다 결과물을 따로 만들어볼 수 있습니다.
# 1. 전처리 결과만 확인 (확장된 소스 코드)
gcc -E hello.c -o hello.i
# 2~3. 오브젝트 파일까지만 생성 (링킹 전 단계)
gcc -c hello.c -o hello.o
# 4. 최종 실행 파일 생성 (전체 과정)
gcc hello.c -o hello
실행하고 결과 확인하기
터미널에서 아래처럼 컴파일하고 실행해봅시다.
gcc hello.c -o hello
./hello
정상적으로 진행됐다면 아래와 같은 결과가 출력됩니다.
Hello, C language!
만약 중간에 세미콜론(;)을 하나 빼먹거나 stdio.h를 include하지 않으면 컴파일 단계에서 에러 메시지가 출력되면서 실행 파일 자체가 만들어지지 않습니다. 즉, C언어는 문법이 틀리면 아예 실행조차 되지 않는 엄격한 언어라는 점을 기억해두세요. 에러 메시지를 무서워하지 말고, 어떤 줄에서 어떤 문제가 있는지 차근차근 읽어보는 습관을 들이면 좋습니다.
핵심 요약
- C 프로그램은 항상
main함수에서 시작됩니다. #include는 다른 파일(주로 헤더 파일)의 내용을 가져오는 전처리 지시문입니다.- 컴파일은 “전처리 → 컴파일 → 어셈블 → 링킹” 네 단계를 거쳐 실행 파일이 만들어지는 과정입니다.
gcc 파일명.c -o 실행파일명명령 하나로 이 네 단계가 한 번에 처리됩니다.
다음 편에서는 프로그램에서 데이터를 저장하는 가장 기본적인 방법인 “변수와 자료형”에 대해 알아보겠습니다. int, float, char 같은 기본 자료형들이 각각 어떤 데이터를 담기 위한 것인지 하나씩 살펴볼 예정이니 기대해주세요.