소스 코드를 실행 가능한 기계어로 변환하는 방식은 크게 컴파일, 인터프리트, JIT 세 가지로 나뉩니다. 각 방식은 실행 속도와 유연성에서 서로 다른 트레이드오프를 가집니다.
| 유형 | 언어 | 메모리 관리 | 특징 |
|---|---|---|---|
| 컴파일 | C, C++, Go, Rust | 수동 / GC / Ownership | 빠른 실행, 시스템 프로그래밍 |
| 인터프리트 | Python, JS, Ruby | GC (자동) | 빠른 개발, 동적 타입 |
| JIT | Java, C#, Kotlin | GC (JVM/.NET) | 포터블 바이트코드, 크로스 플랫폼 |
시스템 콜은 사용자 프로세스가 운영체제 커널의 서비스를 요청하는 인터페이스입니다. 하드웨어 보호를 위해 특권 모드 전환(trap)을 수반합니다.
| syscall | 번호 (Linux x86_64) | 분류 | 간단 설명 |
|---|
독립된 프로세스끼리 데이터를 주고받는 메커니즘입니다. 각 방식은 속도, 방향성, 범위에서 서로 다른 특성을 가집니다.
GC는 더 이상 사용되지 않는 메모리를 자동으로 회수하는 기법입니다. 참조 카운팅, Mark & Sweep, 세대별 GC 등 다양한 알고리즘이 존재합니다.
void leak() {
char *p = malloc(1024);
// ... 사용 ...
// free(p) 누락!
return; // 1024 bytes 누수
}
// 반복 호출 → 메모리 고갈
fn no_leak() {
let v = Vec::new(); // 힙 할당
// ... 사용 ...
// 스코프 종료 → Drop 자동 호출
} // ← 여기서 자동 해제!
// 컴파일러가 보장 → 런타임 0 비용