Wasm 並非真正的堆疊機

Hacker News·

我認為 WebAssembly 與其說是堆疊機,不如說是一個將操作泛化為複合表達式的暫存器機,因為它缺乏像 dup 或 swap 這種真正的堆疊操作指令,導致非瑣碎的運算仍須依賴區域變數。

背景

這篇文章探討了 WebAssembly(Wasm)在設計上是否真如官方宣稱般屬於「堆疊機器」(Stack Machine)。作者透過手寫指令的經驗發現,Wasm 缺乏傳統堆疊語言(如 Forth 或 JVM)中常見的堆疊操作指令,如複製或交換元素,這使得 Wasm 在處理複雜運算時必須頻繁依賴區域變數,本質上更接近一種帶有複合表達式能力的暫存器機器。

社群觀點

在 Hacker News 的討論中,社群對於 Wasm 的定位展現了多元的技術觀察。部分開發者認同作者的觀點,指出缺乏 dup(複製頂端元素)等指令在生成精簡代碼時確實令人困擾,雖然可以透過 local.tee 指令達到類似「儲存並保留在堆疊」的效果,但這本質上仍是將堆疊與區域變數綁定,而非純粹的堆疊操作。有留言者進一步分析,Wasm 的設計初衷可能是為了簡化非優化編譯器的實現,或是為了讓指令集能更自然地對應到抽象語法樹(AST),這也解釋了為何 Wasm 的文字格式(WAT)能以類似 LISP 的 S-表達式來呈現。

然而,也有不少觀點認為這種「不純粹」反而是 Wasm 的優勢。一位正在開發 Wasm 轉 C 語言編譯器的開發者提到,正是因為 Wasm 這種受限的堆疊行為,讓編譯器能保證表達式的完整性,無需頻繁處理堆疊的重置或丟棄,使得轉換過程更為直接。另一派意見則指出,現代虛擬機的區分界線已趨模糊,即便被稱為暫存器機器的系統通常也保有堆疊結構,而 Wasm 引入多值返回(multi-value)擴充後,已解決了早期控制流無法有效與堆疊互動的問題。

討論中亦出現了對 Wasm 現狀的省思。有評論者感嘆 Wasm 並未如初期宣傳般徹底改變軟體生態,例如讓 Electron 變得極速或實現真正的語言大同。但技術層面上,開發者們仍積極利用其特性進行跨語言編譯,例如將 SQLite、QuickJS 或 Zig 撰寫的程式庫轉譯為 Go 或 C 語言。整體而言,社群傾向於將 Wasm 視為一種為了效能與編譯便利性而折衷的產物,其「堆疊機器」的標籤更多是為了便於理解的技術隱喻,而非嚴格的架構定義。

延伸閱讀

在討論串中,開發者分享了多個實用的轉譯工具與深度分析資源。針對 Wasm 的編譯應用,有將 Wasm 轉換為 C 語言的技術探討,以及將其轉譯為 Go 語言的開源專案 wasm2go。此外,留言中也推薦了 troubles.md 系列文章,該系列對 Wasm 不是堆疊機器的議題有更深入且具批判性的架構分析。對於想了解 Wasm 文字格式實作的人,社群也提供了基於 Scheme 實作的 webracket 專案作為參考範例。

Hacker News

相關文章

  1. 讓 WebAssembly 成為 Web 平台的一等公民語言

    大約 2 個月前

  2. Rust 編寫 WebAssembly 的實戰筆記

    大約 2 個月前

  3. Show HN:使用 WebAssembly 沙盒化不受信任的程式碼

    3 個月前

  4. 透過 WASM 在瀏覽器中運行 Pebble OS

    3 個月前

  5. Watgo:Go 語言專用的 WebAssembly 工具集

    18 天前

其他收藏 · 0