Ruby 3.4.0 程式語言發布

Ruby 3.4.0 發布,這是一種動態的物件導向程式語言,專注於程式開發的高效率,並融合了 Perl、Java、Python、Smalltalk、Eiffel、Ada 和 Lisp 的最佳功能。該專案代碼在BSD(“2-clause BSDL”)和“Ruby”許可證下分發,它指的是最新版本的GPL許可證,並與GPLv3相容。

主要改進:

  • 新增了一個新的標識符“it”,預設使用區塊中設定的未命名參數進行標識。當向區塊傳遞一個參數時,新標識符類似於先前可用的變數“_1”。引入新標識符的原因是希望消除由於可能將多個參數傳遞到區塊而引起的混亂(“it”意味著始終只有一個參數,並且當指定“_1”時,它不是清除參數“_2”是否存在)。 [1, 2, 3].each { put _1 } [1, 2, 3].each { put it } ary = [“foo”, “bar”, “baz”] p ary.map { it.upcase } #=> [“FOO”、“BAR”、“BAZ”]
  • 預設情況下,Prism 解析器處於啟用狀態,它更便攜、更易於維護,並且允許您處理程式碼中的錯誤。要解析 Ruby 程式碼,您的程式可以存取 Prism.parse(source) 方法來取得程式碼的 AST 表示,使用 Prism.parse_comments(source) 來從程式碼中提取註釋,並使用 Prism.parse_success?(source) 來檢查對於程式碼中的錯誤。若要傳回先前使用的「parse.y」解析器,可以使用「--parser=parse.y」選項。
  • 「socket」程式庫實作並預設支援 Happy Eyeballs 演算法 (RFC 8305),以便在連接到可透過 IPv4 和 IPv6 位址同時存取的主機時選擇最佳協定。使用 Happy Eyeball 演算法時,用戶端立即解析主機的 IPv4 和 IPv6 位址,並透過 IPv6 發送連接請求,然後延遲 250 ms 嘗試與主機綁定的其他位址並行連接,而無需等待。結果。最先建立的連線保持活動狀態,其他連線則關閉。先前,在 Ruby 程式中呼叫 TCPSocket.new 和 Socket.tcp 方法會導致連續嘗試解析 IPv4/IPv6 位址和連接,導致延遲,例如,第一次嘗試透過 IPv6 連接,但係統沒有支援IPv6。若要傳回舊行為,您可以在呼叫方法時使用環境變數「RUBY_T​​CP_NO_FAST_FALLBACK=1」、設定「Socket.tcp_fast_fallback=false」或參數「fast_fallback: false」。
  • 我們繼續優化 YJIT JIT 編譯器的效能,該編譯器由 Shopify 電子商務平台的開發人員開發,作為提高使用 Rails 框架並呼叫大量方法的 Ruby 程式效能的計畫的一部分。與 MJIT JIT 編譯器不同,新的 YJIT 使用惰性基本區塊版本控制 (LBBV),而不是處理整個方法,並以 Rust 編寫的整合 JIT 編譯器的形式實現。使用 LBBV,JIT 首先僅編譯方法的開頭部分,並在執行過程中確定所使用的變數和參數的類型後,稍後編譯其餘部分。

    在新版本中,YJIT 效能在 x86_64 和 ARM64 系統上的大多數測試中都得到了改進。新增了新的最佳化:使用局部變數和方法參數的暫存器;使用 Array#each、Array#select 和 Array#map 的 Ruby 實作;空方法和傳回常數、它們自己的實例或輸入參數的方法的內聯部署;針對特定方法的單獨程式碼產生器;優化字串處理(String#getbyte、String#setbyte);位運算的加速。

    記憶體消耗的減少是由於元資料壓縮和統一系統實施的限制。新增了選項“--yjit-mem-size”,預設為128MiB,會影響整體記憶體消耗。新增了“--yjit-log”選項以準確追蹤編譯的程式碼。

  • 提供了動態載入以共享庫形式收集的替代垃圾收集器的能力。 RUBY_GC_LIBRARY 環境變數會套用於指定具有所需垃圾收集器的庫。預設的內建垃圾收集器現在可以編譯為單獨的庫。作為替代方案,新增了基於 Rust 編寫的 MMTk 框架的垃圾收集器。
  • 允許將值為 nil 的命名參數傳遞給方法。值為「**nil」的參數現在被視為「**{}」的空哈希,而不將命名參數傳遞給該方法。
  • 索引不允許區塊傳遞或命名參數,例如“a[&b]=c”和“o[1, a: 1]”。
  • JSON.parse 方法已經優化,現在比 json 2.7 套件快一倍半。

來源: opennet.ru

添加評論