ZJIT, Ruby에 병합되다: 새로운 JIT 컴파일러의 개요

ZJIT has been merged into Ruby

작성자
발행일
2025년 05월 14일

핵심 요약

  • 1 ZJIT는 RubyKaigi 2025에서 발표된 새로운 JIT(Just-In-Time) 컴파일러로, Ruby에 성공적으로 병합되었습니다.
  • 2 ZJIT는 YJIT와는 다른 아키텍처를 가지며, 커뮤니티 기여를 용이하게 하기 위해 보다 전통적인 컴파일러 방식으로 설계되었습니다.
  • 3 현재 개발 초기 단계에 있으며, Ruby 3.5에는 YJIT와 함께 제공될 예정이고, 향후 YJIT와 동등한 수준의 기능과 성능을 목표로 개발될 것입니다.

도입

RubyKaigi 2025 발표와 Matz-san의 승인에 따라, 새로운 JIT(Just-In-Time) 컴파일러인 ZJIT가 Ruby에 성공적으로 병합되었습니다. YJIT를 개발한 팀이 Ruby의 YARV에 내장하기 위해 개발한 ZJIT는 YJIT와 차별화되는 아키텍처를 가집니다. 특히, ZJIT는 커뮤니티 기여를 용이하게 하고자 전통적인 '교과서적인' 컴파일러 방식으로 설계되었으며, 이는 최적화 프로그램에 더 많은 코드를 한 번에 제공하는 장점을 가집니다.

ZJIT의 컴파일 과정은 YARV 바이트코드를 입력받아 중간 표현(IR)을 구축하고, 최적화를 거쳐 머신 코드를 생성합니다. ZJIT는 바이트코드 실행 중 인자 타입 프로파일링을 위해 특정 opcode를 수정합니다.

컴파일 파이프라인의 첫 단계인 HIR(High-level Intermediate Representation)은 스택이 없고 데이터 흐름이 명시적인 그래프 형태입니다. HIR은 최적화를 통해 타입 특수화된 코드로 변환됩니다. 예를 들어, GuardType는 런타임에 피연산자 타입을 확인하여, 비정상적인 경우 인터프리터로 폴백하고, 정상적인 경우 FixnumAdd와 같은 특수화된 코드만 실행되도록 합니다.

다음 단계인 LIR(Low-level Intermediate Representation)은 멀티 플랫폼 어셈블러 역할을 하며 레지스터 할당기를 포함합니다. HIR의 고수준 연산은 LIR에서 어셈블리 유사 언어로 변환되며, 저수준 명령어가 명시됩니다. LIR은 하나의 선형 블록으로 구성됩니다.

마지막으로 LIR은 어셈블리 코드로 변환됩니다. GuardTypeFixnumAdd는 몇 개의 빠른 머신 명령어로 직접 변환되어 타입 특수화의 효율성을 입증합니다. ZJIT는 x86과 ARM 백엔드를 모두 지원합니다.

결론

ZJIT 프로젝트는 아직 개발 초기 단계이며, 프로덕션 환경에서의 사용은 권장되지 않습니다. Ruby 3.5에는 YJIT와 ZJIT가 함께 제공될 예정이며, ZJIT는 YJIT와 동등한 기능 및 성능을 목표로 지속적으로 개선될 것입니다. 현재 개발팀은 사이드 이그짓(side-exits) 구현에 집중하여 Ruby 테스트 스위트 및 실제 애플리케이션 실행을 가능하게 하고, 이를 통해 정확성 및 성능 기준선을 확보할 계획입니다. ZJIT의 발전은 Ruby의 성능 향상에 중요한 기여를 할 것으로 기대됩니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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