[컴퓨터 시스템] 2. C는 왜 시스템의 입구가 되는가
시스템 공부를 시작할 때 왜 하필 C부터 보느냐는 질문이 자주 나옵니다. 이미 Python이나 JavaScript에 익숙하다면 더 불편한 언어처럼 느껴질 수도 있습니다.
하지만 C는 프로그램이 실행 파일로 바뀌고, 메모리와 가까운 규칙을 드러내며, 하드웨어와 운영체제 사이의 연결을 보이기 쉬운 언어입니다. 그래서 이번 글에서는 문법 암기보다 C가 시스템의 입구가 되는 이유와 컴파일-링크-실행 흐름을 중심으로 정리합니다.
- 왜 C가 시스템 공부의 좋은 입구가 되는지
- 소스 코드, 목적 파일, 실행 파일이 각각 무엇인지
- 컴파일-링크-로딩-실행 흐름을 한 장면으로 이해하기
- 아주 작은 C 예제로 변수, 함수 호출, 반환값이 어떤 의미를 가지는지
- 인터프리터 언어 감각과 C 감각이 어디서 달라지는지
1. C가 입구가 되는 이유는 문법이 쉬워서가 아니다
C는 초보자에게 반드시 쉽다고 말하기 어려운 언어입니다. 포인터나 메모리 관리처럼 실수하기 쉬운 요소도 많습니다. 그럼에도 시스템 공부의 입구로 자주 선택되는 이유는 프로그램이 어떻게 번역되고 실행되는지, 그리고 어떤 책임이 프로그래머 쪽에 남는지를 잘 드러내기 때문입니다.
즉 C의 장점은 친절함보다 투명성에 가깝습니다. 메모리, 값의 표현, 함수 호출, 라이브러리 연결 같은 시스템 주제가 코드에 더 직접적으로 드러납니다.
| 질문 | C가 보여주는 것 | 학습상 이점 |
|---|---|---|
| 코드는 어떻게 실행 파일이 되나 | 컴파일과 링크 단계가 분명히 드러남 | 실행 구조를 눈으로 따라가기 쉽다 |
| 메모리는 누가 관리하나 | 프로그래머 책임이 비교적 크게 남음 | 메모리 모델을 빨리 체감한다 |
| 함수 호출은 무엇을 남기나 | 스택과 반환값 개념이 잘 드러남 | 이후 어셈블리와 운영체제로 이어지기 좋다 |
2. 소스 파일은 곧바로 실행되는 것이 아니라 여러 단계를 거친다
C 파일을 작성했다고 해서 곧바로 CPU가 그 텍스트를 읽는 것은 아닙니다. 사람을 위한 소스 코드는 먼저 번역되고, 필요한 라이브러리와 연결되고, 운영체제가 올릴 수 있는 실행 파일 형태가 되어야 합니다.
이 흐름을 처음부터 실행 장면으로 이해해 두면, 이후에 object file, header, library 같은 단어가 나와도 단순한 파일 종류 암기가 아니라 역할로 읽히게 됩니다.
3. 아주 작은 C 예제도 시스템 관점으로 읽을 수 있다
문법 공부만 하다 보면 예제가 너무 평범해 보여서 그냥 지나치기 쉽습니다. 하지만 작은 예제에서도 입력, 계산, 함수 호출, 반환값, 출력이라는 실행 구조가 이미 들어 있습니다.
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main(void) {
int result = add(3, 4);
printf("%d\n", result);
return 0;
}4. 소스, 목적 파일, 실행 파일은 역할이 다르다
초반에는 이 셋이 모두 '프로그램 관련 파일'로만 보여서 차이가 흐려지기 쉽습니다. 하지만 어느 단계에서 어떤 책임을 지는지 구분하면 빌드 과정이 훨씬 선명해집니다.
| 형태 | 누가 주로 읽는가 | 핵심 역할 |
|---|---|---|
| 소스 코드 | 사람과 컴파일러 | 의도를 표현하는 원본 |
| 목적 파일 | 링커 | 번역된 조각을 담는 중간 결과 |
| 실행 파일 | 운영체제와 CPU | 실제로 적재·실행되는 최종 결과 |
5. 왜 인터프리터 언어 감각과 C 감각이 다르게 느껴질까
Python처럼 바로 실행해 보던 경험에 익숙하면, 빌드와 링크는 불필요하게 번거롭게 느껴질 수 있습니다. 하지만 그 과정이 존재한다는 사실 자체가 시스템 공부에는 큰 힌트입니다.
C는 실행 전에 무엇이 준비돼야 하는지 더 노골적으로 보여 줍니다. 그래서 메모리, 라이브러리, 바이너리, 호출 규약 같은 단어들이 자연스럽게 등장하고, 이것이 바로 이후 장의 토대가 됩니다.
| 질문 | 바로 실행형 감각 | C에서 더 잘 드러나는 것 |
|---|---|---|
| 실행 전 준비 | 보이지 않는 경우가 많다 | 빌드 산출물과 링크 관계 |
| 메모리 책임 | 런타임이 많이 감춘다 | 값과 저장 위치의 책임이 더 드러난다 |
| 성능/번역 구조 | 추상화가 강하다 | 실행 구조가 더 가까이 보인다 |
6. 자주 생기는 혼동을 미리 정리하자
초반에 빌드 과정을 대충 넘기면 나중에 헤더 파일, 라이브러리, 디버깅 도구 이야기가 나올 때 모두 따로 외워야 합니다. 지금 헷갈리는 지점을 미리 정리해 두는 편이 훨씬 효율적입니다.
| 헷갈리는 생각 | 더 정확한 이해 |
|---|---|
| 컴파일만 끝나면 바로 실행된다 | 링크까지 거쳐야 최종 실행 파일이 된다 |
| 실행 파일은 소스 코드의 복사본이다 | 실행 파일은 번역과 연결을 거친 결과물이다 |
| C는 그냥 오래된 언어라 시스템 책에 나온다 | 실행 구조와 메모리 책임이 잘 드러나서 시스템 입구로 자주 쓰인다 |
7. 직접 해볼 문제: 이 예제를 시스템 질문으로 바꿔 보자
문법 자체보다 실행 구조를 읽는 연습을 위한 문제입니다.
이번 글에서 기억할 것
스스로 점검
다음 글 예고
다음 글에서는 포인터를 어려운 문법 조각이 아니라 메모리 주소를 값처럼 다루는 방식으로 보면서, 스코프와 수명까지 함께 정리합니다.
'학습 자료 글 > 컴퓨터시스템' 카테고리의 다른 글
| 컴퓨터시스템 기초 6. 바이트 순서는 왜 값을 다르게 보이게 만들까 (0) | 2026.03.31 |
|---|---|
| 컴퓨터시스템 기초 5. 데이터는 왜 결국 비트로 표현될까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 4. 디버거는 실행을 보는 창이다 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 3. 포인터와 메모리를 같이 이해해야 하는 이유 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 1. 프로그램은 어디에서 실행될까 (0) | 2026.03.31 |