컴파일러 vs 인터프리터 vs JIT: 차이점 설명
소스 코드를 실행하는 주요 방법은 세 가지입니다. 컴파일러(AOT, 사전 컴파일)는 실행 전에 프로그램 전체를 기계어 코드로 변환합니다. 인터프리터는 별도의 기계어 파일을 만들지 않고 프로그램을 실행하면서 읽고 수행합니다. JIT(just-in-time) 컴파일러는 처음에는 인터프리트하다가 프로그램이 실행되는 동안 자주 쓰이는 부분을 기계어 코드로 컴파일합니다. 많은 언어가 이 방식들을 혼합합니다.
| 비교 항목 | 컴파일러(AOT) | 인터프리터 | JIT 컴파일러 |
|---|---|---|---|
| 코드 변환 시점 | 실행 전: 프로그램 전체가 기계어 코드가 됨 | 실행 중: 프로그램을 한 단계씩 읽고 실행 | 실행 중: 자주 쓰이는 코드를 기계어 코드로 컴파일 |
| 시작 | 빠르게 시작(단, 먼저 빌드 단계 필요) | 빌드 단계 없이 빠르게 시작 | 처음에는 느리며 코드가 워밍업될 때까지 지속 |
| 실행 속도 | 가장 빠르고 가장 예측 가능 | 가장 느리며 컴파일된 코드보다 몇 배나 느린 경우가 많음 | 워밍업 후에는 컴파일 속도에 근접하며, 실행 시점 정보를 활용해 더 빠를 때도 있음 |
| 이식성 | 플랫폼마다 바이너리 필요 | 이식 가능: 인터프리터가 있는 곳 어디서나 실행 | 이식 가능한 바이트코드와 플랫폼별 런타임 |
| 오류 검출 | 많은 오류를 컴파일 시점에 잡음 | 문제의 줄이 실행될 때 오류가 나타남 | 언어에 따라 다름 |
| 메모리 사용 | 실행 시점 오버헤드가 낮음 | 인터프리터 자체가 메모리에 상주 | 컴파일러와 컴파일된 코드 캐시를 위한 추가 메모리 |
| 개발 사이클 | 편집, 빌드, 실행 | 편집 후 즉시 실행 | 보통 편집 후 실행, 또는 바이트코드로 빌드 |
| 예시 언어 | C, C++, Rust, Go | 기본 Python(CPython), Ruby, 셸 스크립트 | Java(HotSpot), JavaScript(V8), C#(.NET), PyPy |
수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.