今天,我們宣佈在 Cloudflare Workers 上提供對 WASI(WebAssembly 系統介面)的實驗性支援,並在 wrangler2 中提供支援,以打造輕鬆愉悅的使用體驗。對於整個 WebAssembly 生態系統,我們仍然激動不已,並渴望隨著標準的開發而對其進行採用。

WebAssembly 快速入門

那麼 WASI 到底是什麼?若要瞭解 WASI,以及為什麼我們對其感到興奮,則有必要快速回顧一下 WebAssembly 及圍繞它的生態系統。

WebAssembly 向我們承諾了這樣一個未來︰用程式設計語言編寫的程式碼可以編譯成通用的二進位格式,並以接近本機的速度在安全的沙盒中執行。雖然 WebAssembly 在設計時只考慮了瀏覽器,但該模型迅速擴展至伺服器端平台,例如 Cloudflare Workers(自 2017 年以來一直支援 WebAssembly)。

WebAssembly 最初設計為與 Javascript 一起執行,並且要求開發人員直接與 Javascript 互動,以便存取沙盒之外的世界。換句話說,WebAssembly 沒有針對與檔案互動、存取網路或讀取系統時鐘等之類的 I/O 任務提供任何標準介面。這意味著,如果您想回應來自外部世界的事件,則需要由開發人員在 JavaScript 中處理該事件,並直接呼叫從 WebAssembly 模組匯出的函數。同樣,如果您想在 WebAssembly 中執行 I/O,則需要在 Javascript 中實作該邏輯,並將其匯入 WebAssembly 模組。

Emscripten 等自訂工具鏈或 wasm-bindgen 等程式庫已經應運而生,使得此操作更為便捷,但它們與語言相關,並且會增加大量的複雜性和臃腫性。我們甚至使用 wasm-bindgen 建置了自己的庫 workers-rs,試圖讓在 Rust 中編寫應用程式,感覺就像在 Worker 中一樣是原生的——但這已經證實為不僅難以維護,還需要開發人員編寫特定於 Workers 的程式碼,並且不可移植到 Workers 生態系統之外。

我們需要做得更多。

WebAssembly 系統介面 (WASI)

WASI 旨在提供一個標準介面,任何編譯到 WebAssembly 的語言都可以適用。您可以在這裡閱讀 Lin Clark 的原始貼文,其中使用程式碼卡通圖和全方位的內容進行了很好的介紹。簡而言之,Lin 將 WebAssembly 描述為「概念機器」的彙總語言,而 WASI 是「概念作業系統」的系統介面

系統介面的這種標準化為現有工具鏈將現有程式碼庫交叉編譯到 wasm32-wasi 目標鋪平了道路。目前已經取得了巨大的進展,特別是在 Clang/LLVM 中使用了 wasi-sdk 和 Rust 工具鏈。這些工具鏈運用 Libc 的一個版本,可提供在 WASI「系統呼叫」之上建置的 POSIX 標準 API 呼叫。甚至在 TinyGo 和 SwiftWasm 等更多外緣工具鏈中已基本實作。

實際上這意味著,您現在編寫的應用程式不僅能夠與任何實作該標準的 WebAssembly 執行階段執行時間互操作,還能夠與任何 POSIX 相容系統互操作!這意味著完全相同的「Hello, world!」可在本地 Linux/Mac/Windows WSL 機器上執行。

展示程式碼

WASI 聽起來很棒,但真的會讓我的生活更輕鬆嗎?想必這是大家的疑問。我們舉例來說明這在實際中是如何運作的。

詳情請至The Cloudflare Blog

熱門新聞

Advertisement