[C언어][초급] Chapter02. C언어와 컴파일러 – 우리가 쓴 코드가 실행되기까지
C언어를 배우기 시작하면 가장 먼저 마주치는 개념 중 하나가 바로 컴파일러입니다.
“컴파일한다”, “컴파일 에러”, “컴파일이 안 돼요” 같은 말이 일상처럼 들리지만, 막상 "컴파일러가 뭐야?"라고 물으면 정확히 설명하기 어려운 경우도 많습니다.
이번 글에서는 컴파일러가 무엇인지, 왜 필요한지, 그리고 우리가 작성한 C 코드가 어떻게 실행파일이 되는지 단계별로 알아보겠습니다.
● 컴파일러란 무엇인가?
간단히 말해 **컴파일러(Compiler)**는 사람이 쓴 코드(소스코드)를 컴퓨터가 이해할 수 있는 기계어로 바꿔주는 번역기입니다.
C언어로 작성된 hello.c 같은 파일은 사람이 보기엔 읽기 좋지만, 컴퓨터는 이를 그대로 이해하지 못합니다.
그래서 컴파일러가 이 코드를 해석해서 **실행 가능한 파일(.exe, .out 등)**로 만들어주는 것이죠.
● 인터프리터와의 차이점
많이들 헷갈리는 개념 중 하나가 **인터프리터(interpreter)**입니다. Python 같은 언어는 인터프리터 방식으로 실행되는데요, 그 차이를 한 줄로 설명하면:
- 컴파일러: 코드를 한 번에 모두 번역 → 실행파일 생성
- 인터프리터: 코드를 한 줄씩 읽어가며 바로 실행
즉, C언어는 코드를 ‘미리’ 번역해놓고, 그 결과물을 실행하는 반면, Python은 실행하면서 번역하는 방식입니다.
● C 프로그램 실행 과정
C언어로 작성된 소스코드가 실행되기까지는 다음과 같은 과정을 거칩니다:
- 전처리 (Preprocessing)
#include, #define 등으로 시작하는 전처리 지시문을 처리합니다.
예: 헤더 파일을 불러오거나 매크로 치환 등을 수행합니다. - 컴파일 (Compiling)
전처리된 코드를 어셈블리어로 바꾸는 단계입니다. 문법 오류가 있다면 이 단계에서 에러가 발생합니다. - 어셈블 (Assembling)
어셈블리 코드를 기계어로 변환하여 **목적 파일(.obj, .o)**을 생성합니다. - 링크 (Linking)
여러 개의 목적 파일을 연결하거나, 외부 라이브러리와 결합하여 최종 **실행 파일(.exe, .out 등)**을 생성합니다.
이 모든 과정을 통틀어 우리는 흔히 "컴파일한다"라고 부릅니다.
● 대표적인 C 컴파일러들
C언어를 컴파일하는 데는 여러 종류의 컴파일러가 있습니다. 운영체제나 개발 환경에 따라 선택이 달라질 수 있죠.
- GCC (GNU Compiler Collection) – 리눅스에서 가장 많이 사용됨
- Clang – macOS와 iOS 개발에서 자주 사용
- MSVC (Microsoft Visual C++) – 윈도우에서 Visual Studio를 사용할 때 기본으로 제공
- TCC (Tiny C Compiler) – 가볍고 빠른 컴파일러
개발자들은 상황에 맞게 다양한 컴파일러를 활용합니다.
● 정리하며
컴파일러는 우리가 작성한 C언어 코드를 실행 가능한 프로그램으로 바꿔주는 중간 다리입니다.
그 과정을 이해하면 단순히 에러 메시지를 보는 것이 아니라, 어느 단계에서 문제가 생겼는지도 함께 파악할 수 있게 됩니다.
이러한 이해는 디버깅 능력 향상에도 큰 도움이 됩니다.