Ruby 4.0.0-preview3 주요 변경사항
1. Ruby::BOX 도입
-
정의에 대한 분리(separation about definitions)를 제공하는 새로운 실험적 기능입니다.
-
자세한 내용은
doc/language/box.md를 참조할 수 있습니다. -
[Feature #21311] [Misc #21385]
2. 언어 변경사항
-
*nil은 더 이상nil.to_a를 호출하지 않으며,**nil이nil.to_hash를 호출하지 않는 것과 유사합니다. [Feature #21047] -
줄 시작 부분의 논리 이항 연산자(
||,&&,and,or)는 이전 줄을 이어받아 fluent dot처럼 작동합니다. [Feature #20925]
3. 코어 클래스 업데이트
- Kernel: `Kernel
inspect가 instance_variables_to_inspect` 메서드 존재 여부를 확인하여 인스턴스 변수 표시를 제어할 수 있게 되었습니다. [Feature #21219]
- Binding: `Binding
local_variables에서 번호 매개변수가 제외되며, local_variable_get 및 local_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
- Ractor::Port 클래스가 Ractor 간 통신을 위한 새로운 동기화 메커니즘으로 추가되었습니다. [Feature #21262]
receive, Ractor::Port
send (#«), Ractor::Port
close, Ractor::Port
closed?` 메서드를 제공합니다.
* `Ractor
join 및 Ractor
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_set 및 Enumerator
to_set`이 무한 범위를 방지하기 위한 크기 검사를 수행합니다. [Bug #21654]
-
Ruby: Ruby 관련 상수를 포함하는 최상위 모듈
Ruby가 정의되었습니다. [Feature #20884] -
Set: 이제
Set은 autoloaded stdlib 클래스 대신 코어 클래스가 되었습니다. [Feature #21216]- `Set
inspect는 Set[] 구문을 사용하여 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] -
SortedSet은Set이 코어 클래스로 이동함에 따라 더 이상 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_stats의ratio_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의 표준 라이브러리에서의 제거.