AOT(Ahead-of-Time) 와 JIT(Just-in-Time) 컴파일러는 소스 코드를 기계 코드로 변환하는 방식이 다른 두 가지 주요 컴파일 전략이다. 각각의 장단점을 이해하는 것은 애플리케이션 성능을 최적화하는 데 중요하다.
AOT 컴파일러는 애플리케이션 실행 전에 소스 코드 전체를 기계 코드로 미리 컴파일한다.
| 특성 | 설명 |
|---|---|
| 컴파일 시점 | 배포 전 (빌드 타임) |
| 실행 속도 | 빠름 (컴파일된 코드 직접 실행) |
| 시작 시간 | 빠름 |
| 메모리 사용 | 낮음 |
| 파일 크기 | 증가 |
C/C++ → 컴파일러 → 기계 코드 (exe, o 파일) → 실행
JIT 컴파일러는 애플리케이션 실행 중에 자주 사용되는 코드를 동적으로 기계 코드로 컴파일한다.
| 특성 | 설명 |
|---|---|
| 컴파일 시점 | 런타임 (실행 중) |
| 실행 속도 | 중간 (워밍업 필요) |
| 시작 시간 | 느림 |
| 메모리 사용 | 높음 |
| 파일 크기 | 작음 |
Java 소스 → 자바 컴파일러 → 바이트코드 →
JIT 컴파일러 (런타임) → 기계 코드 → 실행
AOT: 빌드 타임 빠른 런타임
JIT: 빠른 시작 워밍업 → 빠른 런타임
| 상황 | 추천 |
|---|---|
| 모바일 앱 | AOT |
| 클라우드 서버 | JIT |
| 마이크로서비스 | AOT |
| 웹 브라우저 | JIT |
| 엣지 디바이스 | AOT |
| 개발 생산성 중시 | JIT |
Flutter는 개발 생산성과 배포 성능을 모두 고려하여 AOT와 JIT 컴파일러를 상황에 따라 사용한다.
Flutter 개발 중에는 JIT 컴파일러를 활용하여 빠른 피드백을 제공한다.
Dart 소스 코드 변경 → JIT 컴파일러 → 런타임에 코드 업데이트 → 앱 상태 유지
Flutter 애플리케이션을 배포할 때는 AOT 컴파일러를 사용하여 최적화된 네이티브 코드를 생성한다.
| 항목 | AOT | JIT |
|---|---|---|
| 장점 | 빠른 시작, 낮은 메모리 | 좋은 런타임 성능, 플랫폼 독립성 |
| 단점 | 긴 빌드 타임, 플랫폼 종속 | 느린 시작, 높은 메모리 |
| 최적 | 모바일, 엣지 디바이스 | 클라우드, 장시간 실행 서버 |
현대의 최선의 선택은 상황에 맞는 최적화 전략을 선택하는 것이며, 많은 플랫폼과 언어들이 Hybrid 방식으로 진화하고 있다.