ZJIT: 차세대 Ruby JIT 컴파일러

[EN] ZJIT: Building a Next Generation Ruby JIT / Maxime Chevalier-Boisvert @maximecb

작성자
RubyKaigi
발행일
2025년 05월 27일

핵심 요약

  • 1 ZJIT은 YJIT의 한계를 극복하고 Ruby 성능을 획기적으로 향상시키기 위한 차세대 JIT 컴파일러 프로젝트입니다.
  • 2 표준적인 메서드 기반 아키텍처와 SSA 기반 IR을 채택하여 유지보수성, 확장성 및 커뮤니티 접근성을 높였습니다.
  • 3 빠른 JIT-to-JIT 호출 및 JIT 캐싱 기능을 통해 마이크로벤치마크에서 YJIT를 능가하는 초기 성능을 보이며 Ruby 3.5에 탑재될 예정입니다.

도입

Maxim Shar는 Shopify의 Ruby 및 Rails 인프라 팀 소속으로, 차세대 Ruby JIT 컴파일러인 ZJIT 프로젝트를 소개합니다. 이 강연은 YJIT의 성공적인 역사와 현재 직면한 성능 한계를 되짚어보고, Ruby의 장기적인 생존과 발전을 위해 왜 새로운 JIT 컴파일러가 필요한지 설명합니다. ZJIT은 지난 4년 반 동안 YJIT 개발을 통해 얻은 경험과 수많은 실험 결과를 바탕으로 구축되고 있으며, Ruby 3.5에 대한 기대와 향후 계획을 제시합니다.

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 성능을 능가하는 것을 목표로 합니다.

결론

ZJIT 프로젝트는 Ruby의 성능 한계를 돌파하고 언어의 장기적인 생존과 발전을 위한 중요한 발걸음입니다. 표준화된 아키텍처와 혁신적인 기능들을 통해 ZJIT은 더 빠르고 유지보수하기 쉬운 JIT 컴파일러를 제공할 것입니다. 비록 아직 초기 단계지만, 이미 고무적인 성능 향상을 보이고 있으며, Ruby 3.5 출시와 함께 개발자들에게 더욱 강력한 Ruby 환경을 선사할 것으로 기대됩니다. Shopify는 ZJIT 개발에 참여할 컴파일러 전문가 및 시스템 프로그래머를 적극적으로 채용하고 있습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!