-
루비 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 기반의 더 큰 컴파일 단위를 지원하며, 외부 기여를 촉진하는 구조
- 현재 인터프리터보다 빠르지만 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) 가 개발한 오픈소스 언어
- 다중 플랫폼에서 실행되며, 특히 웹 개발 분야에서 전 세계적으로 사용