JIT(Just in Time) 컴파일
Just in Time 컴파일을 의미한다. 실행 시점에 바이트코드를 기계어로 컴파일하는 방식이다. 즉, 프로그램 실행 중에 필요한 부분을 동적으로 컴파일해 실행하는 방식이다. 설치 용량이 작고 설치 시간 또한 적게 소요되며, 효율적인 메모리 운용이 가능하다는 장점이 있지만, 실행시 컴파일을 하는 시간이 있어 시작 속도가 느리다는 단점이 있다.
개발자 입장에서는 빠른 반복 개발 및 디버깅을 허용하므로, 개발자 생산성을 향상시킬 수 있다.
Java, C#, JavaScript 등의 언어에서 사용하는 방식이다.
AOT(Ahead of Time) 컴파일
Ahead of Time 컴파일을 의미한다. 실행 전, 설치 시점에 목표 시스템에 맞는 기계어로 미리 컴파일을 해놓는 방식이다. 이 때문에 설치 시간이 오래 걸리고 설치 용량이 크며 실행에 필요하지 않은 부분도 메모리에 올라가 메모리 사용량이 높아질 수 있다는 단점이 있지만, 미리 컴파일을 해놓기 때문에 시작 속도가 빠르다. 또한 컴파일 시점에 최적화가 가능하므로, 실행 시에 추가적인 최적화 단계가 필요하지 않다.
빌드에 소요되는 시간이 길고 디버깅이 쉽지 않다는 점에서 개발자 입장에서는 생산성이 JIT보다 떨어진다.
C, C++, Rust, Dart 등의 언어에서 사용하는 방식이다.
어떤 컴파일러를 사용해야 하는가?
JIT와 AOT는 특징이 다를 뿐, 어떤 것이 다른 하나보다 좋은 것은 아니다. 따라서, 프로젝트의 목적이나 개발 환경, 프로그래밍의 목적 등에 따라 컴파일 방식을 선택하는 것이 중요하다.
기타
Dart VM의 경우에는 JIT 방식과 AOT 방식을 모두 지원하여 유연성을 높였다. 개발 당시에는 JIT 컴파일을, 그리고 애플리케이션 빌드시에는 AOT 컴파일을 적용할 수 있다.
Reference
https://ko.wikipedia.org/wiki/AOT_%EC%BB%B4%ED%8C%8C%EC%9D%BC
https://selfish-developer.com/entry/AOTAhead-Of-Time-Compiler
https://daily50.tistory.com/360