Ruby 4.0.0-preview3 출시

Ruby 4.0.0 Preview3 Released

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

핵심 요약

  • 1 Ruby 4.0.0-preview3가 출시되었으며, Ruby::BOX 및 ZJIT와 같은 주요 실험적 기능이 도입되었습니다.
  • 2 Ractor의 안정성과 성능이 크게 향상되었고, 새로운 동기화 메커니즘인 Ractor::Port가 추가되었습니다.
  • 3 Kernel, Binding, Set, String 등 핵심 클래스 및 표준 라이브러리에 다수의 기능 개선과 호환성 변경이 적용되었습니다.

도입

2025년 12월 18일, Ruby 4.0.0-preview3 버전이 공식적으로 발표되었습니다. 이번 프리뷰 릴리스는 Ruby 4.0의 핵심적인 변경사항을 미리 선보이며, 특히 새로운 개념인 Ruby::BOX와 실험적인 JIT 컴파일러인 ZJIT를 소개합니다. 또한 Ractor의 안정성과 성능 향상에 중점을 두었으며, 다양한 언어 기능, 코어 클래스 및 표준 라이브러리 업데이트를 포함하고 있습니다. 개발자들은 이 프리뷰 버전을 통해 Ruby의 다음 주요 버전에 대한 피드백을 제공할 수 있습니다.

Ruby 4.0.0-preview3 주요 변경사항

1. Ruby::BOX 도입

  • 정의에 대한 분리(separation about definitions)를 제공하는 새로운 실험적 기능입니다.

  • 자세한 내용은 doc/language/box.md를 참조할 수 있습니다.

  • [Feature #21311] [Misc #21385]

2. 언어 변경사항

  • *nil은 더 이상 nil.to_a를 호출하지 않으며, **nilnil.to_hash를 호출하지 않는 것과 유사합니다. [Feature #21047]

  • 줄 시작 부분의 논리 이항 연산자(||, &&, and, or)는 이전 줄을 이어받아 fluent dot처럼 작동합니다. [Feature #20925]

3. 코어 클래스 업데이트

  • Kernel: `Kernel

inspectinstance_variables_to_inspect` 메서드 존재 여부를 확인하여 인스턴스 변수 표시를 제어할 수 있게 되었습니다. [Feature #21219]

  • Binding: `Binding

local_variables에서 번호 매개변수가 제외되며, local_variable_getlocal_variable_set`도 이를 거부합니다. [Bug #21049]

  • IO: IO.select가 타임아웃 인수로 Float::INFINITY를 허용합니다. [Feature #20610]

  • Method, Proc, UnboundMethod: source_location[path, start_line, start_column, end_line, end_column]의 확장된 5요소 위치 정보를 반환합니다. [Feature #6012]

  • Ractor:

    • Ractor::Port 클래스가 Ractor 간 통신을 위한 새로운 동기화 메커니즘으로 추가되었습니다. [Feature #21262]
      • `Ractor::Port

receive, Ractor::Port

send (), Ractor::Port

close, Ractor::Port

closed?` 메서드를 제공합니다.

*   `Ractor

joinRactor

value`가 Ractor 종료 대기를 위해 추가되었습니다 (Thread의 유사 기능).

*   `Ractor.select`는 이제 Ractor와 Port만 허용합니다.
*   `Ractor

default_port`가 추가되었습니다.

*   `Ractor.shareable_proc` 및 `Ractor.shareable_lambda`가 공유 가능한 Proc/lambda 생성을 위해 도입되었습니다. [Feature #21550], [Feature #21557]
*   `Ractor.yield`, `Ractor

take, Ractor

close_incoming, Ractor

close_outgoing` 메서드가 제거되었습니다.

  • Range: `Range

to_setEnumerator

to_set`이 무한 범위를 방지하기 위한 크기 검사를 수행합니다. [Bug #21654]

  • Ruby: Ruby 관련 상수를 포함하는 최상위 모듈 Ruby가 정의되었습니다. [Feature #20884]

  • Set: 이제 Set은 autoloaded stdlib 클래스 대신 코어 클래스가 되었습니다. [Feature #21216]

    • `Set

inspectSet[] 구문을 사용하여 eval`에 적합한 문자열을 반환합니다. [Feature #21389]

  • String: Unicode 17.0.0 및 Emoji 17.0으로 업데이트되었습니다. [Feature #19908]
    • `String

strip 계열 메서드가 *selectors` 인수를 허용하도록 확장되었습니다. [Feature #21552]

  • Thread, Fiber: `Kernel

raise와 유사하게 raise(cause:)` 인수를 지원합니다. [Feature #21360]

  • Pathname: 기본 젬에서 Ruby의 코어 클래스로 승격되었습니다. [Feature #17473]

4. 표준 라이브러리(Stdlib) 업데이트

  • ostruct, pstore, benchmark, logger, rdoc, irb 등 다수의 번들 젬이 기본 젬에서 승격되거나 업데이트되었습니다.

  • CGI 라이브러리가 기본 젬에서 제거되었으며, cgi/escape만 일부 메서드를 제공합니다. [Feature #21258]

  • SortedSetSet이 코어 클래스로 이동함에 따라 더 이상 autoloaded 상수가 아니며, 별도 젬 설치가 필요합니다. [Feature #21287]

5. C API 업데이트

  • rb_thread_fd_close가 사용 중단(deprecated)되었으며, 이제 no-op입니다. [Feature #18455]

  • rb_thread_call_with_gvl은 GVL 유무와 관계없이 작동합니다. [Feature #20750]

  • Set을 위한 C API (rb_set_foreach, rb_set_new 등)가 추가되었습니다. [Feature #21459]

6. 구현 개선사항

  • Ractor: 안정성, 성능, 유용성 향상에 많은 노력이 투입되었습니다.
    • 성능: Frozen string 및 심볼 테이블의 락 프리 해시셋 사용, 메서드 캐시 룩업 시 락 회피, 인스턴스 변수 접근 속도 향상, 객체 할당 시 캐시 경합 회피 등.
    • 버그 수정 및 안정성: Ractor와 Thread 결합 시 교착 상태, Ractor 내 require/autoload 문제, 인코딩/트랜스코딩 문제, GC 작업 및 메서드 무효화 시 경합 조건, Ractor 시작 후 프로세스 포크 문제 등이 해결되었습니다.
  • JIT:
    • ZJIT: 실험적인 메서드 기반 JIT 컴파일러가 도입되었습니다. Rust 1.85.0 이상으로 빌드해야 하며, 현재 인터프리터보다 빠르지만 YJIT보다는 느립니다. Ruby 4.1에서는 YJIT보다 빠르고 프로덕션 준비가 완료되는 것을 목표로 합니다.
    • YJIT: RubyVM::YJIT.runtime_statsratio_in_yjit 기본 빌드에서 작동하지 않도록 변경되었고, invalidate_everything 통계가 추가되었습니다. mem_size:call_threshold: 옵션이 RubyVM::YJIT.enable에 추가되었습니다.
    • RJIT: 제거되었으며, 서드파티 JIT API 구현은 ruby/rjit 저장소로 이동될 예정입니다.

7. 호환성 문제

  • Ractor::Port 추가로 인해 Ractor.yield, `Ractor

take, Ractor

close_incoming, Ractor

close_outgoing` 메서드가 제거되었습니다. [Feature #21262]

  • ObjectSpace._id2ref가 사용 중단되었습니다. [Feature #15408]

  • `Process::Status

&Process::Status

»`가 제거되었습니다 (Ruby 3.3에서 사용 중단됨). [Bug #19868]

  • CGI 라이브러리 및 SortedSet의 표준 라이브러리에서의 제거.

결론

Ruby 4.0.0-preview3는 Ruby의 미래를 엿볼 수 있는 중요한 릴리스입니다. 특히 `Ruby::BOX`와 새로운 JIT 컴파일러 `ZJIT`의 도입은 언어의 확장성과 성능 향상에 대한 Ruby 커뮤니티의 지속적인 노력을 보여줍니다. 또한 `Ractor`의 대대적인 개선은 동시성 프로그래밍 환경을 더욱 안정적이고 효율적으로 만들 것입니다. 이 프리뷰 버전을 통해 총 3776개의 파일이 변경되었고, 222800개의 삽입 및 293617개의 삭제가 이루어졌다는 점은 Ruby 3.4.0 이후의 방대한 변화량을 시사합니다. 개발자들은 이 버전을 적극적으로 테스트하고 피드백을 제공하여 Ruby 4.0의 최종 릴리스에 기여할 수 있습니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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