Bytecode Alliance提案要擴充WebAssembly的核心功能,加入多值(Multi-Value),讓函式能夠回傳多種類型的值,而這也是要為WebAssembly加入介面類型(Interface Types)的先決條件。

由於WebAssembly核心有兩個限制,第一,函式只能回傳零個或是一個值,而且諸如模塊、if和迴圈等指令序列,無法使用任何堆疊的值,並且只能產生零個或是一個結果堆疊值。多值提案則是一個標準WebAssembly的擴充,可讓函式回傳任意數量的值,而指令序列也可以使用並且產生任意數量的堆疊值。

過去當WebAssembly核心產生多種堆疊值的時候,編譯器必須要用迂迴的方式進行處理,由於WebAssembly核心限制,因此無法將值留存在堆疊中,編譯器必須要使用臨時局部變數,以及local.get和local.set等指令來操作,但這樣的方式產生了許多不必要的成本,就程式碼大小來說,多值提案可減少程式碼的量。

多值提案除了有機會能夠為產生多值加入新的指令之外,也能更有效地回傳小結構。因為沒有多值回傳,相關的小結構會暫時放置在線性記憶體中,而利用多值回傳,則這些值不會轉存在線性記憶體中,而是保留在堆疊裡,由於WebAssembly堆疊通常比線性記憶體的載入和儲存,更經過最佳化,因此這樣的操作方式效能可能更好。

另外,多值提案最重要的價值在於支援WebAssembly介面類型,WebAssembly介面類型定義了多種高階值,像是字串、序列、紀錄以及變數。而多值則能實現多種過去無法實作的案例,像是當被呼叫的WebAssembly模組能夠回傳字串,WebAssembly就能夠在網頁上,直接且以最佳化的方式存取瀏覽器DOM方法(Method)。

目前Rust和WebAssembly的工具鏈,包括相關Rust函式庫Crates都已經支援多值,方便讓Rust專案可以編譯成使用多值的WebAssembly程式碼,另外,稱為Wasmtime這個建置在Cranelift程式碼產生器的WebAssembly Runtime,現在也增加了多值支援,能夠執行使用多值功能的WebAssembly程式碼。

熱門新聞

Advertisement