- Ruby 4.0.0 đã được phát hành, giới thiệu Ruby Box và ZJIT mới, đồng thời bao gồm nhiều cải tiến về hiệu năng và ngôn ngữ
- Ruby Box là một tính năng thử nghiệm cho phép thực thi cô lập các lớp, mô-đun, biến toàn cục và định nghĩa thư viện native/Ruby
- ZJIT là trình biên dịch JIT thế hệ mới dựa trên Rust, có kiến trúc dễ mở rộng hơn YJIT hiện tại và thuận lợi cho việc đóng góp từ bên ngoài
- Mô hình thực thi song song Ractor đã được cải thiện về độ ổn định và hiệu năng, dự kiến sẽ sớm bỏ trạng thái thử nghiệm
- Các bản cập nhật trên diện rộng cho lớp lõi, thư viện chuẩn, C API, GC, JIT... giúp tăng cường hiệu năng và khả năng mở rộng của hệ sinh thái Ruby
Tổng quan về Ruby 4.0
- Ruby 4.0.0 là một bản cập nhật lớn tập trung vào Ruby Box và ZJIT
- Bao gồm cải tiến ở nhiều mảng như thực thi song song, cú pháp ngôn ngữ, thư viện chuẩn, GC, JIT...
- Có thể tải xuống dưới các định dạng
.tar.gz, .tar.xz, .zip
Ruby Box
- Ruby Box là một tính năng thử nghiệm cung cấp khả năng cô lập các định nghĩa
- Được kích hoạt khi đặt biến môi trường
RUBY_BOX=1, lớp là Ruby::Box
- Các định nghĩa được nạp bên trong box sẽ được cô lập với bên ngoài, nên monkey patch, biến toàn cục/biến lớp, định nghĩa lớp/mô-đun và thay đổi thư viện sẽ không ảnh hưởng đến box khác
- Các ví dụ sử dụng chính
- Thực thi cô lập giữa các test case
- Chạy song song các ứng dụng web cho triển khai blue-green
- Thực thi song song để kiểm chứng cập nhật dependency
- Dự kiến sẽ được dùng làm API nền tảng cho “package API” cấp cao trong tương lai
ZJIT
- ZJIT là trình biên dịch JIT mới được phát triển như phiên bản kế tiếp của YJIT
- Yêu cầu Rust 1.85.0 trở lên, kích hoạt bằng tùy chọn
--zjit
- Hỗ trợ đơn vị biên dịch lớn hơn dựa trên SSA IR, với kiến trúc giúp thúc đẩy đóng góp từ bên ngoài
- Hiện nhanh hơn interpreter nhưng chậm hơn YJIT
- Không khuyến nghị dùng trong production, hiệu năng dự kiến sẽ được cải thiện ở Ruby 4.1
Cải tiến Ractor
- Bổ sung lớp Ractor::Port để giải quyết vấn đề gửi/nhận message
Ractor.shareable_proc giúp chia sẻ đối tượng Proc giữa các Ractor dễ dàng hơn
- Cải thiện cấu trúc dữ liệu nội bộ để giảm tranh chấp global lock, nâng cao tính song song
- Trạng thái thử nghiệm của Ractor dự kiến sẽ được gỡ vào năm sau
Thay đổi ngôn ngữ
*nil không còn gọi nil.to_a nữa (hoạt động giống **nil)
- Các toán tử logic (
||, &&, and, or) nay hỗ trợ cú pháp nối dòng (dot chaining)
- Cải thiện tính dễ đọc và tính nhất quán của mã
Cập nhật lớp lõi
- Array: thêm
Array#rfind, Array#find để hỗ trợ tìm kiếm hiệu quả
- Binding: loại trừ tham số đánh số và thêm các phương thức liên quan đến
implicit_parameters
- Enumerator: thêm đối số từ khóa
size: cho produce
- ErrorHighlight: khi phát sinh
ArgumentError, hiển thị đoạn mã của nơi gọi và nơi định nghĩa
- Fiber/Fiber::Scheduler: bổ sung
raise(cause:), fiber_interrupt, yield...
- File: hỗ trợ
File::Stat#birthtime trên Linux
- IO: cho phép timeout là
Float::INFINITY, loại bỏ việc tạo tiến trình dựa trên pipe
- Kernel: có thể tùy biến
#inspect, loại bỏ việc tạo pipe trong Kernel#open
- Math: thêm
log1p, expm1
- Pathname: được nâng từ default gem thành lớp lõi
- Proc: thống nhất định dạng hiển thị tham số ẩn danh
- Ractor: chuyển sang cấu trúc giao tiếp dựa trên
Ractor::Port, loại bỏ Ractor.yield...
- Set: được nâng thành lớp lõi, đơn giản hóa định dạng
inspect
- Socket: thêm đối số
open_timeout, thống nhất ngoại lệ timeout
- String: hỗ trợ Unicode 17.0.0, Emoji 17.0, mở rộng nhóm phương thức
strip
- Thread: hỗ trợ đối số
raise(cause:)
Cập nhật thư viện chuẩn (Stdlib)
- Nâng cấp thành default gem:
ostruct, pstore, benchmark, logger, rdoc, win32ole, irb, reline, fiddle...
- Thêm default gem:
win32-registry 0.1.2
- Cập nhật default gem:
RubyGems 4.0.3, bundler 4.0.3, openssl 4.0.0, json 2.18.0...
- Cập nhật bundled gem:
minitest 6.0.0, rake 13.3.1, rbs 3.10.0, debug 1.11.1...
- Bao gồm RubyGems/Bundler 4
Hỗ trợ nền tảng
- Windows: ngừng hỗ trợ phiên bản thấp hơn MSVC 14.0 (cần Visual Studio 2015 trở lên)
Thay đổi tương thích
- Loại bỏ
Ractor.yield, Ractor#take, Ractor#close_incoming, Ractor#close_outgoing
- Ngừng sử dụng
ObjectSpace._id2ref
- Loại bỏ
Process::Status#&, #>>
- Đơn giản hóa việc hiển thị frame nội bộ trong backtrace
- Trong backtrace của
ArgumentError, hiển thị tên lớp/mô-đun của receiver
Tương thích thư viện chuẩn
- Loại bỏ thư viện CGI, chỉ giữ lại
cgi/escape
- Do
Set được nâng thành lớp lõi, SortedSet sẽ cần cài riêng dưới dạng gem
- Loại bỏ việc tự động đặt header
Content-Type trong Net::HTTP
Cập nhật C API
- Vô hiệu hóa
rb_thread_fd_close và khuyến nghị dùng rb_io_close
rb_thread_call_with_gvl hoạt động bất kể có GVL hay không
- Thêm C API cho Set (
rb_set_new, rb_set_add, rb_set_delete...)
Cải tiến triển khai và hiệu năng
- Tăng tốc độ gọi
Class#new, đặc biệt khi dùng đối số từ khóa
- Giảm mức sử dụng bộ nhớ nhờ tăng trưởng độc lập của GC heap pool
- Tăng tốc độ sweeping đối tượng lớn
- Tối ưu hóa việc tính
object_id, hash và truy cập biến thể hiện
- Cải thiện hiệu năng Ractor
- Cấu trúc hash không khóa, giảm tranh chấp cache, tối ưu cấp phát đối tượng
- Sửa lỗi liên quan đến deadlock, encoding và GC
Liên quan đến JIT
- ZJIT: JIT dựa trên method, yêu cầu Rust 1.85.0 trở lên, kích hoạt bằng
--zjit hoặc RubyVM::ZJIT.enable
- YJIT: thay đổi tùy chọn thống kê, thêm
mem_size: và call_threshold:
- RJIT: loại bỏ
--rjit, chuyển sang kho lưu trữ riêng
Quy mô thay đổi
- So với Ruby 3.4.0, có 3.889 file thay đổi, thêm 230.769 dòng, xóa 297.003 dòng
- Ruby 4.0 là một bản phát hành lớn với sự tăng cường mạnh mẽ về hiệu năng, tính song song và tính nhất quán của ngôn ngữ
Tải xuống
- Cung cấp các định dạng
ruby-4.0.0.tar.gz, ruby-4.0.0.tar.xz, ruby-4.0.0.zip
- Nêu rõ giá trị hash SHA1, SHA256, SHA512 cho từng tệp
Giới thiệu về Ruby
- Ruby là ngôn ngữ mã nguồn mở do Yukihiro Matsumoto (Matz) phát triển vào năm 1993
- Chạy trên nhiều nền tảng và đặc biệt được sử dụng rộng rãi trên toàn thế giới trong lĩnh vực phát triển web
1 bình luận
Ý kiến trên Hacker News
Chúc mừng sinh nhật Ruby!
Mọi người thường nói rằng “Ruby bị bỏ vì không có typing”, nhưng giờ RBS đang dần trở thành tiêu chuẩn. Sorbet cũng hỗ trợ điều này, và đã có cả inline notation để viết type ngay bên cạnh code.
Câu “Ruby có LSP yếu” giờ cũng đã lỗi thời. ruby-lsp đã trở thành tiêu chuẩn và còn hỗ trợ cả “go to definition”. Nhờ kiến trúc plugin, nhiều công cụ có thể tái sử dụng cùng một AST.
Khả năng song song cũng đã cải thiện nhiều nhờ Ractor, và giờ nếu chỉ tinh chỉnh thêm GC thì có lẽ sẽ hoàn toàn vượt qua giai đoạn thử nghiệm.
Cũng có các tính năng mới như ZJIT hay Box, nhưng vẫn chưa được khuyến nghị trong production. Dù vậy, mọi thứ đang dần tốt lên.
Tôi cũng nghĩ việc cú pháp không thay đổi quá đột ngột là một điểm hay
Vào Giáng Sinh thì lúc nào cũng phải có phiên bản Ruby mới.
Lần này ruby::box khá thú vị. Nó cho phép chạy rollout tính năng trên hai phiên bản cùng lúc.
Và việc giờ có thể viết
if condition1 && condition2trên nhiều dòng cũng khá hayif condition1 && condition2trên nhiều dòng từ trước rồi và nó vẫn hoạt động. Tôi không hiểu cú pháp mới khác ở điểm nàoTôi vui vì Ruby 4.0 ra mắt, nhưng trong năm 2025 tôi đã chuyển hẳn sang Python.
Claude Code đã tự động chuyển dự án Ruby của tôi sang Python 100%, và từ đó tôi không còn lý do gì để dùng Ruby nữa.
Tôi đã yêu Ruby hơn 10 năm và còn viết sách về nó, nhưng giờ fastapi, pytorch, langchain, streamlit cùng hệ sinh thái của Python đã giành chiến thắng. Dù vậy, tôi vẫn nghĩ cú pháp của Ruby là đẹp nhất
Giáng Sinh thì đúng là không thể thiếu một phiên bản Ruby mới. Cảm ơn Matz và cả đội
Có tài liệu mới nào đáng giới thiệu cho người muốn học Ruby trong giai đoạn 2025~26 không? Ngoài tài liệu chính thức ra, tôi muốn biết có sách nào hay không
Khóa Ruby on Rails của Pragmatic Studio
Ruby thực sự là một ngôn ngữ tuyệt vời. Gần đây tôi đã tạo một lớp sinh API từ một file Markdown duy nhất chạy trên Rails, và nếu làm điều tương tự bằng Python thì sẽ phức tạp hơn nhiều. Với JavaScript thì còn kinh khủng hơn. Khả năng metaprogramming của Ruby thực sự là vô song
Tôi rất vui vì stack trace nội bộ đã được dọn dẹp lại. Sẽ tuyệt hơn nữa nếu một ngày nào đó hỗ trợ cả đường dẫn tương đối. Và việc Set cuối cùng cũng được đối xử đúng mức cũng rất đáng mừng
Giờ tôi làm ở một công ty không dùng Ruby, nhưng vẫn luôn yêu Ruby sâu sắc. Cảm ơn vì bản phát hành này, và mong sẽ có dịp được dùng lại
Trước đây tôi từng nghe tính năng Ruby::Box (namespace) gây ra suy giảm hiệu năng nghiêm trọng, không biết lần này đã được cải thiện chưa
Tôi muốn biết tooling đã được cải thiện chưa. Tôi vẫn chưa từng chạy LSP tử tế trên Windows