Ruby 4.0의 새로운 JIT 컴파일러, ZJIT 소개 및 현황

ZJIT is now available in Ruby 4.0

작성자
HackerNews
발행일
2025년 12월 24일

핵심 요약

  • 1 Ruby 4.0에 기본 포함된 ZJIT은 성능 한계 극복과 기여 용이성을 목표로 설계된 새로운 JIT 컴파일러입니다.
  • 2 현재 인터프리터보다 빠르며, SSA IR 도입과 C 메서드 인라이닝 등을 통해 YJIT의 성능을 추격하고 있습니다.
  • 3 사이드 엑시트 구현 및 대규모 애플리케이션 테스트 통과 등 비약적인 발전을 이루었으며 향후 최적화 계획이 구체화되어 있습니다.

도입

ZJIT은 YJIT 개발팀이 Ruby의 성능 한계를 더욱 높이고 외부 기여를 활성화하기 위해 새롭게 구축한 JIT 컴파일러입니다. Ruby 4.0부터 기본적으로 포함되지만 명시적인 활성화가 필요하며, 전통적인 메서드 컴파일러 구조와 SSA(Static Single Assignment) IR을 채택하여 더 넓은 범위의 최적화를 목표로 합니다.

ZJIT의 주요 발전 사항

  • 사이드 엑시트(Side-exits) 구현: JIT 코드 실행 중 예상치 못한 타입 변경이나 메서드 재정의가 발생할 경우, 안전하게 인터프리터로 제어를 넘길 수 있게 되어 더 복잡한 코드 실행이 가능해졌습니다.

  • 확장된 최적화 범위: 정수 연산뿐만 아니라 인스턴스 변수 접근, 구조체 읽기/쓰기, 객체 할당 등 다양한 작업을 최적화하며, Shopify와 GitHub 같은 대규모 애플리케이션의 테스트를 통과하는 수준에 도달했습니다.

  • C 메서드 인라이닝: Integer

succ와 같은 주요 내장 C 메서드를 HIR(High-level IR) 수준에서 직접 처리하여 불필요한 호출 비용을 줄이고 타입 추론 효율을 높였습니다.

  • 레지스터 할당 및 시각화: 대규모 함수 컴파일을 위한 레지스터 스필링 문제를 해결했으며, Iongraph 통합을 통해 최적화 단계를 시각적으로 분석할 수 있는 도구를 마련했습니다.

향후 로드맵

  • yield 및 super 호출 최적화와 객체 셰이프(Shape) 전이 시의 최적화를 계획 중입니다.

  • 선형 스캔(Linear Scan) 기반의 레지스터 할당기 재작성을 통해 성능을 개선하고, 다형성(Polymorphic) 호출 최적화를 준비하고 있습니다.

  • VM 프레임 상태 업데이트를 지연시키는 ‘Deferred Frame Flushing’을 통해 실행 효율을 극대화할 예정입니다.

결론

ZJIT은 아직 개발 초기 단계로 YJIT의 성능에는 미치지 못하지만, 강력한 기초 설계를 바탕으로 빠르게 발전하고 있습니다. Ruby 4.0 사용자들은 실험적인 목적으로 ZJIT을 활성화하여 테스트할 수 있으며, 이는 향후 Ruby 생태계의 전반적인 성능 향상을 이끄는 핵심 동력이 될 것으로 기대됩니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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