程式語言Ruby依照慣例在聖誕節推出更新,最新的Ruby 3.2.0加入基於WASI的WebAssembly支援,擴大Ruby可以運作的平臺,而程序內JIT編譯器YJIT經過一年測試,現在正式成為生產就緒的功能,另外,Ruby 3.2.0改進正規表示式功能,使應用程式更能夠抵抗正規表示式DoS攻擊(ReDoS)。

Ruby 3.2.0透過WASI提供WebAssembly支援,這使得CRuby二進位檔案將可以在網頁瀏覽器、無伺服器邊緣或其他類型的WebAssembly/WASI嵌入器中運作。官方提到,這項功能將鼓勵開發人員在WebAssembly環境使用CRuby,其中一個使用案例便是TryRuby互動編輯器對CRuby支援,開發者已經可以在網頁瀏覽器用到原汁原味的Ruby。

WebAssembly最初的發展用途,是要作為網頁應用程式安全且高效的開發語言,但由於一般應用程式也有高效且安全的需求,所以WASI(WebAssembly System Interface)便誕生,讓WebAssembly應用程式在沒有系統介面的虛擬機,也能夠與作業系統通訊,而Ruby提供WebAssembly/WASI支援,使開發人員能夠使用Ruby,開發可在WebAssembly環境中運作的應用程式。

官方提到,因為WASI與WebAssembly還在發展,同時也基於部分安全理由,因此缺少一些能夠實作Fiber、異常處理和垃圾回收的功能。所以CRuby透過二進位轉換技術Asyncify,控制使用者空間的執行,彌補功能空缺。

另外,Ruby還在WASI上建構了虛擬檔案系統,使開發者可以更簡單地將Ruby應用程式打包成.wasm檔案,簡化Ruby應用程式的發布。

Ruby 3.1.0所加入的程序內JIT編譯器YJIT,經過一年的測試,官方認為已經足夠穩定,因此在Ruby 3.2.0轉變成為正式功能。YJIT主要源自於Shopify,用於改善Ruby on Rails應用程式的技術,當初Ruby 2.6加入了MJIT(Method-based JIT)編譯器,希望能達到Ruby 3的速度是Ruby 2三倍的目標,但因為MJIT的諸多限制,再加上MJIT沒有針對Rails這類需要大量呼叫方法的工作負載最佳化,導致實際應用程式無法獲得MJIT的加速。

而YJIT是重新建構的JIT編譯器,與現有Ruby程式碼幾乎完全相容,具有高速預熱和效能提升等優點,在許多測試基準都有不少的速度提升。

Ruby 3.2.0所帶來的正式版YJIT擁有多項功能改進,現在YJIT可以支援Linux、MacOS、BSD和其他UNIX平臺上的x86-64和arm64/aarch64 CPU,這個版本可以被用於Apple M1/M2、AWS Graviton、Raspberry Pi 4環境,而Ruby 3.2.0的YJIT也比Ruby 3.1.0更快,記憶體使用量大概只有測試版本的三分之一。整體而言,以yjit-bench基準進行測試,YJIT比Ruby直譯器還要快41%。

開發團隊在Ruby 3.2.0針對ReDoS加入緩解措施。因為正規表示式比對可能花費超過預期的時間,當應用程式能夠接受不受信任的輸入,用於低效能的正規表示式比對,攻擊者便有機會加以利用,進行有效的DoS攻擊。

而Ruby 3.2.0的正規表示式比對演算法使用記憶化(Memoization)技術,因此效能獲得改進,90%的比對都可以在線性時間內完成,除此之外,開發者現在也可以利用正規表示式逾時功能,限制正規表示式的執行時間,以緩解正規表示式DoS攻擊。

熱門新聞

Advertisement