Ignition 인터프리터와 TurboFan 최적화 컴파일러
Just-In-Time (JIT) 컴파일러는 실행 시간(runtime)에 코드를 기계어로 변환하여 실행 성능을 획기적으로 향상시키는 기술입니다. 여기서는 JIT의 아이디어, 알고리즘, 그리고 작동 방식을 상급자 수준으로 자세하게 설명하겠습니다.
동적 컴파일:
JIT 컴파일러는 프로그램 실행 중에 인터프리터 방식으로 실행되는 코드의 일부(또는 전체)를 기계어로 컴파일합니다. 이를 통해 해석기의 유연성과 정적 컴파일러의 높은 실행 속도를 결합합니다.
프로파일링 기반 최적화:
JIT는 실행 중에 코드의 "핫스팟" (자주 실행되는 부분)을 탐지하기 위해 프로파일링 정보를 수집합니다. 이 데이터를 바탕으로 최적화가 필요한 영역에 대해 추가적인 최적화를 수행합니다.
티어드 컴파일 (Tiered Compilation):
초기에는 빠른 컴파일을 위해 기본적인 코드 생성(**baseline JIT)**만 수행한 후, 실행 빈도가 높은 코드에 대해 더 정교하고 시간이 오래 걸리는 최적화 컴파일(**optimizing JIT)**을 적용하는 단계적 접근 방식을 사용합니다.
동적 분석:
프로그램이 실행되면서 JIT는 각 함수나 루프 등에서 실행 횟수, 분기 예측 실패, 메모리 접근 패턴 등 다양한 실행 통계**(profiling data)**를 수집합니다.
핫 코드 탐지:
수집된 프로파일링 정보는 "핫스팟" 코드를 식별하는 데 사용됩니다. 예를 들어, 특정 함수가 반복적으로 호출되거나 루프가 오랜 시간 동안 실행되는 경우, 해당 코드가 최적화 대상이 됩니다.
Baseline Compiler:
초기 JIT 컴파일 단계에서는 빠른 코드 생성이 목표입니다. 여기서 생성된 기계어 코드는 기본적인 최적화만 적용되며, 실행 속도가 향상되지만 아직 최적화 수준은 낮습니다.
Optimizing Compiler:
핫스팟 코드에 대해 최적화 컴파일러가 작동합니다. 이 단계에서는 다음과 같은 고급 최적화 기법이 적용됩니다: