Ruby 3.4.0의 주요 개선 사항들은 다음과 같습니다.
언어 및 핵심 기능 개선
가장 주목할 만한 변화 중 하나는 it
블록 파라미터 참조의 도입입니다. 이는 변수 이름 없이 블록 파라미터를 참조할 수 있게 하여, 특히 한 줄짜리 블록에서 코드 가독성을 높이고 간결성을 제공합니다. 기존의 _1
과 유사하지만, 다른 번호 매개변수의 존재 가능성에서 오는 인지 부하를 줄여줍니다. 또한, Prism이 기본 파서로 채택되었습니다. 이는 내부적인 개선사항으로 사용자에게 큰 변화는 없지만, 호환성 문제가 발생할 경우 보고가 필요합니다.
네트워크 및 성능 최적화
네트워크 연결성 측면에서는 소켓 라이브러리에 Happy Eyeballs Version 2 (RFC 8305) 지원이 추가되었습니다. 이 기능은 TCPSocket.new
와 Socket.tcp
에서 IPv6 및 IPv4 이름 해상도를 동시에 수행하고, 250ms 간격으로 병렬 연결을 시도하여 가장 먼저 성공하는 연결을 반환함으로써 연결 지연을 최소화합니다. 이는 현대 인터넷 환경에서 효율적이고 안정적인 네트워크 연결을 보장합니다.
YJIT는 Ruby 3.4.0에서 상당한 발전을 이루었습니다. x86-64 및 arm64 플랫폼 모두에서 대부분의 벤치마크에서 더 나은 성능을 보여주며, 압축된 메타데이터와 통합된 메모리 제한을 통해 메모리 사용량이 감소했습니다. 새로운 명령줄 옵션 --yjit-mem-size
는 YJIT 메모리 사용량을 추적하는 직관적인 방법을 제공하며, --yjit-log
는 컴파일 로그를 활성화합니다. Ruby API RubyVM::YJIT.log
를 통해 런타임에 컴파일 로그에 접근할 수 있으며, RubyVM::YJIT.runtime_stats
는 무효화, 인라이닝 및 메타데이터 인코딩에 대한 추가 통계를 제공합니다. 또한, 로컬 변수 및 Ruby 메서드 인수에 대한 레지스터 할당, Array#each
, Array#select
, Array#map
과 같은 코어 프리미티브의 Ruby 재작성, 작은/사소한 메서드 인라이닝 등 다양한 최적화가 이루어졌습니다.
가비지 컬렉션 및 기타 변경사항
모듈형 GC(Modular GC)는 동적으로 대체 가비지 컬렉터 구현을 로드할 수 있게 하는 중요한 기능입니다. 빌드 시 --with-modular-gc
옵션을 통해 활성화할 수 있으며, RUBY_GC_LIBRARY
환경 변수를 사용하여 런타임에 GC 라이브러리를 로드할 수 있습니다. Ruby의 내장 GC 또한 별도의 파일로 분리되어 라이브러리로 빌드될 수 있으며, MMTk 기반의 실험적인 GC 라이브러리도 제공됩니다.
언어 변경사항으로는, frozen_string_literal
주석이 없는 파일의 문자열 리터럴이 변경될 때 더 이상 사용되지 않는다는 경고가 발생합니다. 메서드 호출 시 **nil
키워드 스플랫팅이 지원되며, 이는 **{}
와 유사하게 키워드를 전달하지 않습니다. 또한, 인덱스에서 블록 전달 및 키워드 인수가 더 이상 허용되지 않습니다.
코어 클래스 업데이트에서는 Exception#set_backtrace
가 Thread::Backtrace::Location
배열을 허용하며, GC.config
가 추가되어 가비지 컬렉터 구성 변수를 설정할 수 있게 되었습니다. Ractor
는 require
허용, Ractor.main?
, Ractor.[]
및 Ractor.[]=
를 통한 로컬 스토리지 접근, 그리고 스레드 안전한 로컬 변수 초기화를 위한 Ractor.store_if_absent
등 다양한 개선이 이루어졌습니다.
표준 라이브러리 업데이트로는 RubyGems의 --attestation
옵션, Bundler의 lockfile_checksums
구성, JSON.parse의 약 1.5배 성능 향상, Tempfile.create의 anonymous: true
지원 등이 있습니다. 호환성 문제로는 오류 메시지 및 백트레이스 표시 변경, Hash#inspect
렌더링 변경, Kernel#Float()
및 String#to_f
의 소수부 생략 문자열 허용 등이 있습니다. 또한, Refinement#refined_class
가 제거되었고, DidYouMean
및 Net::HTTP
의 일부 상수가 제거되었습니다. Timeout.timeout
은 음수 값을 더 이상 허용하지 않으며, URI의 기본 파서가 RFC 3986을 준수하도록 변경되었습니다.
C API에서는 rb_newobj
및 rb_newobj_of
관련 함수와 매크로가 제거되었고, 더 이상 사용되지 않는 rb_gc_force_recycle
함수도 제거되었습니다. 기타 변경사항으로는 사용되지 않는 블록을 메서드에 전달할 때 경고가 표시되며, String.freeze
또는 Integer#+
와 같이 인터프리터 및 JIT에 의해 특별히 최적화된 일부 코어 메서드를 재정의할 때 성능 경고가 발생합니다.