YJIT의 한계와 ZJIT의 필요성
YJIT은 Ruby 3.1 이후 성능 향상에 기여했으나, 최근 정체기에 직면했습니다. 단순 반복문에서 JavaScript JIT 대비 현저히 느려, 기존 아키텍처의 한계가 드러났습니다. Ruby의 장기적 경쟁력을 위해 새로운 JIT 컴파일러 개발이 시급합니다.
ZJIT의 아키텍처 개선
ZJIT은 YJIT의 ‘Lazy Basic Block Versioning’ 대신 표준적인 메서드 기반 JIT 컴파일러 아키텍처를 채택하여 낮은 위험, 높은 모듈성, 확장성 및 커뮤니티 참여를 촉진합니다.
또한 SSA(Static Single Assignment) 기반의 자체 중간 표현(IR)을 도입합니다. * 인터프리터에 최적화된 YARV 바이트코드와 달리, ZJIT의 IR은 코드를 작고 조합 가능한 기본 요소로 분해하여 최적화를 용이하게 합니다. * LLVM, GCC 등에서 널리 사용되는 SSA 기반 IR은 유연성과 견고함이 입증된 표준입니다.
ZJIT의 주요 기능
ZJIT은 빠른 JIT-to-JIT 호출과 JIT 캐시 / 직렬화를 핵심 기능으로 합니다.
* 빠른 JIT-to-JIT 호출: CPU의 call
/return
명령과 C 스택을 직접 활용하여 함수 호출 속도를 대폭 향상시키며, 초기 실험에서 YJIT보다 60% 이상 빠른 성능을 보였습니다.
* JIT 캐시 / 직렬화: 컴파일된 머신 코드를 저장하고 재사용하여 워밍업 시간을 단축하고 더 높은 수준의 최적화를 가능하게 합니다.
현재 상태 및 Ruby 3.5 계획
ZJIT은 개발 초기 단계임에도 SSA IR, 빠른 JIT-to-JIT 호출 등 핵심 기능이 작동하며 일부 마이크로벤치마크에서 YJIT보다 빠른 결과를 보여줍니다. Ruby 3.5에서는 YJIT과 함께 베타 버전으로 제공되며, 연말까지 YJIT 성능을 능가하는 것을 목표로 합니다.