6 điểm bởi GN⁺ 2025-12-26 | 1 bình luận | Chia sẻ qua WhatsApp
  • Ruby 4.0.0 đã được phát hành, giới thiệu Ruby BoxZJIT 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 BoxZJIT
  • 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

  • ZJITtrì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: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

 
GN⁺ 2025-12-26
Ý 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

    • Tôi là một Rubyist hardcore và ruby-lsp thực sự rất tuyệt. Nhưng khó mà nói RBS đang trở thành tiêu chuẩn. Trên thực tế tỷ lệ áp dụng vẫn rất thấp. rbs-inline chỉ ở mức dự án cá nhân và cũng ít hoạt động. Dù vậy, tôi hoan nghênh việc tác giả đó đang cố gắng tích hợp trực tiếp vào RBS. Cá nhân tôi không nghĩ một hệ thống kiểu dựa trên chú thích sẽ được phổ biến rộng rãi
    • Ruby đơn giản là kém hơn Python. Khi đã có một hệ thống gần như tương tự nhưng nhanh hơn và có cộng đồng lớn hơn, thì chẳng có lý do gì để dùng Ruby
  • 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 && condition2 trên nhiều dòng cũng khá hay

    • Sẽ thật tuyệt nếu một ngày nào đó mỗi Ractor chạy trong ruby::box riêng của nó, và mỗi box có thể chạy GC độc lập. Khi đó sẽ có thể thực thi song song thực sự như BEAM. Độ trễ p99 chắc cũng sẽ giảm. Tất nhiên sẽ có chi phí sao chép khi chia sẻ object, nhưng với đa số ứng dụng thì có lẽ không đáng kể
    • Tôi thực ra đã viết if condition1 && condition2 trê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ào
  • Tô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

    • Những gì bạn nhắc đến đều là thư viện trong hệ sinh thái Python, chứ không phải ưu điểm của bản thân ngôn ngữ. Nhiều lập trình viên đang chuyển sang Python vì thư viện hơn là vì ngôn ngữ. Kết quả là Python đang bị kéo theo nhiều hướng và ngày càng nảy sinh vấn đề triết lý ngôn ngữ bị mờ nhạt. Ngược lại, Ruby tập hợp những người yêu chính bản thân ngôn ngữ nên vẫn giữ được cốt lõi rất tốt
    • Tôi cũng chuyển từ Ruby sang Kotlin trong năm nay. Cảm giác bất an vì không có static typing quá lớn. Kotlin cũng có hiệu năng tốt, và việc dùng thêm chút bộ nhớ giờ không còn là vấn đề lớn. Tôi vẫn thích Ruby nhưng chỉ dùng cho các script đơn giản
    • Python có hỗ trợ IDE tốt hơn nhiều, chỉ riêng lý do đó thôi cũng đáng để chuyển. Tính động quá mức của Ruby không hợp gu tôi
    • Tôi đã thử dùng Langchain nhưng nó thay đổi quá nhanh khiến tài liệu hoàn toàn không theo kịp. Tìm kiếm thì chỉ thấy đầy bài kiểu “vì sao tài liệu Langchain quá tệ”. Thế là tôi chuyển sang Haystack và hài lòng hơn nhiều
    • Tôi cũng thích pandas, numpy, pytorch, nhưng vẫn rất thích làm web app full-stack với Rails. Vì vậy tôi cực kỳ yêu pyCall
  • 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

  • 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

    • Nghe thú vị đấy, bạn có thể cho xem ví dụ không?
  • 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

    • Nếu stack trace hiển thị đường dẫn tương đối thì sẽ thật tuyệt
  • 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

    • Theo tôi thì lập trình trên Windows là tự chuốc khổ. Nếu không phải ngôn ngữ của Microsoft thì Linux hoặc macOS tốt hơn nhiều
    • Trải nghiệm lập trình viên (DX) của Ruby chưa đạt kỳ vọng, và trên Windows thì còn tệ hơn. May là đã có bài trình bày thừa nhận vấn đề này và muốn cải thiện nó
    • Bạn đã thử WSL2 chưa?