ZJIT: 차세대 Ruby JIT 컴파일러

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

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

핵심 요약

  • 1 ZJIT는 Shopify에서 개발 중인 차세대 Ruby JIT 컴파일러로, 기존 YJIT의 한계를 극복하고 성능 향상을 목표로 합니다.
  • 2 이 프로젝트는 표준적인 메서드 기반 JIT 아키텍처와 SSA 기반 IR을 채택하여 유지보수성과 확장성을 높였습니다.
  • 3 ZJIT는 빠른 JIT-to-JIT 호출 및 컴파일된 코드의 직렬화/재사용 기능을 통해 Ruby 3.5에서 더욱 향상된 성능을 제공할 예정입니다.

도입

Maxim Shar는 Shopify의 Ruby 및 Rails 인프라 팀 소속으로서, 차세대 Ruby JIT 컴파일러인 ZJIT에 대해 발표했습니다. 이 발표는 기존 YJIT의 역사와 한계를 짚어보고, ZJIT의 주요 설계 변경 사항, 새로운 기능, 현재 개발 상황 및 Ruby 3.5에서의 기대치를 다루며, Ruby 성능 최적화의 중요성을 강조합니다. YJIT는 이미 Ruby 3.1에 통합되어 상당한 성능 향상을 가져왔지만, 특정 시점에서 성능 향상이 둔화되는 한계에 직면했습니다. 이러한 배경에서 ZJIT는 Ruby의 장기적인 생존과 발전을 위한 핵심적인 성능 개선 프로젝트로 제시됩니다.

ZJIT는 YJIT의 경험을 바탕으로, 보다 유지보수 가능하고 확장성 있는 아키텍처를 목표로 합니다. YJIT가 Yarv 바이트코드를 직접 머신 코드로 컴파일하는 단순한 구조였던 반면, ZJIT는 두 가지 핵심적인 설계 변경을 도입합니다. 첫째, ZJIT는 Lazy Basic Block Versioning 대신 전통적인 ‘메서드 기반 JIT 컴파일러’ 방식을 채택합니다. 이는 컴파일러 교과서에서 다루는 표준적인 접근 방식으로, 위험을 최소화하고 성공 가능성을 높이며, Ruby 커뮤니티의 참여를 용이하게 합니다. 둘째, ZJIT는 자체적인 ‘중간 표현(IR)’을 가집니다. YJIT가 MRI 인터프리터를 위해 설계된 Yarv 바이트코드를 사용했던 것과 달리, ZJIT는 JIT 컴파일러에 최적화된 SSA(Static Single Assignment) 기반 IR을 사용하여 복잡한 의미론을 작고 조합 가능한 기본 요소로 분해하고 코드 최적화를 용이하게 합니다. 이는 JavaScript JIT와 같은 다른 고성능 언어의 JIT 컴파일러에서 널리 사용되는 검증된 방식입니다.

ZJIT는 두 가지 주요 기능을 통해 성능을 더욱 향상시킬 계획입니다. 첫째, ‘빠른 JIT-to-JIT 호출’입니다. 기존 Ruby VM의 복잡한 호출 오버헤드를 줄이기 위해, ZJIT는 CPU의 callreturn 명령어를 직접 활용하고 C 스택을 사용하여 JIT 함수 간 호출을 최적화합니다. 초기 실험 결과, 재귀 피보나치 벤치마크에서 YJIT보다 60% 더 빠른 성능을 보여주며 매우 고무적인 결과를 얻었습니다. 둘째, ‘컴파일 작업의 직렬화 및 재사용’ 기능입니다. 이는 컴파일된 머신 코드를 저장하고 재사용하여 애플리케이션의 워밍업 시간을 단축하고, 더 높은 최적화 수준에 도달하기 위해 컴파일에 더 많은 시간을 할애할 수 있도록 합니다. 대규모 서버 환경에서 코드 재배포 시 발생하는 비효율성을 줄이는 데 큰 도움이 될 것입니다.

현재 ZJIT는 개발 초기 단계임에도 불구하고, 이미 사용자 정의 SSA IR, 제어 흐름, 빠른 JIT-to-JIT 호출, 상수 및 타입 전파, 데드 코드 제거 등 핵심 기능을 구현했습니다. 단순한 마이크로 벤치마크에서는 인터프리터 및 YJIT보다 빠른 성능을 보여주고 있습니다. ZJIT의 업스트림(C Ruby에 통합) 제안은 Ruby 코어 멤버들로부터 긍정적인 반응을 얻었으며, 몇 주 내에 이루어질 것으로 예상됩니다. Ruby 3.5에서는 YJIT가 여전히 사용 가능하며, ZJIT는 선택적 베타 기능으로 포함될 가능성이 높습니다. 개발팀은 올해 말까지 ZJIT가 YJIT의 성능을 능가하고 더 현실적인 벤치마크에서 우위를 점할 것으로 기대하고 있습니다.

결론

ZJIT 프로젝트는 Ruby의 미래 성능을 위한 중요한 발걸음입니다. YJIT의 성공적인 경험을 바탕으로, 더욱 견고하고 확장 가능한 아키텍처를 구축함으로써 Ruby가 끊임없이 변화하는 기술 환경에서 경쟁력을 유지하고 장기적으로 생존할 수 있도록 기여할 것입니다. 표준화된 설계와 혁신적인 최적화 기술의 도입은 Ruby 생태계 전반에 걸쳐 성능 향상을 가져올 것이며, 이는 개발자들이 최신 Ruby 버전으로 업그레이드할 강력한 동기를 제공할 것입니다. ZJIT는 단순한 성능 개선을 넘어, Ruby 커뮤니티의 활발한 참여를 유도하고 언어 발전에 새로운 동력을 불어넣는 계기가 될 것으로 전망됩니다. Shopify는 이 프로젝트를 위해 컴파일러 전문가 등 인재를 적극적으로 채용하며 Ruby 성능 개선에 대한 강한 의지를 보이고 있습니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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