학습 자료 글/컴퓨터시스템

컴퓨터시스템 기초 2. C는 왜 시스템의 입구가 되는가

cedis 2026. 3. 31. 16:20

[컴퓨터 시스템] 2. C는 왜 시스템의 입구가 되는가

시스템 공부를 시작할 때 왜 하필 C부터 보느냐는 질문이 자주 나옵니다. 이미 Python이나 JavaScript에 익숙하다면 더 불편한 언어처럼 느껴질 수도 있습니다.

하지만 C는 프로그램이 실행 파일로 바뀌고, 메모리와 가까운 규칙을 드러내며, 하드웨어와 운영체제 사이의 연결을 보이기 쉬운 언어입니다. 그래서 이번 글에서는 문법 암기보다 C가 시스템의 입구가 되는 이유와 컴파일-링크-실행 흐름을 중심으로 정리합니다.

먼저 짚고 갈 용어
compiler: 소스 코드를 기계가 다루기 쉬운 형태로 바꾸는 도구
linker: 여러 번역 결과와 라이브러리를 이어 최종 실행 파일로 묶는 단계
executable: 실제로 실행 가능한 파일
이번 글에서 다루는 것
  • 왜 C가 시스템 공부의 좋은 입구가 되는지
  • 소스 코드, 목적 파일, 실행 파일이 각각 무엇인지
  • 컴파일-링크-로딩-실행 흐름을 한 장면으로 이해하기
  • 아주 작은 C 예제로 변수, 함수 호출, 반환값이 어떤 의미를 가지는지
  • 인터프리터 언어 감각과 C 감각이 어디서 달라지는지
한눈에 보는 흐름
1
왜 C가 시스템 공부의 좋은 입구가 되는지
2
소스 코드, 목적 파일, 실행 파일이 각각 무엇인지
3
컴파일-링크-로딩-실행 흐름을 한 장면으로 이해하기
4
아주 작은 C 예제로 변수, 함수 호출, 반환값이 어떤 의미를 가지는지

1. C가 입구가 되는 이유는 문법이 쉬워서가 아니다

C는 초보자에게 반드시 쉽다고 말하기 어려운 언어입니다. 포인터나 메모리 관리처럼 실수하기 쉬운 요소도 많습니다. 그럼에도 시스템 공부의 입구로 자주 선택되는 이유는 프로그램이 어떻게 번역되고 실행되는지, 그리고 어떤 책임이 프로그래머 쪽에 남는지를 잘 드러내기 때문입니다.

그림으로 먼저 보기
코드는 어떻게 실행 파일이 되나
C가 보여주는 것: 컴파일과 링크 단계가 분명히 드러남
학습상 이점: 실행 구조를 눈으로 따라가기 쉽다
메모리는 누가 관리하나
C가 보여주는 것: 프로그래머 책임이 비교적 크게 남음
학습상 이점: 메모리 모델을 빨리 체감한다
함수 호출은 무엇을 남기나
C가 보여주는 것: 스택과 반환값 개념이 잘 드러남
학습상 이점: 이후 어셈블리와 운영체제로 이어지기 좋다

즉 C의 장점은 친절함보다 투명성에 가깝습니다. 메모리, 값의 표현, 함수 호출, 라이브러리 연결 같은 시스템 주제가 코드에 더 직접적으로 드러납니다.

질문C가 보여주는 것학습상 이점
코드는 어떻게 실행 파일이 되나컴파일과 링크 단계가 분명히 드러남실행 구조를 눈으로 따라가기 쉽다
메모리는 누가 관리하나프로그래머 책임이 비교적 크게 남음메모리 모델을 빨리 체감한다
함수 호출은 무엇을 남기나스택과 반환값 개념이 잘 드러남이후 어셈블리와 운영체제로 이어지기 좋다

2. 소스 파일은 곧바로 실행되는 것이 아니라 여러 단계를 거친다

C 파일을 작성했다고 해서 곧바로 CPU가 그 텍스트를 읽는 것은 아닙니다. 사람을 위한 소스 코드는 먼저 번역되고, 필요한 라이브러리와 연결되고, 운영체제가 올릴 수 있는 실행 파일 형태가 되어야 합니다.

이 흐름을 처음부터 실행 장면으로 이해해 두면, 이후에 object file, header, library 같은 단어가 나와도 단순한 파일 종류 암기가 아니라 역할로 읽히게 됩니다.

과정 그림
1
소스 코드(.c)를 작성한다.
2
컴파일러가 소스 코드를 번역해 목적 파일(object file) 같은 중간 결과를 만든다.
3
링커가 여러 목적 파일과 필요한 라이브러리를 묶어 실행 파일을 만든다.
4
운영체제가 실행 파일을 메모리에 올리고, 프로그램은 프로세스로 실행된다.
여기서 중요한 감각
실행 파일은 텍스트 소스의 다른 저장 형태가 아니라, 운영체제와 CPU가 다룰 수 있는 형태로 정리된 결과물입니다.

3. 아주 작은 C 예제도 시스템 관점으로 읽을 수 있다

문법 공부만 하다 보면 예제가 너무 평범해 보여서 그냥 지나치기 쉽습니다. 하지만 작은 예제에서도 입력, 계산, 함수 호출, 반환값, 출력이라는 실행 구조가 이미 들어 있습니다.

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;
}
이 코드에서 볼 수 있는 시스템 질문
함수 add는 호출될 때 인자를 어디에 두는가, result는 어디에 저장되는가, printf는 왜 라이브러리 연결이 필요한가, return 0은 운영체제에 무엇을 돌려주는가를 차례로 묻게 만듭니다.

4. 소스, 목적 파일, 실행 파일은 역할이 다르다

초반에는 이 셋이 모두 '프로그램 관련 파일'로만 보여서 차이가 흐려지기 쉽습니다. 하지만 어느 단계에서 어떤 책임을 지는지 구분하면 빌드 과정이 훨씬 선명해집니다.

그림으로 먼저 보기
소스 코드
누가 주로 읽는가: 사람과 컴파일러
핵심 역할: 의도를 표현하는 원본
목적 파일
누가 주로 읽는가: 링커
핵심 역할: 번역된 조각을 담는 중간 결과
실행 파일
누가 주로 읽는가: 운영체제와 CPU
핵심 역할: 실제로 적재·실행되는 최종 결과
형태누가 주로 읽는가핵심 역할
소스 코드사람과 컴파일러의도를 표현하는 원본
목적 파일링커번역된 조각을 담는 중간 결과
실행 파일운영체제와 CPU실제로 적재·실행되는 최종 결과

5. 왜 인터프리터 언어 감각과 C 감각이 다르게 느껴질까

Python처럼 바로 실행해 보던 경험에 익숙하면, 빌드와 링크는 불필요하게 번거롭게 느껴질 수 있습니다. 하지만 그 과정이 존재한다는 사실 자체가 시스템 공부에는 큰 힌트입니다.

그림으로 먼저 보기
실행 전 준비
바로 실행형 감각: 보이지 않는 경우가 많다
C에서 더 잘 드러나는 것: 빌드 산출물과 링크 관계
메모리 책임
바로 실행형 감각: 런타임이 많이 감춘다
C에서 더 잘 드러나는 것: 값과 저장 위치의 책임이 더 드러난다
성능/번역 구조
바로 실행형 감각: 추상화가 강하다
C에서 더 잘 드러나는 것: 실행 구조가 더 가까이 보인다

C는 실행 전에 무엇이 준비돼야 하는지 더 노골적으로 보여 줍니다. 그래서 메모리, 라이브러리, 바이너리, 호출 규약 같은 단어들이 자연스럽게 등장하고, 이것이 바로 이후 장의 토대가 됩니다.

질문바로 실행형 감각C에서 더 잘 드러나는 것
실행 전 준비보이지 않는 경우가 많다빌드 산출물과 링크 관계
메모리 책임런타임이 많이 감춘다값과 저장 위치의 책임이 더 드러난다
성능/번역 구조추상화가 강하다실행 구조가 더 가까이 보인다

6. 자주 생기는 혼동을 미리 정리하자

초반에 빌드 과정을 대충 넘기면 나중에 헤더 파일, 라이브러리, 디버깅 도구 이야기가 나올 때 모두 따로 외워야 합니다. 지금 헷갈리는 지점을 미리 정리해 두는 편이 훨씬 효율적입니다.

헷갈리는 생각더 정확한 이해
컴파일만 끝나면 바로 실행된다링크까지 거쳐야 최종 실행 파일이 된다
실행 파일은 소스 코드의 복사본이다실행 파일은 번역과 연결을 거친 결과물이다
C는 그냥 오래된 언어라 시스템 책에 나온다실행 구조와 메모리 책임이 잘 드러나서 시스템 입구로 자주 쓰인다

7. 직접 해볼 문제: 이 예제를 시스템 질문으로 바꿔 보자

문법 자체보다 실행 구조를 읽는 연습을 위한 문제입니다.

미니 문제
`int x = add(3, 4);` 같은 한 줄을 보고, 컴파일 단계, 함수 호출, 반환값 저장이라는 세 가지 시스템 질문으로 다시 적어 보세요.

이번 글에서 기억할 것

C는 문법이 쉬워서가 아니라 실행 구조와 메모리 책임을 잘 드러내기 때문에 시스템 입구가 된다.
소스 코드, 목적 파일, 실행 파일은 각각 읽는 주체와 역할이 다르다.
컴파일-링크-로딩-실행 흐름을 잡아두면 이후 어셈블리, 디버깅, 운영체제 주제가 더 잘 연결된다.

스스로 점검

왜 C가 시스템 공부의 좋은 입구가 되는지 문법 난이도와 별개로 설명할 수 있는가
소스 코드와 실행 파일 사이에 컴파일과 링크가 왜 필요한지 말할 수 있는가
작은 C 예제에서 함수 호출, 라이브러리 호출, 반환값을 시스템 질문으로 다시 읽을 수 있는가

다음 글 예고

다음 글에서는 포인터를 어려운 문법 조각이 아니라 메모리 주소를 값처럼 다루는 방식으로 보면서, 스코프와 수명까지 함께 정리합니다.

한 줄 정리
C는 시스템 공부를 어렵게 만들기보다는, 실행 파일과 메모리 책임이 어떻게 생기는지 더 투명하게 보여 주는 입구에 가깝습니다.