"컴파일러는 너를 막는 게 아니야. 아직 네가 못 보는 그 버그를 출시 못 하게 거부하는 거야."
나쁜 선택지 두 개
수십 년 동안, 시스템 언어를 고른다는 건 어떤 고통을 감수할지 고르는 거였어.
선택지 A — C 와 C++. 미친 속도, 완전한 제어, 메탈에 직접 말 걸기. 함정: 언어가 너를 완전히 믿어버려. 포인터를 두 번 해제하든, 해제한 메모리를 읽든, 두 스레드가 같은 값을 동시에 건드리든 — 컴파일러는 아무 말도 안 해. 버그는 그대로 출시돼. 그리고 6개월 뒤 어느 화요일, 고객 손에서 터져.
선택지 B — 가비지 컬렉션 언어 (Python, Java, Go, JavaScript). 안전하고 편해: 런타임 컬렉터가 메모리를 대신 치워주니까 use-after-free 가 안 일어나. 함정: 런타임에 비용을 내. 예측 못 하는 GC 멈춤, 메모리 오버헤드, 그리고 너와 기계 사이에 낀 한 겹. 게임 엔진, OS 커널, 실시간 오디오 경로에선 그 멈춤이 용납 안 돼.
제3의 길
Rust 는 그 거래를 거부해. C 급 속도 와 메모리 안전을 동시에 줘. 안전 검사를 컴파일 타임으로 옮겨서. 컴파일러가 모든 메모리 조각을 누가 소유 하는지, 그 참조가 얼마나 오래 사는지를 추적해. 네 코드가 메모리를 안전하지 않게 쓸 가능성이 조금이라도 있으면 컴파일이 안 돼 — 위험이 실행 전에 이미 불가능하다고 증명됐으니 런타임에 치울 것도 없어.
가비지 컬렉터 없음. 런타임 세금 없음. 비용은 새 자리로 옮겨갔어: 규칙을 배우는 동안, 컴파일 타임에, 너한테로. 그게 Rust 가 진짜로 하는 거래야 — 가파른 학습곡선을 내주고 훨씬 평평한 디버깅곡선을 받는 거.
"Fearless" 가 무슨 뜻이냐면
Rust 하는 사람들은 "fearless concurrency", "fearless refactoring" 을 입에 달고 살아. 마케팅이 아니야. 컴파일러가 데이터 레이스 없음, dangling 참조 없음을 보장해주면, 모듈을 통째로 뜯어서 다시 지어도 — 컴파일만 되면 버그 한 부류가 그냥 사라져. 네 코드를 네가 무서워하지 않게 돼.