從2015年就開始著手開發的Ruby 3,總算趕在2020年末,當作聖誕禮物送給所有開發者。Ruby 3的更新重點放在3個地方,效能、並行性和類型。

特別是效能,在Ruby 3有了大幅度的成長,Ruby的主要設計人松本行弘(Matz)在之前就為核心開發團隊設立目標,希望Ruby 3的速度可以是Ruby 2的3倍,並將這個計畫稱為Ruby3x3,而現在Ruby 3達成了這個目標。

開發團隊以Optcarrot基準測試來比較Ruby 2.0、Ruby 3.0以及Ruby 3.0 JIT的速度,Ruby 3.0 JIT在NES遊戲模擬工作負載的單執行緒效能,是Ruby 2.0的3倍。核心團隊對MJIT(Method-based JIT)進行了諸多更新,使得在Ruby 3.0,JIT可以提升遊戲、人工智慧或是呼叫少量方法的工作負載效能。

不過,MJIT會讓Rails應用程式變慢的問題仍然沒有解決。雖然Ruby 3.0已經大幅度減少JIT版本的程式碼大小,但是仍然未對Rails等,需要大量呼叫方法的工作負載進行最佳化,JIT會加重這類工作負載指令快取(i-cache)丟失的情況。官方曾在2年前發布Ruby 2.6時,提到這個問題,但是經過了這段時間,仍未找到良好的解決辦法,官方要開發者期待Ruby 3.1,他們會持續改進這個問題。

為了跟上多核心電腦發展的腳步,Ruby 3.0也開始提供並行(Concurrent)計算的能力,這個版本加入實驗性功能Ractor,提供類似並行計算演員模型(Actor Model)的實作,並讓開發者毋須擔心執行緒安全的問題。演員模型把程式執行比喻為演員,演員是並行運算的基本單元,每個演員接受到一則訊息,就可以做出一些決策,甚至建立更多的演員,傳送更多的訊息,並決定回應的訊息。

開發者可以在Ruby 3.0中,創建多個Ractor,並且平行執行這些Ractor,由於Ractor之間無法共享一般物件,只能透過交換訊息來溝通,因此得以讓開發者創建出執行緒安全的平行程式。經過官方的測量,平行版本的Ruby程式,速度是順序程式的3.87倍,但官方提到,Ractor尚未成熟,目前仍然被標記為實驗性功能,將來可能還會更改。Ruby 3.0還加入了Fiber Scheduler,執行輕量級的平行運算,讓應用程式不需要更改現有程式碼,就能獲得加速。

Ruby 3.0還加入RBS以及類型分析工具TypeProf,來提供靜態分析功能。RBS是一種用來描述Ruby程式類型的語言,其目的是要來支援常見的Ruby程式模式,讓開發者可以編寫聯合類型、方法重載和泛型等進階類型。而TypeProf則是捆綁在Ruby套件中的類型分析工具,目前TypeProf用作類型推斷,可讀取無類別註釋的Ruby程式碼,並且分析方法定義,以及使用方式,以產生RBS格式的類型特徵(Type Signature)雛形。目前TypeProf也還在實驗階段,僅支援部分Ruby語言,在偵測類型錯誤功能仍有限。

熱門新聞

Advertisement