#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
hello 프로그램은 프로그래머가 에디터로 작성한 소스 프로그램(또는 소스파일)으로 생명을 시작하며, hello.c라는 텍스트 파일로 저장됨.
0 또는 1로 표시되는 비트들의 연속이며, 바이트(8bit = 1byte) 단위로 구성됨.#include <stdio.h>에서 첫 번째 바이트 35는 # 문자에 대응, 두 번째 바이트 105는 i 문자에 대응됨.\n) 등이 포함되어 있음.hello.c와 같이 아스키 문자로 이루어진 파일 → 텍스트 파일👉 컨텍스트(Context) 를 통해 구분함!
바이트들의 의미를 결정하는 환경
1234의 다양한 해석| 컨텍스트 | 해석 방식 | 결과 |
|---|---|---|
| 정수(int) | 그냥 숫자로 보기 | 1234 |
| 문자열(str) | 문자로 보기 | "1234" |
| 16진수(hex) | 다른 진법으로 보기 | 0x4D2 |
| 네트워크 데이터 | 전송 데이터로 보기 | 다르게 저장됨 |
| 메모리 명령어 | CPU가 실행할 코드로 보기 | 특정 연산 수행 |
메모리에 저장된 바이트를 다르게 해석할 수 있음.
01000001 (A) 01000010 (B) 01000011 (C) 01000100 (D)
| 컨텍스트 | 해석 결과 |
|---|---|
| 문자(char) | "ABCD" |
| 정수(int) | 1094861636 |
| 명령어(CPU instruction) | 특정 연산 수행 |
hello 프로그램은 인간이 이해할 수 있는 고급언어로 작성됨.
👉 따라서 컴퓨터가 이해할 수 있는 "기계어(0과 1)"로 번역해야 함
CPU(중앙처리장치)가 수행하는 명령어
➡ 이 명령어들이 모여 CPU가 수행할 작업을 결정!
➡ 실행가능 목적 프로그램 형태로 합쳐져서 바이너리 디스크 파일로 저장됨!
linux> gcc -o hello hello.c
📌 gcc 컴파일러 드라이버는 소스파일 hello.c를 실행파일 hello로 변환하며, 4단계를 거쳐 실행됨.

cpp#include 같은 디렉티브를 처리하여 코드 변형.cc1main:
subq $8, %rsp
movl $.LCO, %edi
call puts
movl $0, %eax
addq $8, %rsp
ret
asldprintf.o + hello.o)| 단계 | 역할 | 결과물 |
|---|---|---|
전처리 (cpp) | #include 처리, 코드 변형 | hello.i |
컴파일 (cc1) | C 코드 → 어셈블리어 변환 | hello.s |
어셈블 (as) | 어셈블리어 → 기계어 변환 | hello.o |
링크 (ld) | 목적파일 + 라이브러리 연결 | hello (실행파일) |
🚀 즉, gcc hello.c는 위 과정을 거쳐 "소스 코드 → 실행 파일"로 변환하는 과정임!