基于 WASI 的 WebAssembly 支持
這是基于 WASI 的 WebAssembly 支持的初始移植。此項(xiàng)特性使得 CRuby 二進(jìn)制文件可在 Web 瀏覽器、Serverless Edge 環(huán)境和其他 WebAssembly/WASI 嵌入器上使用。目前,此移植可在不使用 Thread API 的前提下通過(guò)基本和引導(dǎo)測(cè)試套件的測(cè)試。生產(chǎn)就緒的 YJIT
-
YJIT 不再是實(shí)驗(yàn)性的
-
已經(jīng)在生產(chǎn)工作負(fù)載上進(jìn)行了一年多的測(cè)試,證明非常穩(wěn)定。
-
-
YJIT 現(xiàn)在支持 Linux、MacOS、BSD 和其他 UNIX 平臺(tái)上的 x86-64 和 arm64/aarch64 CPU。
-
此版本支持 Apple M1/M2、AWS Graviton、Raspberry Pi 4 等。
-
-
構(gòu)建 YJIT 現(xiàn)在需要 Rust 1.58.0+。[Feature #18481 ]
-
為了確保 CRuby 是使用 YJIT 構(gòu)建的,請(qǐng)?jiān)谶\(yùn)行
./configure
腳本之前安裝rustc
>= 1.58.0 。
-
-
YJIT 3.2 版本比 3.1 更快,內(nèi)存開(kāi)銷大約是 3.1 的 1/3。
-
總體而言,YJIT 比 yjit-bench 上的 Ruby 解釋器快 41%(幾何平均值)。
-
JIT 代碼的物理內(nèi)存是延遲分配的。與 Ruby 3.1 不同,Ruby 進(jìn)程的 RSS 被最小化,因?yàn)?/span>
--yjit-exec-mem-size
分配的虛擬內(nèi)存頁(yè)在 JIT 代碼實(shí)際使用之前不會(huì)映射到物理內(nèi)存頁(yè)。 -
引入 Code GC,當(dāng) JIT 代碼的內(nèi)存消耗達(dá)到
--yjit-exec-mem-size
時(shí),釋放所有代碼頁(yè)。 -
RubyVM::YJIT.runtime_stats
在現(xiàn)有的inline_code_size
和outlined_code_size
keys 之外,還返回 Code GC metrics:code_gc_count
、live_page_count
、freed_page_count
和freed_code_size
。
-
-
由
RubyVM::YJIT.runtime_stats
生成的大部分統(tǒng)計(jì)數(shù)據(jù)現(xiàn)在都可以在發(fā)布版本中使用。-
只需使用
--yjit-stats
運(yùn)行 ruby 來(lái)計(jì)算和轉(zhuǎn)儲(chǔ)統(tǒng)計(jì)信息(會(huì)產(chǎn)生一些運(yùn)行時(shí)開(kāi)銷)。
-
-
YJIT 現(xiàn)在經(jīng)過(guò)優(yōu)化以利用 object shapes。[Feature #18776 ]
-
在定義新常量時(shí),利用更細(xì)粒度的常量失效來(lái)減少代碼的無(wú)效化。[Feature #18589 ]
-
默認(rèn)
--yjit-exec-mem-size
更改為 64 (MiB)。 -
默認(rèn)
--yjit-call-threshold
更改為 30。
針對(duì) ReDoS 的正則表達(dá)式改進(jìn)
由于正則表達(dá)式匹配會(huì)耗費(fèi)不少時(shí)間,當(dāng)代碼試圖向不受信任的輸入匹配低效的正則表達(dá)式時(shí),攻擊者可能會(huì)利用它進(jìn)行 DoS 攻擊(即正則表達(dá)式 DoS,或稱作 ReDoS)。因此新版本引入了兩項(xiàng)可顯著緩解 ReDoS 攻擊的改進(jìn)。改進(jìn)的正則表達(dá)式匹配算法從 Ruby 3.2 開(kāi)始,Regexp 的匹配算法通過(guò)使用記憶技術(shù)得到了極大的改進(jìn)。
# This match takes 10 sec. in Ruby 3.1, and 0.003 sec. in Ruby 3.2 /^a*b?a*$/ =~ "a" * 50000 + "x"
改進(jìn)后的匹配算法使得大多數(shù) Regexp 匹配(實(shí)驗(yàn)中大約為 90%)在線性時(shí)間內(nèi)完成。對(duì)于 3.2.0 預(yù)覽版本的用戶:此優(yōu)化可能會(huì)消耗與每個(gè)匹配的輸入長(zhǎng)度成比例的內(nèi)存。預(yù)計(jì)不會(huì)出現(xiàn)實(shí)際問(wèn)題,因?yàn)榇藘?nèi)存分配通常會(huì)延遲,并且正常的 Regexp 匹配最多應(yīng)消耗 10 倍的內(nèi)存輸入長(zhǎng)度。正則表達(dá)式超時(shí)退出機(jī)制此版本引入了正則表達(dá)式超時(shí)退出機(jī)制。
Regexp.timeout = 1.0
/^a*b?a*$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second
Regexp.timeout
根據(jù) Ruby 應(yīng)用程序的要求進(jìn)行配置,可以防止或顯著降低 DoS 的風(fēng)險(xiǎn)。請(qǐng)注意,Regexp.timeout
是全局配置項(xiàng),如果希望對(duì)某些特殊的正則表達(dá)式使用不同的超時(shí)設(shè)置,需要使用timeout
關(guān)鍵字Regexp.new
。
Regexp.timeout = 1.0
# This regexp has no timeout
long_time_re = Regexp.new("^a*b?a*$", timeout: nil)
long_time_re =~ "a" * 50000 + "x" # never interrupted
此項(xiàng)特性的最初提案:https://bugs.ruby-lang.org/issues/17837其他值得注意的新功能
語(yǔ)法建議-
syntax_suggest
(以前的dead_end
)的功能已集成到 Ruby 中,可以幫助找到錯(cuò)誤的位置,例如丟失或多余的 end 。
Unmatched `end', missing keyword (`do', `def`, `if`, etc.) ?
1 class Dog
> 2 defbark
> 4 end
5 end
[Feature #18159]錯(cuò)誤高亮-
現(xiàn)在它指向 TypeError 和 ArgumentError 的相關(guān)參數(shù)
test.rbin `+': nil can't be coerced into Integer (TypeError)
sum = ary[0] + ary[1]
^^^^^^
語(yǔ)言-
匿名 rest 和關(guān)鍵字 rest 參數(shù)可以作為參數(shù)傳遞,而不僅僅是在方法參數(shù)中使用。[Feature #18351]
deffoo(*)
bar(*)
end
defbaz(**)
quux(**)
end
更多詳情可查看官方公告:https://www.ruby-lang.org/en/news/2022/12/25/ruby-3-2-0-released/-
ruby
+關(guān)注
關(guān)注
0文章
44瀏覽量
3460
原文標(biāo)題:Ruby 3.2.0正式發(fā)布,新增多項(xiàng)改進(jìn)
文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論