Phát hành Ruby 4.0.0
Đăng bởi naruse vào 25 Dec 2025
Dịch bởi Ngọc Lê
Chúng tôi vui mừng thông báo phát hành Ruby 4.0.0. Ruby 4.0 giới thiệu “Ruby Box” và “ZJIT”, cùng nhiều cải tiến khác.
Ruby Box
Ruby Box là một tính năng mới (thử nghiệm) cung cấp sự phân tách về các định nghĩa. Ruby Box được kích hoạt khi biến môi trường RUBY_BOX=1 được chỉ định. Lớp là Ruby::Box.
Các định nghĩa được tải trong một box được cô lập trong box đó. Ruby Box có thể cô lập/phân tách monkey patch, thay đổi biến toàn cục/biến lớp, định nghĩa lớp/module, và các thư viện native/ruby đã tải từ các box khác.
Các trường hợp sử dụng dự kiến là:
- Chạy các test case trong box để bảo vệ các test khác khi test case sử dụng monkey patch để ghi đè thứ gì đó
- Chạy các box ứng dụng web song song để thực hiện blue-green deployment trên app server trong một tiến trình Ruby
- Chạy các box ứng dụng web song song để đánh giá cập nhật dependency trong một khoảng thời gian nhất định bằng cách kiểm tra khác biệt response sử dụng mã Ruby
- Sử dụng làm API nền tảng (cấp thấp) để triển khai loại API “package” (cấp cao) (chưa được thiết kế)
Để biết chi tiết về “Ruby Box”, xem Ruby::Box. [Feature #21311] [Misc #21385]
ZJIT
ZJIT là trình biên dịch just-in-time (JIT) mới, được phát triển như thế hệ tiếp theo của YJIT. Bạn cần Rust 1.85.0 hoặc mới hơn để biên dịch Ruby với hỗ trợ ZJIT, và ZJIT được kích hoạt khi --zjit được chỉ định.
Chúng tôi đang xây dựng trình biên dịch mới cho Ruby vì chúng tôi muốn vừa nâng cao trần hiệu suất (kích thước đơn vị biên dịch lớn hơn và SSA IR) vừa khuyến khích nhiều đóng góp từ bên ngoài hơn (bằng cách trở thành trình biên dịch phương thức truyền thống hơn). Xem bài blog của chúng tôi để biết thêm chi tiết.
ZJIT nhanh hơn trình thông dịch, nhưng chưa nhanh bằng YJIT. Chúng tôi khuyến khích bạn thử nghiệm với ZJIT, nhưng có thể nên tạm hoãn triển khai trong môi trường production bây giờ. Hãy chờ ZJIT trong Ruby 4.1.
Cải tiến Ractor
Ractor, cơ chế thực thi song song của Ruby, đã nhận được nhiều cải tiến. Lớp mới Ractor::Port được giới thiệu để giải quyết các vấn đề liên quan đến gửi và nhận tin nhắn (xem bài blog của chúng tôi). Ngoài ra, Ractor.shareable_proc giúp chia sẻ đối tượng Proc giữa các Ractor dễ dàng hơn.
Về mặt hiệu suất, nhiều cấu trúc dữ liệu nội bộ đã được cải thiện để giảm đáng kể tranh chấp trên khóa toàn cục, mở khóa khả năng song song tốt hơn. Các Ractor cũng giờ chia sẻ ít dữ liệu nội bộ hơn, dẫn đến ít tranh chấp bộ nhớ đệm CPU hơn khi chạy song song.
Ractor được giới thiệu lần đầu trong Ruby 3.0 như một tính năng thử nghiệm. Chúng tôi nhắm đến việc loại bỏ trạng thái “thử nghiệm” của nó vào năm tới.
Thay đổi ngôn ngữ
-
*nilkhông còn gọinil.to_a, tương tự như cách**nilkhông gọinil.to_hash. [Feature #21047] -
Các toán tử nhị phân logic (
||,&&,andvàor) ở đầu dòng tiếp tục dòng trước đó, giống như dấu chấm fluent. Các ví dụ mã sau là tương đương:if condition1 && condition2 ... endTrước đây:
if condition1 && condition2 ... endif condition1 && condition2 ... end
Cập nhật các lớp lõi
Lưu ý: Chúng tôi chỉ liệt kê các cập nhật lớp đáng chú ý.
-
Array
Array#rfindđược thêm vào như một thay thế hiệu quả hơn choarray.reverse_each.find[Feature #21678]Array#findđược thêm vào như một override hiệu quả hơn củaEnumerable#find[Feature #21678]
-
Binding
-
Binding#local_variableskhông còn bao gồm các tham số được đánh số. Ngoài ra,Binding#local_variable_get,Binding#local_variable_set, vàBinding#local_variable_defined?từ chối xử lý các tham số được đánh số. [Bug #21049] -
Binding#implicit_parameters,Binding#implicit_parameter_get, vàBinding#implicit_parameter_defined?được thêm vào để truy cập các tham số được đánh số và tham số “it”. [Bug #21049]
-
-
Enumerator
-
Enumerator.producegiờ chấp nhận đối số từ khóasizetùy chọn để chỉ định kích thước của enumerator. Nó có thể là một số nguyên,Float::INFINITY, một đối tượng callable (như lambda), hoặcnilđể biểu thị kích thước không xác định. Khi không được chỉ định, kích thước mặc định làFloat::INFINITY.# Enumerator vô hạn enum = Enumerator.produce(1, size: Float::INFINITY, &:succ) enum.size # => Float::INFINITY # Enumerator hữu hạn với kích thước đã biết/có thể tính abs_dir = File.expand_path("./baz") # => "/foo/bar/baz" traverser = Enumerator.produce(abs_dir, size: -> { abs_dir.count("/") + 1 }) { raise StopIteration if it == "/" File.dirname(it) } traverser.size # => 4
-
-
ErrorHighlight
-
Khi một ArgumentError được raise, giờ nó hiển thị các đoạn mã cho cả lời gọi phương thức (caller) và định nghĩa phương thức (callee). [Feature #21543]
test.rb:1:in 'Object#add': wrong number of arguments (given 1, expected 2) (ArgumentError) caller: test.rb:3 | add(1) ^^^ callee: test.rb:1 | def add(x, y) = x + y ^^^ from test.rb:3:in '<main>'
-
-
Fiber
- Giới thiệu hỗ trợ cho đối số
Fiber#raise(cause:)tương tựKernel#raise. [Feature #21360]
- Giới thiệu hỗ trợ cho đối số
-
Fiber::Scheduler
-
Giới thiệu
Fiber::Scheduler#fiber_interruptđể ngắt một fiber với ngoại lệ cho trước. Trường hợp sử dụng ban đầu là ngắt một fiber đang chờ trên thao tác IO blocking khi thao tác IO bị đóng. [Feature #21166] -
Giới thiệu
Fiber::Scheduler#yieldđể cho phép fiber scheduler tiếp tục xử lý khi signal exception bị vô hiệu hóa. [Bug #21633] -
Giới thiệu lại hook
Fiber::Scheduler#io_closechoIO#closebất đồng bộ. -
Gọi
Fiber::Scheduler#io_writekhi flush bộ đệm ghi IO. [Bug #21789]
-
-
File
File::Stat#birthtimegiờ khả dụng trên Linux thông qua lệnh hệ thống statx khi được hỗ trợ bởi kernel và hệ thống tệp. [Feature #21205]
-
IO
-
IO.selectchấp nhậnFloat::INFINITYlàm đối số timeout. [Feature #20610] -
Hành vi đã bị deprecated, tạo tiến trình bằng các phương thức lớp
IOvới ký tự|ở đầu, đã bị loại bỏ. [Feature #19630]
-
-
Kernel
-
Kernel#inspectgiờ kiểm tra sự tồn tại của phương thức#instance_variables_to_inspect, cho phép kiểm soát các biến instance nào được hiển thị trong chuỗi#inspect:class DatabaseConfig def initialize(host, user, password) @host = host @user = user @password = password end private def instance_variables_to_inspect = [:@host, :@user] end conf = DatabaseConfig.new("localhost", "root", "hunter2") conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root"> -
Hành vi đã bị deprecated, tạo tiến trình bằng
Kernel#openvới ký tự|ở đầu, đã bị loại bỏ. [Feature #19630]
-
-
Math
Math.log1pvàMath.expm1được thêm vào. [Feature #21527]
-
Pathname
- Pathname đã được thăng cấp từ gem mặc định thành lớp lõi của Ruby. [Feature #17473]
-
Proc
Proc#parametersgiờ hiển thị các tham số tùy chọn ẩn danh là[:opt]thay vì[:opt, nil], làm cho đầu ra nhất quán với khi tham số ẩn danh là bắt buộc. [Bug #20974]
-
Ractor
-
Lớp
Ractor::Portđược thêm vào như cơ chế đồng bộ mới để giao tiếp giữa các Ractor. [Feature #21262]port1 = Ractor::Port.new port2 = Ractor::Port.new Ractor.new port1, port2 do |port1, port2| port1 << 1 port2 << 11 port1 << 2 port2 << 12 end 2.times{ p port1.receive } #=> 1, 2 2.times{ p port2.receive } #=> 11, 12Ractor::Portcung cấp các phương thức sau:Ractor::Port#receiveRactor::Port#send(hoặcRactor::Port#<<)Ractor::Port#closeRactor::Port#closed?
Kết quả là,
Ractor.yieldvàRactor#takeđã bị loại bỏ. -
Ractor#joinvàRactor#valueđược thêm vào để chờ kết thúc của một Ractor. Chúng tương tự nhưThread#joinvàThread#value. -
Ractor#monitorvàRactor#unmonitorđược thêm vào như các giao diện cấp thấp được sử dụng nội bộ để triển khaiRactor#join. -
Ractor.selectgiờ chỉ chấp nhận Ractor và Port. Nếu Ractor được truyền vào, nó trả về khi một Ractor kết thúc. -
Ractor#default_portđược thêm vào. MỗiRactorcó một port mặc định, được sử dụng bởiRactor.send,Ractor.receive. -
Ractor#close_incomingvàRactor#close_outgoingđã bị loại bỏ. -
Ractor.shareable_procvàRactor.shareable_lambdađược giới thiệu để tạo Proc hoặc lambda có thể chia sẻ. [Feature #21550], [Feature #21557]
-
-
Range
-
Range#to_setgiờ thực hiện kiểm tra kích thước để ngăn các vấn đề với range vô tận. [Bug #21654] -
Range#overlap?giờ xử lý đúng các range vô hạn (không có giới hạn). [Bug #21185] -
Hành vi
Range#maxtrên các range số nguyên không có điểm bắt đầu đã được sửa. [Bug #21174] [Bug #21175]
-
-
Ruby
- Module cấp cao nhất
Rubymới đã được định nghĩa, chứa các hằng số liên quan đến Ruby. Module này được dành riêng trong Ruby 3.4 và giờ được định nghĩa chính thức. [Feature #20884]
- Module cấp cao nhất
-
Ruby::Box
- Một tính năng mới (thử nghiệm) cung cấp sự phân tách về các định nghĩa. Để biết chi tiết về “Ruby Box”, xem doc/language/box.md. [Feature #21311] [Misc #21385]
-
Set
-
Setgiờ là một lớp lõi, thay vì một lớp stdlib được tải tự động. [Feature #21216] -
Set#inspectgiờ sử dụng hiển thị đơn giản hơn, tương tự như mảng literal. (ví dụ,Set[1, 2, 3]thay vì#<Set: {1, 2, 3}>). [Feature #21389] -
Truyền đối số cho
Set#to_setvàEnumerable#to_setgiờ đã bị deprecated. [Feature #21390]
-
-
Socket
Socket.tcp&TCPSocket.newchấp nhận đối số từ khóaopen_timeoutđể chỉ định timeout cho kết nối ban đầu. [Feature #21347]- Khi timeout do người dùng chỉ định xảy ra trong
TCPSocket.new, trước đây có thể raiseErrno::ETIMEDOUThoặcIO::TimeoutErrortùy thuộc vào tình huống. Hành vi này đã được thống nhất đểIO::TimeoutErrorgiờ được raise nhất quán. (Xin lưu ý rằng, trongSocket.tcp, vẫn có các trường hợpErrno::ETIMEDOUTcó thể được raise trong các tình huống tương tự, và trong cả hai trường hợpErrno::ETIMEDOUTcó thể được raise khi timeout xảy ra ở cấp hệ điều hành.)
-
String
-
Cập nhật Unicode lên Phiên bản 17.0.0 và Emoji Phiên bản 17.0. [Feature #19908][Feature #20724][Feature #21275] (cũng áp dụng cho Regexp)
-
String#strip,strip!,lstrip,lstrip!,rstrip, vàrstrip!được mở rộng để chấp nhận đối số*selectors. [Feature #21552]
-
-
Thread
- Giới thiệu hỗ trợ cho đối số
Thread#raise(cause:)tương tựKernel#raise. [Feature #21360]
- Giới thiệu hỗ trợ cho đối số
Cập nhật thư viện chuẩn
Chúng tôi chỉ liệt kê các thay đổi stdlib là các thay đổi tính năng đáng chú ý.
Các thay đổi khác được liệt kê trong các phần sau. Chúng tôi cũng liệt kê lịch sử phát hành từ phiên bản bundled trước đó là Ruby 3.4.0 nếu có GitHub releases.
Các bundled gem sau được thăng cấp từ default gem.
- ostruct 0.6.3
- pstore 0.2.0
- 0.1.4 to v0.2.0
- benchmark 0.5.0
- logger 1.7.0
- rdoc 7.0.2
- win32ole 1.9.2
- 1.9.1 to v1.9.2
- irb 1.16.0
- reline 0.6.3
- readline 0.0.4
- fiddle 1.1.8
Default gem sau được thêm vào.
- win32-registry 0.1.2
Các default gem sau được cập nhật.
- RubyGems 4.0.3
- bundler 4.0.3
- date 3.5.1
- delegate 0.6.1
- digest 3.2.1
- 3.2.0 to v3.2.1
- english 0.8.1
- 0.8.0 to v0.8.1
- erb 6.0.1
- error_highlight 0.7.1
- etc 1.4.6
- fcntl 1.3.0
- 1.2.0 to v1.3.0
- fileutils 1.8.0
- 1.7.3 to v1.8.0
- forwardable 1.4.0
- 1.3.3 to v1.4.0
- io-console 0.8.2
- 0.8.1 to v0.8.2
- io-nonblock 0.3.2
- io-wait 0.4.0
- 0.3.2 to v0.3.3, v0.3.5.test1, v0.3.5, v0.3.6, v0.4.0
- ipaddr 1.2.8
- json 2.18.0
- net-http 0.9.1
- openssl 4.0.0
- optparse 0.8.1
- pp 0.6.3
- 0.6.2 to v0.6.3
- prism 1.7.0
- psych 5.3.1
- resolv 0.7.0
- stringio 3.2.0
- strscan 3.1.6
- time 0.4.2
- 0.4.1 to v0.4.2
- timeout 0.6.0
- uri 1.1.1
- weakref 0.1.4
- 0.1.3 to v0.1.4
- zlib 3.2.2
- 3.2.1 to v3.2.2
Các bundled gem sau được cập nhật.
- minitest 6.0.0
- power_assert 3.0.1
- rake 13.3.1
- test-unit 3.7.5
- rexml 3.4.4
- rss 0.3.2
- 0.3.1 to 0.3.2
- net-ftp 0.3.9
- 0.3.8 to v0.3.9
- net-imap 0.6.2
- net-smtp 0.5.1
- 0.5.0 to v0.5.1
- matrix 0.4.3
- 0.4.2 to v0.4.3
- prime 0.1.4
- 0.1.3 to v0.1.4
- rbs 3.10.0
- 3.8.0 to v3.8.1, v3.9.0.dev.1, v3.9.0.pre.1, v3.9.0.pre.2, v3.9.0, v3.9.1, v3.9.2, v3.9.3, v3.9.4, v3.9.5, v3.10.0.pre.1, v3.10.0.pre.2, v3.10.0
- typeprof 0.31.1
- debug 1.11.1
- 1.11.0 to v1.11.1
- base64 0.3.0
- 0.2.0 to v0.3.0
- bigdecimal 4.0.1
- drb 2.2.3
- 2.2.1 to v2.2.3
- syslog 0.3.0
- 0.2.0 to v0.3.0
- csv 3.3.5
- repl_type_completor 0.1.12
RubyGems và Bundler
Ruby 4.0 đóng gói RubyGems và Bundler phiên bản 4. Xem các liên kết sau để biết chi tiết.
- Upgrading to RubyGems/Bundler 4 - RubyGems Blog
- 4.0.0 Released - RubyGems Blog
- 4.0.1 Released - RubyGems Blog
- 4.0.2 Released - RubyGems Blog
- 4.0.3 Released - RubyGems Blog
Nền tảng được hỗ trợ
-
Windows
- Ngừng hỗ trợ các phiên bản MSVC cũ hơn 14.0 (_MSC_VER 1900). Điều này có nghĩa là giờ cần Visual Studio 2015 hoặc mới hơn.
Vấn đề tương thích
-
Các phương thức sau đã bị loại bỏ khỏi Ractor do việc thêm
Ractor::Port:Ractor.yieldRactor#takeRactor#close_incomingRactor#close_outgoing
-
ObjectSpace._id2refđã bị deprecated. [Feature #15408] -
Process::Status#&vàProcess::Status#>>đã bị loại bỏ. Chúng đã bị deprecated trong Ruby 3.3. [Bug #19868] -
rb_path_checkđã bị loại bỏ. Hàm này được sử dụng cho kiểm tra đường dẫn$SAFEđã bị loại bỏ trong Ruby 2.7, và đã bị deprecated. [Feature #20971] -
Backtrace cho
ArgumentErrorcủa “wrong number of arguments” giờ bao gồm tên lớp hoặc module của receiver (ví dụ, trongFoo#barthay vì trongbar). [Bug #21698] -
Backtrace không còn hiển thị các frame
internal. Các phương thức này giờ xuất hiện như thể nằm trong tệp mã Ruby, nhất quán với các phương thức được triển khai bằng C khác. [Bug #20968]Trước:
ruby -e '[1].fetch_values(42)' <internal:array>:211:in 'Array#fetch': index 42 outside of array bounds: -1...1 (IndexError) from <internal:array>:211:in 'block in Array#fetch_values' from <internal:array>:211:in 'Array#map!' from <internal:array>:211:in 'Array#fetch_values' from -e:1:in '<main>'Sau:
$ ruby -e '[1].fetch_values(42)' -e:1:in 'Array#fetch_values': index 42 outside of array bounds: -1...1 (IndexError) from -e:1:in '<main>'
Vấn đề tương thích thư viện chuẩn
-
Thư viện CGI đã bị loại bỏ khỏi default gem. Giờ chúng tôi chỉ cung cấp
cgi/escapecho các phương thức sau:CGI.escapevàCGI.unescapeCGI.escapeHTMLvàCGI.unescapeHTMLCGI.escapeURIComponentvàCGI.unescapeURIComponentCGI.escapeElementvàCGI.unescapeElement
-
Với việc chuyển
Settừ stdlib thành lớp lõi,set/sorted_set.rbđã bị loại bỏ, vàSortedSetkhông còn là hằng số được tải tự động. Vui lòng cài đặt gemsorted_setvàrequire 'sorted_set'để sử dụngSortedSet. [Feature #21287] -
Net::HTTP
- Hành vi mặc định tự động đặt header
Content-Typethànhapplication/x-www-form-urlencodedcho các request có body (ví dụ,POST,PUT) khi header chưa được đặt rõ ràng đã bị loại bỏ. Nếu ứng dụng của bạn dựa vào giá trị mặc định tự động này, các request của bạn giờ sẽ được gửi mà không có header Content-Type, có thể gây ra vấn đề tương thích với một số server nhất định. [GH-net-http #205]
- Hành vi mặc định tự động đặt header
Cập nhật C API
-
IO
rb_thread_fd_closeđã bị deprecated và giờ là no-op. Nếu bạn cần expose file descriptor từ C extension cho mã Ruby, tạo một instanceIOsử dụngRUBY_IO_MODE_EXTERNALvà dùngrb_io_close(io)để đóng nó (điều này cũng ngắt và chờ tất cả các thao tác đang chờ trên instanceIO). Đóng trực tiếp file descriptor không ngắt các thao tác đang chờ, và có thể dẫn đến hành vi không xác định. Nói cách khác, nếu hai đối tượngIOchia sẻ cùng file descriptor, đóng một đối tượng không ảnh hưởng đến đối tượng kia. [Feature #18455]
-
GVL
rb_thread_call_with_gvlgiờ hoạt động có hoặc không có GVL. Điều này cho phép các gem tránh kiểm traruby_thread_has_gvl_p. Vui lòng vẫn cẩn thận với GVL. [Feature #20750]
-
Set
-
C API cho
Setđã được thêm vào. Các phương thức sau được hỗ trợ: [Feature #21459]rb_set_foreachrb_set_newrb_set_new_caparb_set_lookuprb_set_addrb_set_clearrb_set_deleterb_set_size
-
Cải thiện triển khai
Class#new(ví dụ,Object.new) nhanh hơn trong mọi trường hợp, nhưng đặc biệt khi truyền đối số từ khóa. Điều này cũng đã được tích hợp vào YJIT và ZJIT. [Feature #21254]- Các heap GC của các pool kích thước khác nhau giờ phát triển độc lập, giảm sử dụng bộ nhớ khi chỉ một số pool chứa đối tượng tồn tại lâu
- Quét GC nhanh hơn trên các trang chứa đối tượng lớn
- Các đối tượng “generic ivar” (String, Array,
TypedData, v.v.) giờ sử dụng đối tượng “fields” nội bộ mới để truy cập biến instance nhanh hơn - GC tránh duy trì bảng
id2refnội bộ cho đến khi nó được sử dụng lần đầu, làm cho việc phân bổobject_idvà quét GC nhanh hơn object_idvàhashnhanh hơn trên các đối tượng Class và Module- Các số nguyên bignum lớn hơn có thể vẫn được nhúng sử dụng phân bổ chiều rộng biến
Random,Enumerator::Product,Enumerator::Chain,Addrinfo,StringScanner, và một số đối tượng nội bộ giờ được bảo vệ bởi write-barrier, giúp giảm overhead GC.
Ractor
Rất nhiều công việc đã được thực hiện để làm cho Ractor ổn định hơn, hiệu suất cao hơn và dễ sử dụng hơn. Những cải tiến này đưa triển khai Ractor gần hơn đến việc thoát khỏi trạng thái thử nghiệm.
- Cải thiện hiệu suất
- Chuỗi đã đóng băng và bảng symbol nội bộ sử dụng hash set không cần khóa [Feature #21268]
- Tra cứu bộ nhớ đệm phương thức tránh khóa trong hầu hết các trường hợp
- Truy cập biến instance của lớp (và generic ivar) nhanh hơn và tránh khóa
- Tránh tranh chấp bộ nhớ đệm CPU trong phân bổ đối tượng bằng cách sử dụng counter cho mỗi ractor
- Tránh tranh chấp bộ nhớ đệm CPU trong xmalloc/xfree bằng cách sử dụng counter thread-local
object_idtránh khóa trong hầu hết các trường hợp
- Sửa lỗi và ổn định
- Sửa các deadlock có thể xảy ra khi kết hợp Ractor và Thread
- Sửa các vấn đề với require và autoload trong Ractor
- Sửa các vấn đề encoding/transcoding giữa các Ractor
- Sửa các race condition trong thao tác GC và vô hiệu hóa phương thức
- Sửa các vấn đề với tiến trình fork sau khi khởi động Ractor
- Số lượng phân bổ GC giờ chính xác dưới Ractor
- Sửa TracePoint không hoạt động sau GC [Bug #19112]
JIT
- ZJIT
- Giới thiệu trình biên dịch JIT dựa trên phương thức thử nghiệm.
Khi khả dụng, ZJIT có thể được kích hoạt tại runtime với tùy chọn
--zjithoặc bằng cách gọiRubyVM::ZJIT.enable. Khi biên dịch Ruby, cần Rust 1.85.0 hoặc mới hơn để bao gồm hỗ trợ ZJIT. - Tính đến Ruby 4.0.0, ZJIT nhanh hơn trình thông dịch, nhưng chưa nhanh bằng YJIT. Chúng tôi khuyến khích thử nghiệm với ZJIT, nhưng khuyên không nên triển khai trong môi trường production bây giờ.
- Mục tiêu của chúng tôi là làm cho ZJIT nhanh hơn YJIT và sẵn sàng cho production trong Ruby 4.1.
- Giới thiệu trình biên dịch JIT dựa trên phương thức thử nghiệm.
Khi khả dụng, ZJIT có thể được kích hoạt tại runtime với tùy chọn
- YJIT
RubyVM::YJIT.runtime_statsratio_in_yjitkhông còn hoạt động trong bản build mặc định. Sử dụng--enable-yjit=statskhiconfiguređể kích hoạt nó với--yjit-stats.- Thêm
invalidate_everythingvào thống kê mặc định, được tăng lên khi mọi mã bị vô hiệu hóa bởi TracePoint.
- Thêm các tùy chọn
mem_size:vàcall_threshold:choRubyVM::YJIT.enable.
- RJIT
--rjitđã bị loại bỏ. Chúng tôi sẽ chuyển triển khai API JIT bên thứ ba sang kho lưu trữ ruby/rjit.
Xem NEWS hoặc nhật ký commit để biết thêm chi tiết.
Với những thay đổi này, 3889 tệp thay đổi, 230769 thêm(+), 297003 xóa(-) kể từ Ruby 3.4.0!
Chúc Giáng sinh vui vẻ, Năm mới hạnh phúc, và Happy Hacking với Ruby 4.0!
Tải về
-
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz
SIZE: 23955109 SHA1: 754e39e9ad122e1b6deaed860350bac133a35ed3 SHA256: 2e8389c8c072cb658c93a1372732d9eac84082c88b065750db1e52a5ac630271 SHA512: 688254e939b197d564e896fb951bc1abf07142f489e91c5ed0b11f68f52d6adb6b1f86616fe03f1f0bb434beeef7e75e158b9c616afb39bb34403b0b78d2ee19 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.xz
SIZE: 18008368 SHA1: 05ec670e86f84325c5353ef2f2888e53b6adc602 SHA256: a72bacee9de07283ebc19baa4ac243b193129f21aa4e168c7186fb1fe7d07fe1 SHA512: 2d5b2e566eaf70a5f3ea6ce6afc0611c0415de58a41336ef7a0b855c9a91eda9aa790a5f8b48e40a1eb9d50f8ea0f687216e617f16c8d040a08474f3116518a4 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.zip
SIZE: 29253204 SHA1: 0b69f89d1d140157251c0d3a6032f6c45cdf81e8 SHA256: 70cb1bf89279b86ab9a975d504607c051fc05ee03e311d550a5541b65e373455 SHA512: a72e076ef618c0aeb9d20cf22e6fb12fda36809c0064ef0f98153b95a0bac257ef606342444a38f992c4594bf376a4d264686cf597463aa6f111220798784302
Ruby là gì
Ruby được phát triển lần đầu bởi Matz (Yukihiro Matsumoto) vào năm 1993, và hiện được phát triển dưới dạng Mã nguồn Mở. Nó chạy trên nhiều nền tảng và được sử dụng trên toàn thế giới, đặc biệt cho phát triển web.
Tin mới nhất
Phát hành Ruby 3.2.10
Ruby 3.2.10 đã được phát hành.
Đăng bởi hsbt vào 14 Jan 2026
Phát hành Ruby 4.0.1
Ruby 4.0.1 đã được phát hành.
Đăng bởi k0kubun vào 13 Jan 2026
Diện mạo mới cho tài liệu Ruby
Tiếp theo việc thiết kế lại ruby-lang.org, chúng tôi có thêm tin vui để kỷ niệm 30 năm Ruby: docs.ruby-lang.org có diện mạo hoàn toàn...
Đăng bởi Stan Lo vào 23 Dec 2025
Thiết kế lại nhận diện trang web
Chúng tôi vui mừng thông báo về việc thiết kế lại toàn diện trang web của chúng tôi. Thiết kế cho bản cập nhật này...
Đăng bởi Hiroshi SHIBATA vào 22 Dec 2025