JIT과 AOT를 구분할 때 가장 중요한 기준은 중간 언어를 네이티브 코드로 번역하는 시점이다.
JIT은 인터프리터와 유사하게 프로그램이 실행되는 도중에 코드 블록(메서드 단위)을 컴파일하여 해당 플랫폼의 네이티브 코드로 번역한다.
필요한 코드만 컴파일하고 이미 컴파일한 코드는 캐싱되기 때문에 추가 메모리를 요구하고 초기 실행 속도는 느리지만 실행 도중의 성능 향상을 노릴 수 있다.
또한 실행 시에만 얻을 수 있는 프로그램 분석 정보를 사용하여 높은 성능을 달성할 수 있다.
하지만 이 경우 프로그램 분석과 컴파일을 동시에 수행하기 때문에 추가 메모리 및 CPU 사이클이 필요하다.
결과적으로 런타임에 번역을 한다는 것 자체가 사용자 입장에서 성능의 문제로 다가올 수 있다.
따라서 개발 단계에 빠른 테스트가 필요하거나 런타임에 프로그램의 분석이 필요한 경우에 사용하면 적합하다.
유니티의 Mono 빌드가 JIT 방식이다.
AOT는 빌드 시점에 중간 언어를 네이티브 코드로 번역한다.
전체적으로 JIT과 상반되는 장단점을 가졌다.
빌드시 모든 코드를 네이티브 코드로 번역하기 때문에 빌드 시간이 상대적으로 오래 걸리지만 기계어를 바로 실행하기 때문에 메모리 사용량이 줄어들고 실행 속도가 빠르다.
따라서 배포 단계, 특히 모바일 기기와 같은 리소스가 제한된 환경에 최적화된 실행 파일을 배포할 때 적합하다.
유니티의 IL2CPP 빌드가 AOT 방식이다.