Ruby 4.0의 주요 변경 사항
1. Ruby::Box: 격리된 네임스페이스
-
개념: Ruby 프로세스 내에 격리된 네임스페이스 또는 ‘컨테이너’를 도입하는 실험적인 기능입니다.
-
기능: Box 내에서 로드되는 클래스, 모듈, 전역 변수, 상수, C 확장 등이 해당 Box에만 국한됩니다.
-
목표: 언어 수준에서의 경량 가상화를 제공하며, 스마트한 코드 로딩의 기반을 마련합니다.
-
주의사항: 실험적 기능으로 성능 오버헤드가 있으며, 기본적으로 비활성화되어 환경 변수를 통해 명시적으로 활성화해야 합니다.
2. ZJIT (새로운 JIT 컴파일러)
-
도입: Ruby 4.0에 YJIT의 후속으로 ZJIT라는 새로운 JIT 컴파일러가 추가되었습니다. YJIT와 병행 개발되며, 기존 YJIT 사용자는 전환할 필요가 없습니다.
-
YJIT 요약: Ruby 3.1에 Shopify가 개발하여 도입. ‘Lazy Basic Block Versioning’ 방식을 사용하여 런타임 타입에 따라 코드 블록을 컴파일합니다.
-
ZJIT의 차이점: 전통적인 메서드 기반 JIT 전략을 채택. SSA(Static Single Assignment) 중간 표현과 일반적인 컴파일러 파이프라인을 사용하여 더 큰 코드 단위를 컴파일합니다.
-
목표: Ruby의 장기적인 성능 한계를 높이고(YJIT보다 고급 최적화 가능), 커뮤니티가 JIT를 더 쉽게 이해하고 개선할 수 있도록 합니다.
-
활성화: Rust 1.85 이상으로 Ruby를 빌드한 후
--zjit플래그를 사용하여 활성화할 수 있습니다. 기본적으로는 비활성화되어 있습니다.
3. Ractors 개선
-
현황: Ruby 3.0에 도입된 실험적인 병렬 처리 기능으로, Ruby 4.0에서도 여전히 실험적이지만 주요 개선 및 API 변경이 이루어졌습니다.
-
API 변경: 기존의 메시지 송수신 API가
Ractor::Port메커니즘으로 대체되었습니다. 각 Ractor는 기본 포트를 가지며, 사용자 정의 포트 객체도 생성 가능합니다. -
파괴적 변경:
Ractor.yield와 `Ractor
take` 메서드가 제거되었습니다.
- 내부 개선: Ractor 간의 공유 상태를 줄여 성능과 안전성을 향상시켰으며, 멀티코어 시스템에서 CPU 캐시 활용을 개선했습니다.
4. 기타 주요 변경 사항
-
*nil스플랫 동작 변경: Ruby 4.0부터*nil은 더 이상nil.to_a를 호출하지 않으며, 빈 배열이 아닌 ‘스플랫할 내용 없음’으로 처리됩니다. 이는**nil이nil.to_hash를 호출하지 않는 것과 일관성을 맞춥니다. -
논리 연산자 줄 시작 허용:
&&,||,and,or를 줄의 시작 부분에 배치하여 이전 줄의 논리식을 이어갈 수 있게 되었습니다. -
코어 클래스 업데이트:
Set과Pathname클래스가 이제require없이 사용할 수 있는 코어 클래스로 승격되었습니다. -
Array메서드 개선: `Array
find의 성능이 향상되었으며, 조건에 맞는 마지막 요소를 찾는 Array
rfind` 메서드가 추가되었습니다.
5. Ruby 4.0으로의 업그레이드
-
사전 준비: 공식 릴리스 노트 확인, 기존 버전의 Deprecation 경고 처리, 충분한 테스트 코드 확보가 중요합니다.
-
단계별 진행: Bundler 업데이트 후
bundle install실행,rbenv또는asdf와 같은 버전 관리자를 사용하여 Ruby 4.0 설치 및 전환,Gemfile의 Ruby 버전 업데이트 후 다시bundle install실행, 마지막으로 모든 테스트를 실행하고 애플리케이션의 중요 경로를 확인합니다.