- 루비 4.0.0이 공개되어, 새로운 Ruby Box와 ZJIT를 도입하고 다수의 성능 및 언어 개선을 포함
- Ruby Box는 클래스, 모듈, 전역 변수, 네이티브/루비 라이브러리 정의를 격리 실행할 수 있는 실험적 기능
- ZJIT는 Rust 기반 차세대 JIT 컴파일러로, 기존 YJIT보다 구조적으로 확장 가능하며 외부 기여를 용이하게 함
- Ractor 병렬 실행 모델이 안정성과 성능 면에서 개선되어, 향후 실험적 상태를 해제할 예정
- 핵심 클래스, 표준 라이브러리, C API, GC, JIT 등 전반에 걸친 업데이트로 루비 생태계의 성능과 확장성을 강화
Ruby 4.0 개요
- Ruby 4.0.0은 Ruby Box와 ZJIT를 중심으로 한 대규모 업데이트 버전
- 병렬 실행, 언어 문법, 표준 라이브러리, GC, JIT 등 다양한 영역에서 개선 포함
- 다운로드는
.tar.gz,.tar.xz,.zip형식으로 제공
Ruby Box
-
Ruby Box는 정의의 격리를 제공하는 실험적 기능
- 환경 변수
RUBY_BOX=1설정 시 활성화되며, 클래스는Ruby::Box - 박스 내부에서 로드된 정의는 외부와 격리되어, monkey patch, 전역/클래스 변수, 클래스/모듈 정의, 라이브러리 변경이 다른 박스에 영향을 주지 않음
- 환경 변수
- 주요 사용 예시
- 테스트 케이스 간 격리 실행
- 블루-그린 배포를 위한 병렬 웹앱 실행
- 의존성 업데이트 검증용 병렬 실행
- 향후 고수준 “패키지 API” 구현의 기반 API로 활용 예정
ZJIT
-
ZJIT는 YJIT의 차세대 버전으로 개발된 새 JIT 컴파일러
- Rust 1.85.0 이상 필요,
--zjit옵션으로 활성화 - SSA IR 기반의 더 큰 컴파일 단위를 지원하며, 외부 기여를 촉진하는 구조
- Rust 1.85.0 이상 필요,
- 현재 인터프리터보다 빠르지만 YJIT보다 느림
- 프로덕션 사용은 권장되지 않으며, Ruby 4.1에서 성능 향상 예정
Ractor 개선
- Ractor::Port 클래스 추가로 메시지 송수신 문제 해결
-
Ractor.shareable_proc으로 Ractor 간 Proc 객체 공유 용이 - 내부 데이터 구조 개선으로 글로벌 락 경합 감소, 병렬성 향상
- Ractor의 실험적 상태를 다음 해에 해제 예정
언어 변경
-
*nil이 더 이상nil.to_a를 호출하지 않음 (**nil과 동일한 동작) - 논리 연산자(
||,&&,and,or)가 라인 연속(dot chaining) 문법을 지원 - 코드 가독성과 일관성 향상
핵심 클래스 업데이트
-
Array:
Array#rfind,Array#find추가로 효율적 탐색 지원 -
Binding: 번호 매개변수 제외 및
implicit_parameters관련 메서드 추가 -
Enumerator:
produce에size:키워드 인자 추가 -
ErrorHighlight:
ArgumentError발생 시 호출자·정의부 코드 스니펫 표시 -
Fiber/Fiber::Scheduler:
raise(cause:),fiber_interrupt,yield등 추가 -
File: Linux에서
File::Stat#birthtime지원 -
IO:
Float::INFINITY타임아웃 허용, 파이프 기반 프로세스 생성 제거 -
Kernel:
#inspect커스터마이징 가능,Kernel#open의 파이프 생성 제거 -
Math:
log1p,expm1추가 - Pathname: 기본 젬에서 코어 클래스로 승격
- Proc: 익명 매개변수 출력 형식 통일
-
Ractor:
Ractor::Port기반 통신 구조로 변경,Ractor.yield등 제거 -
Set: 코어 클래스로 승격,
inspect형식 단순화 -
Socket:
open_timeout인자 추가, 타임아웃 예외 통일 -
String: Unicode 17.0.0, Emoji 17.0 지원,
strip계열 메서드 확장 -
Thread:
raise(cause:)인자 지원
표준 라이브러리(Stdlib) 업데이트
-
기본 젬 승격:
ostruct,pstore,benchmark,logger,rdoc,win32ole,irb,reline,fiddle등 -
기본 젬 추가:
win32-registry 0.1.2 -
기본 젬 업데이트:
RubyGems 4.0.3,bundler 4.0.3,openssl 4.0.0,json 2.18.0등 -
번들 젬 업데이트:
minitest 6.0.0,rake 13.3.1,rbs 3.10.0,debug 1.11.1등 - RubyGems/Bundler 4 포함
플랫폼 지원
- Windows: MSVC 14.0 미만 버전 지원 중단 (Visual Studio 2015 이상 필요)
호환성 변경
-
Ractor.yield,Ractor#take,Ractor#close_incoming,Ractor#close_outgoing제거 -
ObjectSpace._id2ref사용 중단 -
Process::Status#&,#>>제거 - 내부 프레임(backtrace) 출력 단순화
-
ArgumentError백트레이스에 수신자 클래스/모듈명 표시
표준 라이브러리 호환성
-
CGI 라이브러리 제거,
cgi/escape만 유지 -
Set의 코어 승격으로SortedSet은 별도 젬 설치 필요 -
Net::HTTP의 자동Content-Type헤더 설정 제거
C API 업데이트
-
rb_thread_fd_close비활성화 및rb_io_close사용 권장 -
rb_thread_call_with_gvl이 GVL 유무에 관계없이 동작 -
Set용 C API 추가 (
rb_set_new,rb_set_add,rb_set_delete등)
구현 및 성능 개선
-
Class#new호출 속도 향상, 특히 키워드 인자 사용 시 - GC 힙 풀 독립 성장으로 메모리 사용량 감소
- 대형 객체 스위핑 속도 향상
-
object_id,hash계산 및 인스턴스 변수 접근 최적화 -
Ractor 성능 개선
- 락 없는 해시 구조, 캐시 경합 감소, 객체 할당 최적화
- 데드락, 인코딩, GC 관련 버그 수정
JIT 관련
-
ZJIT: 메서드 기반 JIT, Rust 1.85.0 이상 필요,
--zjit또는RubyVM::ZJIT.enable로 활성화 -
YJIT: 통계 옵션 변경,
mem_size:및call_threshold:추가 -
RJIT:
--rjit제거, 별도 저장소로 이전
변경 규모
- Ruby 3.4.0 대비 3,889개 파일 변경, 230,769줄 추가, 297,003줄 삭제
- 루비 4.0은 성능, 병렬성, 언어 일관성을 대폭 강화한 메이저 릴리스
다운로드
-
ruby-4.0.0.tar.gz,ruby-4.0.0.tar.xz,ruby-4.0.0.zip형식 제공 - 각 파일의 SHA1, SHA256, SHA512 해시값 명시
Ruby 소개
- 루비는 1993년 마츠모토 유키히로(Matz) 가 개발한 오픈소스 언어
- 다중 플랫폼에서 실행되며, 특히 웹 개발 분야에서 전 세계적으로 사용