Ruby 3.4.0 릴리스: 성능, 연결성 및 개발자 경험 개선

Ruby 3.4.0 Released

작성자
Ruby on Rails 소식지
발행일
2024년 12월 25일

핵심 요약

  • 1 Ruby 3.4.0이 공식 출시되었으며, 새로운 `it` 블록 파라미터 참조, 기본 파서로 Prism 채택, 그리고 소켓 라이브러리에 Happy Eyeballs Version 2 지원이 추가되었습니다.
  • 2 YJIT는 성능 향상, 메모리 사용량 감소, 다양한 최적화 및 새로운 명령줄 옵션과 Ruby API를 통해 더욱 강력해졌습니다.
  • 3 모듈형 GC 도입으로 동적 가비지 컬렉터 구현이 가능해졌으며, MMTk 기반의 실험적인 GC 라이브러리도 제공되어 유연성이 증대되었습니다.

도입

2024년 12월 25일, Ruby 3.4.0이 공식적으로 릴리스되었습니다. 이번 버전은 언어의 핵심 기능 개선, 성능 최적화, 네트워크 연결성 향상, 그리고 개발자 경험 전반에 걸친 중요한 변화를 담고 있습니다. Ruby 3.4.0은 새로운 기능 도입과 함께 기존 시스템의 안정성을 강화하여 더욱 효율적이고 강력한 개발 환경을 제공하는 데 중점을 두었습니다. 특히, YJIT의 발전과 모듈형 GC의 도입은 Ruby 애플리케이션의 성능과 유연성을 한 단계 끌어올릴 것으로 기대됩니다.

Ruby 3.4.0의 주요 개선 사항들은 다음과 같습니다.

언어 및 핵심 기능 개선

가장 주목할 만한 변화 중 하나는 it 블록 파라미터 참조의 도입입니다. 이는 변수 이름 없이 블록 파라미터를 참조할 수 있게 하여, 특히 한 줄짜리 블록에서 코드 가독성을 높이고 간결성을 제공합니다. 기존의 _1과 유사하지만, 다른 번호 매개변수의 존재 가능성에서 오는 인지 부하를 줄여줍니다. 또한, Prism이 기본 파서로 채택되었습니다. 이는 내부적인 개선사항으로 사용자에게 큰 변화는 없지만, 호환성 문제가 발생할 경우 보고가 필요합니다.

네트워크 및 성능 최적화

네트워크 연결성 측면에서는 소켓 라이브러리에 Happy Eyeballs Version 2 (RFC 8305) 지원이 추가되었습니다. 이 기능은 TCPSocket.newSocket.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_backtraceThread::Backtrace::Location 배열을 허용하며, GC.config가 추가되어 가비지 컬렉터 구성 변수를 설정할 수 있게 되었습니다. Ractorrequire 허용, 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가 제거되었고, DidYouMeanNet::HTTP의 일부 상수가 제거되었습니다. Timeout.timeout은 음수 값을 더 이상 허용하지 않으며, URI의 기본 파서가 RFC 3986을 준수하도록 변경되었습니다.

C API에서는 rb_newobjrb_newobj_of 관련 함수와 매크로가 제거되었고, 더 이상 사용되지 않는 rb_gc_force_recycle 함수도 제거되었습니다. 기타 변경사항으로는 사용되지 않는 블록을 메서드에 전달할 때 경고가 표시되며, String.freeze 또는 Integer#+와 같이 인터프리터 및 JIT에 의해 특별히 최적화된 일부 코어 메서드를 재정의할 때 성능 경고가 발생합니다.

결론

Ruby 3.4.0은 `it` 블록 파라미터 참조와 같은 개발자 편의 기능, Prism 파서의 기본 채택, Happy Eyeballs V2를 통한 네트워크 연결성 강화, 그리고 YJIT 및 모듈형 GC의 대대적인 개선을 통해 Ruby의 성능과 유연성을 크게 향상시켰습니다. 이번 릴리스는 총 4942개의 파일이 변경되고 20만 줄 이상의 코드가 추가되는 등 방대한 변화를 포함하고 있으며, 이는 Ruby가 지속적으로 발전하고 현대적인 개발 요구사항에 부응하고 있음을 보여줍니다. Ruby 3.4.0은 더욱 견고하고 효율적인 애플리케이션 개발을 위한 강력한 기반을 제공하며, 개발자들에게 더 나은 프로그래밍 경험을 선사할 것입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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