JIT 컴파일

JIT 컴파일(Just-in-time Compilation)은 프로그램의 실행 시점에 코드의 일부 또는 전체를 네이티브 기계어로 변환하는 컴파일 방식이다. 가상 머신이 바이트코드를 해석하다 자주 실행하는 함수를 JIT로 변환하는 구조가 흔하지만 JIT가 반드시 먼저 바이트코드 인터프리터...

정식 명칭Just-in-time compilation
한국어 명칭실행 시점 컴파일
분류프로그램 실행·컴파일 기법
실행 단계실행 중 기계어 생성
적용JVM·.NET CLR·JavaScript 엔진 등
입력바이트코드·중간 표현
출력현재 CPU용 네이티브 코드
최적화프로파일 수집·인라이닝·특수화
관련AOT 컴파일, 인터프리터, 가상 머신
참조OpenJDK HotSpot
LLVMLLVM ORC JIT

JIT 컴파일(Just-in-time Compilation)은 프로그램의 실행 시점에 코드의 일부 또는 전체를 네이티브 기계어로 변환하는 컴파일 방식이다. 가상 머신이 바이트코드를 해석하다 자주 실행하는 함수를 JIT로 변환하는 구조가 흔하지만 JIT가 반드시 먼저 바이트코드 인터프리터를 거쳐야 하는 것은 아니다. Java HotSpot, .NET CLR, 여러 JavaScript 실행 엔진 등이 JIT 컴파일을 활용한다.[1]

실행 환경은 반복 호출되는 함수·루프와 인자 타입, 분기 빈도 등의 프로파일을 수집하고 최적화 수준을 선택한다. 런타임이 실제 사용하는 데이터에 특화된 인라이닝·코드 경로를 만들 수 있지만 관찰한 가정이 깨지면 탈최적화(deoptimization)하여 일반 실행 경로로 돌아갈 수 있다. 런타임 코드 캐시와 페이지 권한, 스레드 동기화는 실행 중 기계어를 생성하는 과정에서 중요한 요소다.

JIT의 장점은 실행 대상 CPU와 프로그램의 실제 동작을 고려해 최적화할 수 있다는 점이지만 컴파일 작업 자체에 CPU·메모리를 사용하고 시작 시간이 길어질 수도 있다. 샌드박스·보안 정책이 실행 가능 메모리 생성이나 동적 코드 생성을 제한하는 플랫폼에서는 JIT 사용이 어려울 수 있다. 그래서 어떤 환경에서는 AOT 컴파일이나 해석 실행을 선택한다.[2]

JIT는 앱을 설치하거나 배포하는 형식과 완전히 동일한 개념이 아니다. 예를 들어 이미 배포된 바이트코드와 런타임의 JIT 코드가 공존할 수 있고, AOT로 미리 생성한 코드에도 실행 시 JIT 최적화를 더하는 계층형 모델이 가능하다.

역사

정의와 목적

핵심 개념 및 동작

응용 사례와 도구

성능·정확성과 제약

관련 문서

  1. OpenJDK HotSpot ↩
  2. LLVM ORC JIT documentation ↩