ZJIT의 컴파일 과정은 YARV 바이트코드를 입력받아 중간 표현(IR)을 구축하고, 최적화를 거쳐 머신 코드를 생성합니다. ZJIT는 바이트코드 실행 중 인자 타입 프로파일링을 위해 특정 opcode를 수정합니다.
컴파일 파이프라인의 첫 단계인 HIR(High-level Intermediate Representation)은 스택이 없고 데이터 흐름이 명시적인 그래프 형태입니다. HIR은 최적화를 통해 타입 특수화된 코드로 변환됩니다. 예를 들어, GuardType
는 런타임에 피연산자 타입을 확인하여, 비정상적인 경우 인터프리터로 폴백하고, 정상적인 경우 FixnumAdd
와 같은 특수화된 코드만 실행되도록 합니다.
다음 단계인 LIR(Low-level Intermediate Representation)은 멀티 플랫폼 어셈블러 역할을 하며 레지스터 할당기를 포함합니다. HIR의 고수준 연산은 LIR에서 어셈블리 유사 언어로 변환되며, 저수준 명령어가 명시됩니다. LIR은 하나의 선형 블록으로 구성됩니다.
마지막으로 LIR은 어셈블리 코드로 변환됩니다. GuardType
와 FixnumAdd
는 몇 개의 빠른 머신 명령어로 직접 변환되어 타입 특수화의 효율성을 입증합니다. ZJIT는 x86과 ARM 백엔드를 모두 지원합니다.