C — UNIX와 짝을 이룬 시스템 프로그래밍의 기준 (1972, Dennis Ritchie)
C — UNIX와 짝을 이룬 시스템 프로그래밍의 기준
1. 요약
C는 1972~73년 Bell Labs에서 Dennis Ritchie가 개발한 구조적·명령형·시스템 프로그래밍 언어이다. UNIX 커널을 고수준 언어로 다시 작성하기 위해 만들어졌고, 1973년 Version 4 UNIX부터 커널 대부분이 C로 재구현되었다. 최소한의 런타임 + 기계 명령에 효율적으로 매핑되는 추상이라는 설계 원칙이 50년 이상 지속되어, 오늘날까지 운영체제·컴파일러·임베디드 시스템의 사실상 표준 언어로 사용되고 있다.
2. 등장 배경
- B 언어와 BCPL: Ken Thompson이 BCPL을 단순화하여 만든 B가 C의 직접 조상. PDP-11이라는 새 하드웨어에서 시스템 프로그래밍이 필요했지만 B는 타입이 없어서 한계가 명확했다.
- UNIX 이식 문제: PDP-7에서 어셈블리로 작성된 UNIX는 다른 기종으로 옮길 수 없었다. Ritchie는 "어셈블리만큼 빠르면서, 다른 기종에서도 컴파일 가능한 언어"를 목표로 삼았다.
- 1972~73년: Ritchie의 C 첫 구현. 1973년 11월 Version 4 UNIX의 커널이 C로 광범위하게 재작성된다 — "the Unix kernel was extensively re-implemented in C".
3. 핵심 특징
- 구조적 제어 흐름 —
if,for,do/while,switch등 Pascal·ALGOL 계열의 구조적 제어를 모두 도입.goto는 남겨두었으나 사용을 권장하지 않음. - 포인터(Pointers) — 메모리 주소를 1급 시민으로 다룸. 시스템 프로그래밍의 본질을 언어 차원에서 노출. 이것이 C의 양날 — 강력함과 위험의 동시 원천.
- 이식성(Portability) — "compiled for a wide variety of computer platforms and operating systems with few changes to its source code". UNIX가 여러 기종으로 퍼진 결정적 동력.
- 최소 런타임(Minimal Runtime) — 가비지 컬렉션·예외 처리 같은 무거운 추상이 없다. 기계 명령에 직접 매핑됨.
- 표준 라이브러리 —
stdio.h,string.h,math.h등 풍부한 함수 라이브러리. 언어는 작게, 기능은 라이브러리로.
4. 주 용도
- 운영체제 커널: UNIX, Linux, Windows 일부, macOS 핵심 — 모두 C 기반.
- 임베디드 시스템·디바이스 드라이버: 메모리·하드웨어 직접 제어가 필요한 모든 영역.
- 컴파일러·인터프리터: GCC, Clang, CPython, Lua 등 대부분의 언어 처리계가 C로 구현.
- 시스템 라이브러리: glibc, OpenSSL, SQLite 등 인프라 소프트웨어의 기반.
5. 그 시대 설계 도구 매핑
C가 본격 산업 적용된 1970년대 후반~80년대는 구조적 분석·설계의 황금기였다.
| 도구 | 역할 | C와의 관계 |
|---|---|---|
| Yourdon-DeMarco DFD (Data Flow Diagram) (1978~79) | 데이터 흐름 중심의 시스템 분해 | C 함수 호출 그래프와 직접 매핑 |
| Yourdon-Constantine 구조도 | 모듈 분해, 결합도(Coupling)·응집도(Cohesion) | C .h/.c 파일 분리, 함수 간 결합 분석에 그대로 사용 |
| JSP (Jackson Structured Programming) (Michael Jackson, 1975) | 데이터 구조→프로그램 구조 도출 | 입력·출력 파일 구조를 C 함수 구조로 변환 |
| HIPO (Hierarchy + Input-Process-Output) 차트 (IBM, 1970년대) | 계층적 함수 분해 + I/O 명세 | 함수 단위 명세서로 C 코드 작성 전 단계에서 사용 |
| K&R 표준 코딩 스타일 (1978) | 들여쓰기·네이밍·헤더 파일 구조 | 코드 자체가 설계 문서가 됨 |
→ C의 최소주의 언어 설계는 풍부한 외부 설계 도구와 짝을 이루어 작동했다. 언어는 작지만, 그 위에 Yourdon·DeMarco·Jackson의 설계 방법론이 얹혀서 산업적 규모의 시스템이 만들어졌다.
6. 강의 활용
핵심 명제와의 연결: 언어는 어셈블리에서 C로 옮겨갔지만, 설계 사상(구조적 분해, 모듈 분리, 데이터 흐름 분석)은 오히려 더 정교화되었다. C가 산업 표준이 된 것은 언어가 좋아서가 아니라 언어와 짝을 이룬 설계 방법론(Yourdon DFD, JSP, K&R 스타일)이 함께 성숙했기 때문이다.
강의에서의 위치: G3의 산업적 대표 사례. Pascal이 교육의 대표라면 C는 산업 현장의 대표. "Pascal과 C가 같은 시대에 같은 사상(구조적 분해)을 공유하면서, 한쪽은 학교로·한쪽은 산업으로 갈라졌다"는 흐름.
오늘날의 흔적: 50년이 넘었지만 C는 여전히 Linux 커널·임베디드·시스템 라이브러리의 기준 언어이다. 그리고 K&R 책의 최소 언어 + 풍부한 설계라는 사상은 오늘날 minimal API + abundant patterns라는 형태로 모든 현대 언어 설계에 살아있다.
오늘 LLM 시대로의 다리: AI Agent에게 C 코드를 작성시키는 것은 쉽다. 그러나 C 코드를 안전하게 작성시키려면 — 메모리 누수, 버퍼 오버플로우, undefined behavior — Yourdon DFD나 K&R 스타일과 동등한 명세가 필요하다. 즉 Spec-driven Development는 새로운 것이 아니라 Yourdon·Jackson 시대의 정신이 LLM 시대로 옮겨온 것이다.
출처
- Wikipedia, "C (programming language)", https://en.wikipedia.org/wiki/C_(programming_language)
- Kernighan, B. W., & Ritchie, D. M. (1978). The C Programming Language. Prentice Hall.
- Ritchie, D. M. (1993). "The Development of the C Language". History of Programming Languages II (HOPL-II), ACM.
그룹 시리즈
→ synthesis/group-g3 (시대 그룹 종합 카드)