From 79b244d137d8c49c4d07322e3617baf5b781f913 Mon Sep 17 00:00:00 2001 From: Chayoung You Date: Tue, 20 Jan 2026 16:28:56 +0900 Subject: [PATCH] Update translation of Ruby 4.0.0 (ko) --- ...2025-12-18-ruby-4-0-0-preview3-released.md | 4 +- .../_posts/2025-12-25-ruby-4-0-0-released.md | 74 +++++++++---------- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md b/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md index fb8048a0c2..ee6074d1ca 100644 --- a/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md +++ b/ko/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md @@ -329,7 +329,7 @@ Ruby 4.0은 Ruby::Box와 "ZJIT"를 도입하고, 많은 개선을 추가합니 Ruby 3.3에서 폐기 예정 상태가 되었습니다. [[Bug #19868]] * `rb_path_check`가 제거되었습니다. 이 함수는 Ruby 2.7에서 제거된 - `$SAFE` 경로 검사에 사용되었었으며, + `$SAFE` 경로 검사에 사용되었으며, 이미 폐기 예정이었습니다. [[Feature #20971]] @@ -392,7 +392,7 @@ Ractor를 더 안정적이고, 성능이 좋고, 사용하기 쉽게 만들기 * 성능 개선 * 얼린 문자열과 심볼 테이블은 내부적으로 잠금 없는 해시 셋 사용 * 메서드 캐시 조회는 대부분의 경우 잠금을 회피 - * 클래스(및 geniv) 인스턴스 변수 접근이 더 빠르고 잠금을 회피 + * 클래스 및 geniv 인스턴스 변수 접근이 더 빠르고 잠금을 회피 * 객체 할당 중 캐시 경합을 회피 * `object_id`는 대부분의 경우 잠금을 회피 * 버그 수정 및 안정성 diff --git a/ko/news/_posts/2025-12-25-ruby-4-0-0-released.md b/ko/news/_posts/2025-12-25-ruby-4-0-0-released.md index 6447942c59..79c5d022a0 100644 --- a/ko/news/_posts/2025-12-25-ruby-4-0-0-released.md +++ b/ko/news/_posts/2025-12-25-ruby-4-0-0-released.md @@ -9,40 +9,40 @@ lang: ko {% assign release = site.data.releases | where: "version", "4.0.0" | first %} Ruby {{ release.version }} 릴리스를 알리게 되어 기쁩니다. -Ruby 4.0은 Ruby::Box와 "ZJIT"를 도입하고, 많은 개선을 추가합니다. +Ruby 4.0은 "Ruby Box"와 "ZJIT"를 도입하고, 많은 개선을 추가합니다. ## Ruby Box -정의에 대한 분리를 제공하는 새로운 (실험적) 기능입니다. Ruby Box는 환경 변수로 `RUBY_BOX=1`을 지정하여 활성화할 수 있습니다. 클래스 이름은 `Ruby::Box`입니다. +Ruby Box는 정의에 대한 분리를 제공하는 새로운 (실험적) 기능입니다. Ruby Box는 환경 변수로 `RUBY_BOX=1`을 지정하여 활성화할 수 있습니다. 클래스 이름은 `Ruby::Box`입니다. -Box 내에서 로드된 정의는 해당 Box 내에 격리된 상태가 됩니다. Ruby Box가 격리할 수 있는 정의로는 기존 클래스에 대한 몽키 패치, 전역 변수나 클래스 변수 조작, 클래스나 모듈 정의, 그리고 .rb 파일이나 확장 라이브러리로 구현된 라이브러리들이 있습니다. +Box 내에서 로드된 정의는 해당 Box 내에 격리된 상태가 됩니다. Ruby Box가 격리할 수 있는 정의로는 기존 클래스에 대한 몽키 패치, 전역 변수나 클래스 변수 조작, 클래스나 모듈 정의, 그리고 네이티브 라이브러리나 Ruby 라이브러리가 있습니다. -Ruby Box의 주요 유스케이스로는 다음과 같은 것들이 예상됩니다: +Ruby Box의 주요 사용 사례는 다음과 같은 것들이 예상됩니다. * 테스트를 위해 특정 동작을 덮어쓰는 몽키 패치가 필요한 테스트 케이스를 Box 내에서 격리하여 실행하는 것 -* 웹 애플리케이션을 Box 내에서 실행하여 Blue-Green 배포를 프로세스 내에서, 애플리케이션 서버 상에서 실행하는 것 -* 웹 애플리케이션을 Box 내에서 실행하여 의존성 업데이트 시 등에 일정 기간 병렬로 실행하고 Ruby 코드를 통해 응답 등을 검증하는 것 -* (아직 미설계인) "패키지 API"와 같은 새로운 고수준 API를 만들기 위한 저수준 API로서의 기능을 제공하는 것 +* Ruby 프로세스 내의 애플리케이션 서버 상에서 웹 애플리케이션 Box를 병렬적으로 실행하여 Blue-Green 배포를 실행하는 것 +* 의존성 업데이트 시 웹 애플리케이션 Box를 병렬적으로 실행하여 일정 기간 동안 Ruby 코드를 통해 응답 시간 차이를 확인하는 것 +* (아직 미설계인) "패키지" API와 같은 새로운 고수준 API를 만들기 위한 저수준 API로서의 기능을 제공하는 것 -"Ruby Box"의 자세한 내용은 다음 문서를 참조하세요: [Ruby::Box](https://docs.ruby-lang.org/en/master/Ruby/Box.html). +"Ruby Box"의 자세한 내용은 다음 문서를 참조하세요. [Ruby::Box](https://docs.ruby-lang.org/en/master/Ruby/Box.html). [[Feature #21311]] [[Misc #21385]] ## ZJIT -ZJIT는 YJIT의 차세대로 개발된 새로운 just-in-time(JIT) 컴파일러입니다. ZJIT 지원을 포함하여 Ruby를 빌드하려면 Rust 1.85.0 이상이 필요하며, --zjit를 지정하면 ZJIT가 활성화됩니다. +ZJIT는 차세대 YJIT으로 개발된 새로운 just-in-time(JIT) 컴파일러입니다. ZJIT 지원을 포함하여 Ruby를 빌드하려면 Rust 1.85.0 이상이 필요하며, `--zjit`를 지정하면 ZJIT가 활성화됩니다. -우리가 Ruby를 위한 새로운 컴파일러를 개발하는 이유는 성능 상한선을 높이고(더 큰 컴파일 단위 크기와 SSA IR을 도입), 더 일반적인 설계인 메서드 컴파일러로 만들어 외부의 기여를 촉진하고 싶기 때문입니다. 자세한 내용은 [블로그 게시물](https://railsatscale.com/2025-12-24-launch-zjit/)을 참조하세요. +우리가 Ruby를 위한 새로운 컴파일러를 개발하는 이유는 성능 상한선을 높이고(더 큰 컴파일 단위 크기와 SSA IR을 도입), 더 전통적인 메서드 컴파일러로 만들어 외부의 기여를 촉진하고 싶기 때문입니다. 자세한 내용은 [블로그 게시물](https://railsatscale.com/2025-12-24-launch-zjit/)을 참조하세요. -ZJIT는 일반적인 Ruby 인터프리터보다 빠르지만, 아직 YJIT만큼 빠르지는 않습니다. ZJIT를 꼭 시도해 보시길 바라지만, 현시점에서는 프로덕션 환경 배포는 삼가는 것이 좋을 수 있습니다. Ruby 4.1의 ZJIT를 기대해 주세요. +ZJIT는 Ruby 인터프리터보다 빠르지만, 아직 YJIT만큼 빠르지는 않습니다. ZJIT를 시도해 보길 권장하지만, 현시점에서는 프로덕션 환경 배포는 삼가는 것이 좋을 수 있습니다. Ruby 4.1의 ZJIT를 기대해 주세요. ## Ractor 개선 -Ruby에서 쉽게 병렬 처리를 수행하기 위한 Ractor에 많은 개선이 있었습니다. 먼저 `Ractor::Port`라는 클래스를 추가하여 메시지 송수신에 대한 문제를 해결했습니다([블로그 게시물](https://product.st.inc/entry/2025/06/24/110606)). 또한 `Ractor.shareable_proc`을 통해 Proc을 Ractor 간에 공유하기 쉽게 만들었습니다. +Ruby에서 쉽게 병렬 처리를 수행하기 위한 Ractor에 많은 개선이 있었습니다. 먼저 `Ractor::Port`라는 클래스를 추가하여 메시지 송수신에 대한 문제를 해결했습니다([블로그 게시물](https://dev.to/ko1/ractorport-revamping-the-ractor-api-98)을 참조하세요). 또한 `Ractor.shareable_proc`을 통해 Ractor 간에 `Proc` 객체를 공유하기 쉽게 만들었습니다. -성능 측면에서는 많은 데이터 구조를 개선하여 글로벌 락에 대한 경합이 크게 감소하고 병렬 처리 성능이 향상되었습니다. 또한 Ractor 간에 공유하는 데이터를 줄임으로써 병렬 실행 시 CPU 캐시 충돌을 줄였습니다. +성능 측면에서는 많은 내부 데이터 구조를 개선하여 전역 락에 대한 경합이 크게 감소하고 병렬 처리 성능이 향상되었습니다. 또한 Ractor 간에 공유하는 내부 데이터를 줄임으로써 병렬 실행 시 CPU 캐시 충돌을 줄였습니다. -Ruby 3.0에서 실험적 기능으로 도입되었지만, 내년쯤에는 실험적 상태를 해제하고 싶습니다. +Ractor는 Ruby 3.0에서 처음 실험적 기능으로 도입되었습니다. 내년에는 "실험적" 상태를 해제하려고 합니다. ## 언어 변경 @@ -84,13 +84,13 @@ Ruby 3.0에서 실험적 기능으로 도입되었지만, 내년쯤에는 실험 * `Enumerable#find`를 더 효율적으로 실행하는 `Array#find`가 추가되었습니다. [[Feature #21678]] * Binding - * `Binding#local_variables`는 더 이상 번호가 매겨진 매개변수를 포함하지 않습니다. 또한, `Binding#local_variable_get`과 `Binding#local_variable_set`은 번호가 매겨진 매개변수를 처리하지 않습니다. [[Bug #21049]] + * `Binding#local_variables`는 더 이상 번호가 매겨진 매개변수를 포함하지 않습니다. 또한, `Binding#local_variable_get`, `Binding#local_variable_set`, `Binding#local_variable_defined?`는 번호가 매겨진 매개변수를 처리하지 않습니다. [[Bug #21049]] * 번호 매개변수 및 "it" 매개변수에 액세스하기 위해 `Binding#implicit_parameters`, `Binding#implicit_parameter_get`, `Binding#implicit_parameter_defined?`가 추가되었습니다. [[Bug #21049]] * Enumerator - * `Enumerator.produce`는 이제 선택적 키워드 인자 `size`를 받습니다. 크기에는 정수, `Float::INFINITY`, 람다와 같은 호출 가능한 객체, 또는 알 수 없음을 나타내는 `nil`을 지정할 수 있습니다. 생략 시에는 `Float::INFINITY`입니다. + * `Enumerator.produce`는 이제 열거자의 크기를 지정하는 선택적 키워드 인자 `size`를 받습니다. 크기에는 정수, `Float::INFINITY`, 람다와 같은 호출 가능한 객체, 또는 알 수 없음을 나타내는 `nil`을 지정할 수 있습니다. 생략 시에는 `Float::INFINITY`가 기본 크기 값입니다. ```ruby # 무한 열거자 @@ -110,7 +110,7 @@ Ruby 3.0에서 실험적 기능으로 도입되었지만, 내년쯤에는 실험 * ErrorHighlight - * `ArgumentError`가 발생했을 때 메서드 호출 측(caller)과 메서드 정의 측(callee) 양쪽의 코드 스니펫을 표시합니다. [[Feature #21543]] + * ArgumentError가 발생했을 때 메서드 호출 측(caller)과 메서드 정의 측(callee) 양쪽의 코드 조각을 표시합니다. [[Feature #21543]] ``` test.rb:1:in 'Object#add': wrong number of arguments (given 1, expected 2) (ArgumentError) @@ -132,7 +132,7 @@ Ruby 3.0에서 실험적 기능으로 도입되었지만, 내년쯤에는 실험 * 주어진 예외로 fiber를 인터럽트하기 위한 `Fiber::Scheduler#fiber_interrupt`가 도입되었습니다. 초기 사용 사례는 IO 작업이 닫힐 때 블로킹 IO 작업을 기다리는 fiber를 인터럽트하는 것입니다. [[Feature #21166]] - * 시그널 예외가 무효일 때도 스케줄러가 처리를 계속할 수 있도록 `Fiber::Scheduler#yield`가 추가되었습니다. [[Bug #21633]] + * 시그널 예외가 비활성화되어 있어도 스케줄러가 처리를 계속할 수 있도록 `Fiber::Scheduler#yield`가 추가되었습니다. [[Bug #21633]] * 비동기 `IO#close`용 `Fiber::Scheduler#io_close` 훅이 재도입되었습니다. @@ -219,11 +219,11 @@ Ruby 3.0에서 실험적 기능으로 도입되었지만, 내년쯤에는 실험 * `Ractor#close_incoming`과 `Ractor#close_outgoing`이 제거되었습니다. - * 공유 가능한 Proc 또는 lambda를 만들기 위해 `Ractor.shareable_proc`과 `Ractor.shareable_lambda`가 도입되었습니다. [[Feature #21550]] [[Feature #21557]] + * 공유 가능한 Proc 또는 람다를 만들기 위해 `Ractor.shareable_proc`과 `Ractor.shareable_lambda`가 도입되었습니다. [[Feature #21550]] [[Feature #21557]] * Range - * `Range#to_set`과 `Enumerator#to_set`은 이제 끝이 없는 범위 문제를 방지하기 위해 크기 검사를 수행합니다. [[Bug #21654]] + * `Range#to_set`은 이제 끝이 없는 범위 문제를 방지하기 위해 크기 검사를 수행합니다. [[Bug #21654]] * `Range#overlap?`은 이제 무한한(경계가 없는) 범위를 올바르게 처리합니다. [[Bug #21185]] @@ -241,14 +241,14 @@ Ruby 3.0에서 실험적 기능으로 도입되었지만, 내년쯤에는 실험 * `Set`은 이제 코어 클래스이며, 더 이상 자동 로드되는 표준 라이브러리 클래스가 아닙니다. [[Feature #21216]] - * `Set#inspect`은 이제 `Set[]` 구문을 사용하여 `eval`에 적합한 문자열을 반환합니다 (예: `#` 대신 `Set[1, 2, 3]`). 이는 Array, Hash와 같은 다른 코어 컬렉션 클래스와 일관성을 유지합니다. [[Feature #21389]] + * `Set#inspect`은 이제 배열 리터럴과 비슷하게 간결한 출력을 사용합니다(예: `#` 대신 `Set[1, 2, 3]`). [[Feature #21389]] * `Set#to_set`과 `Enumerable#to_set`에 인자를 전달하는 것은 폐기 예정 상태가 되었습니다. [[Feature #21390]] * Socket * `Socket.tcp`와 `TCPSocket.new`는 초기 연결에 대한 타임아웃을 지정하기 위해 `open_timeout` 키워드 인자를 허용합니다. [[Feature #21347]] - * `TCPSocket.new`에서 사용자 지정 타임아웃이 발생한 경우, 상황에 따라 `Errno::ETIMEDOUT` 또는 `IO::TimeoutError`가 발생할 수 있었지만, 이제는 일관되게 `IO::TimeoutError`를 발생시킵니다(단, `Socket.tcp`에서는 유사한 상황에서 `Errno::ETIMEDOUT`이 될 수 있으며, OS 레벨의 타임아웃에서는 어느 경우든 `Errno::ETIMEDOUT`이 발생할 수 있습니다). + * `TCPSocket.new`에서 사용자 지정 타임아웃이 발생한 경우, 상황에 따라 `Errno::ETIMEDOUT` 또는 `IO::TimeoutError`가 발생할 수 있었지만, 이제는 일관되게 `IO::TimeoutError`를 발생시킵니다(단, `Socket.tcp`에서는 유사한 상황에서 `Errno::ETIMEDOUT`이 될 수 있으며, OS 수준의 타임아웃에서는 어느 경우든 `Errno::ETIMEDOUT`이 발생할 수 있습니다). * String @@ -260,11 +260,11 @@ Ruby 3.0에서 실험적 기능으로 도입되었지만, 내년쯤에는 실험 * `Kernel#raise`와 유사한 `Thread#raise(cause:)` 인자 지원이 도입되었습니다. [[Feature #21360]] -## Stdlib 변경 +## 표준 라이브러리 변경 주목할 만한 기능 변경인 표준 라이브러리 변경만을 나열합니다. -다른 변경 사항은 아래 섹션에 나열되어 있습니다. Ruby 3.4.0 이후 번들된 버전의 릴리스 히스토리가 GitHub 릴리스에 있는 경우 함께 나열했습니다. +다른 변경 사항은 아래 섹션에 나열되어 있습니다. Ruby 3.4.0에 번들된 버전 이후의 릴리스 내역이 GitHub 릴리스에 있는 경우 함께 나열했습니다. 다음 번들 gem이 기본 gem에서 승격되었습니다. @@ -390,10 +390,9 @@ Ruby 3.0에서 실험적 기능으로 도입되었지만, 내년쯤에는 실험 * 3.3.2 to [v3.3.3][csv-v3.3.3], [v3.3.4][csv-v3.3.4], [v3.3.5][csv-v3.3.5] * repl_type_completor 0.1.12 - ### RubyGems와 Bundler -RubyGems와 Bundler는 Version 4가 동봉되어 있습니다. 자세한 내용은 다음 링크를 참조하세요. +Ruby 4.0에는 RubyGems와 Bundler 4가 동봉되어 있습니다. 자세한 내용은 다음 링크를 참조하세요. * [Upgrading to RubyGems/Bundler 4 - RubyGems Blog](https://blog.rubygems.org/2025/12/03/upgrade-to-rubygems-bundler-4.html) * [4.0.0 Released - RubyGems Blog](https://blog.rubygems.org/2025/12/03/4.0.0-released.html) @@ -422,11 +421,11 @@ RubyGems와 Bundler는 Version 4가 동봉되어 있습니다. 자세한 내용 * `Process::Status#&`와 `Process::Status#>>`가 제거되었습니다. Ruby 3.3에서 폐기 예정 상태가 되었습니다. [[Bug #19868]] -* `rb_path_check`가 제거되었습니다. 이 함수는 Ruby 2.7에서 제거된 `$SAFE` 경로 검사에 사용되었었으며, 이미 폐기 예정이었습니다. [[Feature #20971]] +* `rb_path_check`가 제거되었습니다. 이 함수는 Ruby 2.7에서 제거된 `$SAFE` 경로 검사에 사용되었으며, 이미 폐기 예정이었습니다. [[Feature #20971]] -* "wrong number of arguments"의 `ArgumentError` 백트레이스에 수신자의 클래스/모듈명이 포함됩니다(예: `bar`가 아닌 `Foo#bar`). [[Bug #21698]] +* "wrong number of arguments"의 `ArgumentError` 백트레이스에 수신자의 클래스/모듈 이름이 포함됩니다(예: `bar`가 아닌 `Foo#bar`). [[Bug #21698]] -* 백트레이스에 `internal` 프레임이 표시되지 않습니다. C 구현 메서드도 다른 C 구현과 마찬가지로 Ruby 소스 파일 상에 있는 것처럼 표시됩니다. [[Bug #20968]] +* 백트레이스에 `internal` 프레임이 표시되지 않습니다. 이 메서드도 다른 C 구현 메서드와 마찬가지로 Ruby 소스 파일 상에 있는 것처럼 표시됩니다. [[Bug #20968]] 변경 전: ``` @@ -459,10 +458,9 @@ RubyGems와 Bundler는 Version 4가 동봉되어 있습니다. 자세한 내용 * `Set`이 표준 라이브러리에서 코어 클래스로 이동함에 따라, `set/sorted_set.rb`가 제거되었고, `SortedSet`은 더 이상 자동 로드되는 상수가 아닙니다. `SortedSet`을 사용하려면 `sorted_set` gem을 설치하고 `require 'sorted_set'`을 통해 이용해주세요. [[Feature #21287]] - * Net::HTTP - * 본문(body)을 가진 요청(예: POST, PUT)에서 Content-Type 헤더가 명시적으로 설정되지 않은 경우 기본적으로 application/x-www-form-urlencoded를 자동 설정하는 동작이 제거되었습니다. 애플리케이션이 이 자동 설정에 의존하고 있었다면, 이제 Content-Type 헤더 없이 요청이 전송되며 특정 서버와의 호환성이 손실될 수 있습니다. [[GH-net-http #205]] + * 본문(body)을 가진 요청(예: `POST`, `PUT`)에서 `Content-Type` 헤더가 명시적으로 설정되지 않은 경우 기본적으로 `application/x-www-form-urlencoded`를 자동 설정하는 동작이 제거되었습니다. 애플리케이션이 이 자동 설정에 의존하고 있었다면, 이제 Content-Type 헤더 없이 요청이 전송되며 특정 서버와의 호환성이 손실될 수 있습니다. [[GH-net-http #205]] ## C API 변경 @@ -489,12 +487,12 @@ RubyGems와 Bundler는 Version 4가 동봉되어 있습니다. 자세한 내용 ## 구현 개선 -* `Class#new`(예: `Object.new`)가 전반적으로 고속화되었으며, 특히 키워드 인수를 전달할 때 효과적입니다. YJIT와 ZJIT에도 적용됩니다. [[Feature #21254]] -* 크기 풀이 다른 GC 힙을 독립적으로 성장시켜, 일부 풀에만 장수명 객체가 있는 경우 메모리 사용량을 줄입니다. +* `Class#new`(예: `Object.new`)가 전반적으로 고속화되었으며, 특히 키워드 인수를 전달할 때가 개선되었습니다. YJIT와 ZJIT에도 적용됩니다. [[Feature #21254]] +* 크기 풀이 다른 GC 힙을 독립적으로 성장시켜, 일부 풀에만 수명이 긴 객체가 있는 경우 메모리 사용량을 줄입니다. * 큰 객체 페이지에서의 GC 스윕이 고속화되었습니다. * "Generic ivar" 객체(String, Array, `TypedData` 등)는 새로운 내부 "fields" 객체를 사용하여 인스턴스 변수 액세스를 고속화합니다. * GC는 내부 `id2ref` 테이블을 첫 사용 시까지 보유하지 않도록 하여 `object_id` 할당과 GC 스윕을 고속화합니다. -* Class / Module 객체에서의 `object_id`와 `hash`가 고속화되었습니다. +* Class와 Module 객체에서의 `object_id`와 `hash`가 고속화되었습니다. * 더 큰 Bignum 정수도 가변 폭 할당을 통해 임베디드 상태로 유지할 수 있게 되었습니다. * `Random`, `Enumerator::Product`, `Enumerator::Chain`, `Addrinfo`, `StringScanner` 및 일부 내부 객체가 쓰기 배리어로 보호되어 GC 오버헤드를 줄입니다. @@ -505,7 +503,7 @@ Ractor를 더 안정적이고, 성능이 좋고, 사용하기 쉽게 만들기 * 성능 개선 * 얼린 문자열과 심볼 테이블은 내부적으로 잠금 없는 해시 셋 사용 [[Feature #21268]] * 메서드 캐시 조회는 대부분의 경우 잠금을 회피 - * 클래스(및 geniv) 인스턴스 변수 접근이 더 빠르고 잠금을 회피 + * 클래스 및 generic ivar 인스턴스 변수 접근이 더 빠르고 잠금을 회피 * Ractor별 카운터를 사용하여 객체 할당 중 CPU 캐시 경합을 회피 * 스레드 로컬 카운터를 사용하여 xmalloc/xfree에서 CPU 캐시 경합을 회피 * `object_id`는 대부분의 경우 잠금을 회피 @@ -521,8 +519,8 @@ Ractor를 더 안정적이고, 성능이 좋고, 사용하기 쉽게 만들기 ## JIT * ZJIT - * [실험적 메서드 기반 JIT 컴파일러](https://docs.ruby-lang.org/en/master/jit/zjit_md.html)가 도입되었습니다. `--zjit` 지원을 활성화하려면 Rust 1.85.0 이상으로 Ruby를 빌드하세요. - * Ruby 4.0.0 기준, ZJIT는 인터프리터보다 빠르지만 아직 YJIT만큼 빠르지는 않습니다. ZJIT 실험을 권장하지만, 아직 프로덕션 배포는 권장하지 않습니다. + * [실험적 메서드 기반 JIT 컴파일러](https://docs.ruby-lang.org/en/master/jit/zjit_md.html)가 도입되었습니다. ZJIT는 런타임에서 `--zjit` 옵션을 지정하거나 `RubyVM::ZJIT.enable`을 호출해 활성화할 수 있습니다. ZJIT 지원을 포함하여 Ruby를 빌드하려면 Rust 1.85.0 이상이 필요합니다. + * Ruby 4.0.0 기준, ZJIT는 인터프리터보다 빠르지만 아직 YJIT만큼 빠르지는 않습니다. ZJIT를 시도해 보길 권장하지만, 아직 프로덕션 배포는 권장하지 않습니다. * Ruby 4.1에서 ZJIT를 YJIT보다 빠르게 만들고 프로덕션에 사용할 수 있게 만드는 것이 목표입니다. * YJIT * `RubyVM::YJIT.runtime_stats` @@ -540,7 +538,7 @@ Ractor를 더 안정적이고, 성능이 좋고, 사용하기 쉽게 만들기 이러한 변경사항에 따라, Ruby 3.4.0 이후로 [파일 {{ release.stats.files_changed }}개 변경, {{ release.stats.insertions }}줄 추가(+), {{ release.stats.deletions }}줄 삭제(-)](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}#file_bucket)가 이루어졌습니다! -메리 크리스마스, 새해 복 많이 받으시고, Happy Hacking with Ruby 4.0! +메리 크리스마스, 새해 복 많이 받으시고, Ruby 4.0과 함께 즐거운 해킹 되세요! ## 다운로드