Phát hành Ruby 3.4.0

Đăng bởi naruse vào 25 Dec 2024

Chúng tôi vui mừng thông báo phát hành Ruby 3.4.0. Ruby 3.4 thêm tham chiếu tham số block it, đổi Prism thành trình phân tích mặc định, thêm hỗ trợ Happy Eyeballs Version 2 cho thư viện socket, cải thiện YJIT, thêm GC Mô-đun, và nhiều hơn nữa.

Giới thiệu it

it được thêm để tham chiếu đến tham số block không có tên biến. [Feature #18980]

ary = ["foo", "bar", "baz"]

p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"]

it hoạt động rất giống với _1. Khi mục đích chỉ là sử dụng _1 trong một block, khả năng xuất hiện các tham số đánh số khác như _2 tạo thêm gánh nặng nhận thức cho người đọc. Vì vậy it được giới thiệu như một bí danh tiện lợi. Sử dụng it trong các trường hợp đơn giản khi it tự giải thích được, chẳng hạn trong các block một dòng.

Prism giờ đây là trình phân tích mặc định

Chuyển trình phân tích mặc định từ parse.y sang Prism. [Feature #20564]

Đây là một cải thiện nội bộ và người dùng sẽ thấy ít thay đổi. Nếu bạn phát hiện bất kỳ vấn đề tương thích nào, vui lòng báo cáo cho chúng tôi.

Để sử dụng trình phân tích truyền thống, sử dụng tham số dòng lệnh --parser=parse.y.

Thư viện socket giờ đây hỗ trợ Happy Eyeballs Version 2 (RFC 8305)

Thư viện socket giờ đây hỗ trợ Happy Eyeballs Version 2 (RFC 8305), phiên bản chuẩn hóa mới nhất của phương pháp được áp dụng rộng rãi để cải thiện kết nối trong nhiều ngôn ngữ lập trình, trong TCPSocket.new (TCPSocket.open) và Socket.tcp. Cải thiện này cho phép Ruby cung cấp các kết nối mạng hiệu quả và đáng tin cậy, thích ứng với môi trường internet hiện đại.

Cho đến Ruby 3.3, các phương thức này thực hiện phân giải tên và nỗ lực kết nối tuần tự. Với thuật toán này, chúng giờ đây hoạt động như sau:

  1. Thực hiện phân giải tên IPv6 và IPv4 đồng thời
  2. Nỗ lực kết nối đến các địa chỉ IP đã phân giải, ưu tiên IPv6, với các nỗ lực song song cách nhau 250ms
  3. Trả về kết nối thành công đầu tiên trong khi hủy các kết nối khác

Điều này đảm bảo giảm thiểu độ trễ kết nối, ngay cả khi một giao thức hoặc địa chỉ IP cụ thể bị chậm hoặc không khả dụng. Tính năng này được bật mặc định, vì vậy không cần cấu hình thêm để sử dụng. Để tắt toàn cục, đặt biến môi trường RUBY_TCP_NO_FAST_FALLBACK=1 hoặc gọi Socket.tcp_fast_fallback=false. Hoặc để tắt trên từng phương thức, sử dụng tham số keyword fast_fallback: false.

YJIT

TL;DR

  • Hiệu suất tốt hơn trên hầu hết các benchmark trên cả nền tảng x86-64 và arm64.
  • Giảm sử dụng bộ nhớ thông qua metadata nén và giới hạn bộ nhớ thống nhất.
  • Nhiều bản sửa lỗi: YJIT giờ đây ổn định hơn và được kiểm tra kỹ hơn.

Tính năng mới

  • Tùy chọn dòng lệnh
    • --yjit-mem-size giới thiệu giới hạn bộ nhớ thống nhất (mặc định 128MiB) để theo dõi tổng sử dụng bộ nhớ YJIT, cung cấp một phương án trực quan hơn so với tùy chọn cũ --yjit-exec-mem-size.
    • --yjit-log bật nhật ký biên dịch để theo dõi những gì được biên dịch.
  • Ruby API
    • RubyVM::YJIT.log cung cấp quyền truy cập vào phần cuối nhật ký biên dịch tại thời điểm chạy.
  • Thống kê YJIT
    • RubyVM::YJIT.runtime_stats giờ đây luôn cung cấp thêm thống kê về invalidation, inlining, và mã hóa metadata.

Tối ưu hóa mới

  • Context nén giảm bộ nhớ cần thiết để lưu trữ metadata YJIT
  • Cấp phát thanh ghi cho biến cục bộ và tham số phương thức Ruby
  • Khi YJIT được bật, sử dụng nhiều nguyên thủy Core hơn được viết bằng Ruby:
    • Array#each, Array#select, Array#map được viết lại bằng Ruby để có hiệu suất tốt hơn [Feature #20182].
  • Khả năng inline các phương thức nhỏ/đơn giản như:
    • Phương thức rỗng
    • Phương thức trả về hằng số
    • Phương thức trả về self
    • Phương thức trực tiếp trả về một tham số
  • Codegen chuyên biệt cho nhiều phương thức runtime hơn
  • Tối ưu hóa String#getbyte, String#setbyte và các phương thức chuỗi khác
  • Tối ưu hóa các phép toán bitwise để tăng tốc thao tác bit/byte cấp thấp
  • Hỗ trợ hằng số chia sẻ trong chế độ multi-ractor
  • Nhiều tối ưu hóa gia tăng khác

GC Mô-đun

  • Các triển khai bộ thu gom rác (GC) thay thế có thể được tải động thông qua tính năng bộ thu gom rác mô-đun. Để bật tính năng này, cấu hình Ruby với --with-modular-gc khi build. Các thư viện GC có thể được tải tại thời điểm chạy bằng biến môi trường RUBY_GC_LIBRARY. [Feature #20351]

  • Bộ thu gom rác tích hợp của Ruby đã được tách ra thành một tập tin riêng tại gc/default/default.c và tương tác với Ruby thông qua API được định nghĩa trong gc/gc_impl.h. Bộ thu gom rác tích hợp giờ đây cũng có thể được build dưới dạng thư viện bằng make modular-gc MODULAR_GC=default và được bật bằng biến môi trường RUBY_GC_LIBRARY=default. [Feature #20470]

  • Một thư viện GC thử nghiệm được cung cấp dựa trên MMTk. Thư viện GC này có thể được build bằng make modular-gc MODULAR_GC=mmtk và được bật bằng biến môi trường RUBY_GC_LIBRARY=mmtk. Điều này yêu cầu bộ công cụ Rust trên máy build. [Feature #20860]

Thay đổi ngôn ngữ

  • Các chuỗi ký tự trong các tập tin không có comment frozen_string_literal giờ đây phát ra cảnh báo deprecation khi chúng bị thay đổi. Các cảnh báo này có thể được bật với -W:deprecated hoặc bằng cách đặt Warning[:deprecated] = true. Để tắt thay đổi này, bạn có thể chạy Ruby với tham số dòng lệnh --disable-frozen-string-literal. [Feature #20205]

  • Giờ đây hỗ trợ keyword splatting nil khi gọi phương thức. **nil được xử lý tương tự như **{}, không truyền keyword nào, và không gọi bất kỳ phương thức chuyển đổi nào. [Bug #20064]

  • Không còn cho phép truyền block trong index. [Bug #19918]

  • Không còn cho phép keyword arguments trong index. [Bug #20218]

  • Tên cấp cao nhất ::Ruby giờ đây được dành riêng, và định nghĩa sẽ bị cảnh báo khi Warning[:deprecated]. [Feature #20884]

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 lõi đáng chú ý.

  • Exception

    • Exception#set_backtrace giờ đây chấp nhận mảng Thread::Backtrace::Location. Kernel#raise, Thread#raise và Fiber#raise cũng chấp nhận định dạng mới này. [Feature #13557]
  • GC

    • GC.config được thêm để cho phép đặt các biến cấu hình trên Bộ thu gom rác. [Feature #20443]

    • Tham số cấu hình GC rgengc_allow_full_mark được giới thiệu. Khi false GC sẽ chỉ đánh dấu các đối tượng trẻ. Mặc định là true. [Feature #20443]

  • Ractor

    • require trong Ractor được cho phép. Quá trình require sẽ được chạy trên Ractor chính. Ractor._require(feature) được thêm để chạy quá trình require trên Ractor chính. [Feature #20627]

    • Ractor.main? được thêm. [Feature #20627]

    • Ractor.[] và Ractor.[]= được thêm để truy cập bộ nhớ cục bộ ractor của Ractor hiện tại. [Feature #20715]

    • Ractor.store_if_absent(key){ init } được thêm để khởi tạo biến cục bộ ractor một cách an toàn luồng. [Feature #20875]

  • Range

    • Range#size giờ đây ném TypeError nếu range không thể lặp. [Misc #18984]

Cập nhật thư viện chuẩn

Lưu ý: Chúng tôi chỉ liệt kê các cập nhật thư viện chuẩn đáng chú ý.

  • RubyGems
    • Thêm tùy chọn --attestation cho gem push. Cho phép lưu chữ ký vào sigstore.dev
  • Bundler
    • Thêm cấu hình lockfile_checksums để bao gồm checksum trong lockfile mới
    • Thêm bundle lock --add-checksums để thêm checksum vào lockfile hiện có
  • JSON

    • Cải thiện hiệu suất JSON.parse nhanh hơn khoảng 1.5 lần so với json-2.7.x.
  • Tempfile

    • Tham số keyword anonymous: true được triển khai cho Tempfile.create. Tempfile.create(anonymous: true) xóa tập tin tạm đã tạo ngay lập tức. Vì vậy ứng dụng không cần phải xóa tập tin. [Feature #20497]
  • win32/sspi.rb

Các gem đi kèm sau đây được nâng cấp từ gem mặc định.

  • mutex_m 0.3.0
  • getoptlong 0.2.1
  • base64 0.2.0
  • bigdecimal 3.1.8
  • observer 0.1.2
  • abbrev 0.1.2
  • resolv-replace 0.1.1
  • rinda 0.2.0
  • drb 2.2.1
  • nkf 0.2.0
  • syslog 0.2.0
  • csv 3.3.2
  • repl_type_completor 0.1.9

Vấn đề tương thích

Lưu ý: Không bao gồm các bản sửa lỗi tính năng.

  • Thông báo lỗi và hiển thị backtrace đã được thay đổi.
    • Sử dụng dấu nháy đơn thay vì dấu backtick làm dấu mở ngoặc. [Feature #16495]
    • Hiển thị tên lớp trước tên phương thức (chỉ khi lớp có tên cố định). [Feature #19117]
    • Kernel#caller, các phương thức của Thread::Backtrace::Location, v.v. cũng được thay đổi tương ứng.
    Old:
    test.rb:1:in `foo': undefined method `time' for an instance of Integer
            from test.rb:2:in `<main>'
    
    New:
    test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer
            from test.rb:2:in '<main>'
    
  • Hiển thị Hash#inspect đã được thay đổi. [Bug #20433]

    • Các khóa Symbol được hiển thị bằng cú pháp khóa symbol hiện đại: "{user: 1}"
    • Các khóa khác giờ đây có khoảng trắng xung quanh =>: '{"user" => 1}', trong khi trước đó không có: '{"user"=>1}'
  • Kernel#Float() giờ đây chấp nhận chuỗi thập phân với phần thập phân bị bỏ qua. [Feature #20705]

    Float("1.")    #=> 1.0 (trước đây, ArgumentError được ném)
    Float("1.E-1") #=> 0.1 (trước đây, ArgumentError được ném)
    
  • String#to_f giờ đây chấp nhận chuỗi thập phân với phần thập phân bị bỏ qua. Lưu ý rằng kết quả thay đổi khi chỉ định số mũ. [Feature #20705]

    "1.".to_f    #=> 1.0
    "1.E-1".to_f #=> 0.1 (trước đây, 1.0 được trả về)
    
  • Refinement#refined_class đã được loại bỏ. [Feature #19714]

Vấn đề tương thích thư viện chuẩn

  • DidYouMean

    • DidYouMean::SPELL_CHECKERS[]= và DidYouMean::SPELL_CHECKERS.merge! được loại bỏ.
  • Net::HTTP

    • Loại bỏ các hằng số deprecated sau:
      • Net::HTTP::ProxyMod
      • Net::NetPrivate::HTTPRequest
      • Net::HTTPInformationCode
      • Net::HTTPSuccessCode
      • Net::HTTPRedirectionCode
      • Net::HTTPRetriableCode
      • Net::HTTPClientErrorCode
      • Net::HTTPFatalErrorCode
      • Net::HTTPServerErrorCode
      • Net::HTTPResponseReceiver
      • Net::HTTPResponceReceiver

      Các hằng số này đã bị deprecated từ năm 2012.

  • Timeout

    • Từ chối giá trị âm cho Timeout.timeout. [Bug #20795]
  • URI

    • Chuyển trình phân tích mặc định sang tuân thủ RFC 3986 thay vì tuân thủ RFC 2396. [Bug #19266]

Cập nhật C API

  • rb_newobj và rb_newobj_of (và các macro tương ứng RB_NEWOBJ, RB_NEWOBJ_OF, NEWOBJ, NEWOBJ_OF) đã được loại bỏ. [Feature #20265]
  • Loại bỏ hàm deprecated rb_gc_force_recycle. [Feature #18290]

Thay đổi khác

  • Truyền block cho một phương thức không sử dụng block đã truyền sẽ hiển thị cảnh báo ở chế độ verbose (-w). [Feature #15554]

  • Định nghĩa lại một số phương thức lõi được tối ưu hóa đặc biệt bởi trình thông dịch và JIT như String.freeze hoặc Integer#+ giờ đây sẽ phát ra cảnh báo hiệu suất (-W:performance hoặc Warning[:performance] = true). [Feature #20429]

Xem NEWS hoặc nhật ký commit để biết thêm chi tiết.

Với những thay đổi đó, 4942 tập tin thay đổi, 202244 thêm vào(+), 255528 xóa đi(-) kể từ Ruby 3.3.0!

Giáng sinh vui vẻ, Chúc mừng ngày lễ, và hãy tận hưởng lập trình với Ruby 3.4!

Tải về

  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.gz

    SIZE: 23153022
    SHA1: 8ccb561848a7c460ae08e1a120a47c4a88a79335
    SHA256: 068c8523442174bd3400e786f4a6952352c82b1b9f6210fd17fb4823086d3379
    SHA512: bc70ecba27d1cdea00879f03487cad137a7d9ab2ad376cfb7a65780ad14da637fa3944eeeede2c04ab31eeafb970c64ccfeeb854c99c1093937ecc1165731562
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.xz

    SIZE: 17215572
    SHA1: eb25447cc404e8d2e177c62550d0224ebd410e68
    SHA256: 0081930db22121eb997207f56c0e22720d4f5d21264b5907693f516c32f233ca
    SHA512: 776a2cf3e9ccc77c27500240f168aa3e996b0c7c1ee1ef5a7afc291a06c118444016fde38b5b139c0b800496b8eb1b5456562d833f0edc0658917164763b1af7
    
  • https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.zip

    SIZE: 28310193
    SHA1: 26254ca5d3decc28a4e5faec255995265e5270b5
    SHA256: c120228038af04554f6363e716b0a32cbf53cf63c6adf9f2c22a24f43dc8b555
    SHA512: 4d535ed10db76a6aa74f8a025df319deb28483a7a781c24045906ee7663f1cff9d9f9e71dbc993c9e050113a34b37c7fa2143c355a0a6e1e1029bf2c92213ecc
    

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 4.0.0

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.

Đăng bởi naruse vào 25 Dec 2025

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

Thêm Tin...