C.W.K.
Stream
Lesson 01 of 06 · published

Rust 는 왜 존재하나

~12 min · foundations, memory-safety, why-rust, mindset

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"컴파일러는 너를 막는 게 아니야. 아직 네가 못 보는 그 버그를 출시 못 하게 거부하는 거야."

나쁜 선택지 두 개

수십 년 동안, 시스템 언어를 고른다는 건 어떤 고통을 감수할지 고르는 거였어.

선택지 A — C 와 C++. 미친 속도, 완전한 제어, 메탈에 직접 말 걸기. 함정: 언어가 너를 완전히 믿어버려. 포인터를 두 번 해제하든, 해제한 메모리를 읽든, 두 스레드가 같은 값을 동시에 건드리든 — 컴파일러는 아무 말도 안 해. 버그는 그대로 출시돼. 그리고 6개월 뒤 어느 화요일, 고객 손에서 터져.

선택지 B — 가비지 컬렉션 언어 (Python, Java, Go, JavaScript). 안전하고 편해: 런타임 컬렉터가 메모리를 대신 치워주니까 use-after-free 가 안 일어나. 함정: 런타임에 비용을 내. 예측 못 하는 GC 멈춤, 메모리 오버헤드, 그리고 너와 기계 사이에 낀 한 겹. 게임 엔진, OS 커널, 실시간 오디오 경로에선 그 멈춤이 용납 안 돼.

제3의 길

Rust 는 그 거래를 거부해. C 급 속도 메모리 안전을 동시에 줘. 안전 검사를 컴파일 타임으로 옮겨서. 컴파일러가 모든 메모리 조각을 누가 소유 하는지, 그 참조가 얼마나 오래 사는지를 추적해. 네 코드가 메모리를 안전하지 않게 쓸 가능성이 조금이라도 있으면 컴파일이 안 돼 — 위험이 실행 전에 이미 불가능하다고 증명됐으니 런타임에 치울 것도 없어.

가비지 컬렉터 없음. 런타임 세금 없음. 비용은 새 자리로 옮겨갔어: 규칙을 배우는 동안, 컴파일 타임에, 너한테로. 그게 Rust 가 진짜로 하는 거래야 — 가파른 학습곡선을 내주고 훨씬 평평한 디버깅곡선을 받는 거.

Rust 는 가파른 학습곡선을 주고 평평한 디버깅곡선을 받아. 디버거에서 segfault 쫓느라 쓸 시간을, 대신 앞단에서 컴파일러랑 말다툼하는 데 써 — 그리고 그 말다툼은 프로덕션이 아니라 지금 딱 한 번 일어나.

"Fearless" 가 무슨 뜻이냐면

Rust 하는 사람들은 "fearless concurrency", "fearless refactoring" 을 입에 달고 살아. 마케팅이 아니야. 컴파일러가 데이터 레이스 없음, dangling 참조 없음을 보장해주면, 모듈을 통째로 뜯어서 다시 지어도 — 컴파일만 되면 버그 한 부류가 그냥 사라져. 네 코드를 네가 무서워하지 않게 돼.

피파의 고백

Rust 첫 주에 난 borrow checker 가 싫었어. 누가 봐도 멀쩡한 코드를 쓰는데 — 멀쩡한 게 보이는데 — 컴파일러가 거부하더라. 아빠한테 Rust 가 "적대적" 이라고 투덜댔어. 아빠는 그냥 이러더라: "적대적인 게 아니야. 네가 아직 모르는 걸 걔가 알고 있는 거야." 맞았어. 프로젝트 세 개 지나니까 에러가 벽이 아니라 어깨너머로 코드 읽어주는 시니어 엔지니어처럼 느껴졌어. 안 그랬으면 새벽 2시에 디버깅했을 그걸 미리 잡아주는.

Code

Rust 가 못 쓰게 막는 버그·rust
fn main() {
    let data = vec![1, 2, 3];
    let first = &data[0]; // data 안으로 참조를 빌림

    // C++ 에선 이런 게 컴파일되고 나중에 터져.
    // Rust 에선, 아래 줄이 `first` 를 아직 쓰는 동안 그걸
    // 무효화하기 때문에 컴파일 에러야:
    //
    //   data.push(4);
    //   error[E0502]: `data` 가 불변으로도 빌려져 있어서
    //                 가변으로 빌릴 수 없음

    println!("first element is {first}");
} // `data` 는 여기서 자동으로, 정확히 한 번 해제돼

External links

Exercise

마지막으로 진짜 시간 잡아먹은 버그 하나 떠올려봐 — 크래시든, 행이든, 재현 안 되는 heisenbug 든. 분류해봐: 메모리 안전 버그였나 (use-after-free, double-free, 버퍼 오버런), 데이터 레이스였나, 아니면 로직 버그였나? 그러고 나서 물어봐: 소유권을 추적하는 컴파일러였다면 그게 실행되기도 전에 잡았을까?
Hint
메모리랑 동시성 버그가 바로 Rust 가 컴파일 타임에 없애는 거야. 로직 버그는 못 잡아 — 그건 어느 언어든 네 몫이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.