WebAssembly:意義、優勢、用例等
已發表: 2022-10-12WebAssembly 或 Wasm 是一種二進制代碼格式,用於創建可以在任何計算機架構上執行的程序。
該系統包括一個虛擬機和一個編譯器,該編譯器將計算機代碼從諸如 C 或 C++ 之類的編程語言翻譯成人類可讀的 .wat 和二進制 .wasm 格式。
WebAssembly 的最初目標是通過在瀏覽器中實現接近本機的執行速度,使程序員能夠為網頁開發高性能應用程序。 但現在這項技術似乎正在超越瀏覽器並進入雲端。
本指南向您展示了您需要了解的有關這項不斷發展的技術、其優勢和劣勢以及未來潛力的所有信息。
目錄
什麼是 WebAssembly?
WebAssembly 是一種二進制代碼格式,可以在虛擬機上運行,並且可以編譯成不同的語言。 它被設計為可移植的,可以在 Web 瀏覽器上運行或作為服務器應用程序運行。
WebAssembly 於 2017 年首次發布,自 2019 年起成為 W3C 推薦,由眾多貢獻者維護,包括 Mozilla、Google、Microsoft、Red Hat 等。
最初的目標是開發接近原生的執行速度,就像在瀏覽器中使用 C/C++ 應用程序一樣。 它還意味著是一種安全、開放標準、可調試和無版本的 Web 標準,並且向後兼容和 JavaScript 兼容。
WebAssembly 是如何工作的?
WebAssembly 被設計為運行時引擎,例如 Java 或 JavaScript,可以嵌入到瀏覽器或服務器環境中,以運行以 .wasm 二進製或 .wat 文本格式編譯的計算機代碼。
為了編寫用於執行 WebAssembly 的代碼,開發人員需要使用眾多支持的語言中的任何一種來編寫程序。 然後使用 AOT(提前)或 JIT(及時)的 WebAssembly 編譯器對其進行編譯。
此代碼可以在執行環境中完成大部分工作,但它不能訪問或修改瀏覽器的 DOM 對象。 任何此類交互都必須通過 JavaScript。
如何創建示例 WebAssembly 應用程序
只需幾個步驟即可為 Web 瀏覽器創建一個簡單的 Wasm 應用程序,如下所示:
- 下載並安裝 Emscripten SDK。
- 編寫您的示例helloworld.c代碼,或者如果您願意,可以在 C++/Rust 中執行。
- 在終端中運行emcc helloworld.c -s WASM=1 -s helloworld.html以使用 Emscripten 將代碼編譯為 WebAssembly。 它將創建您需要的 Wasm 二進製文件、HTML 和 JavaScript 文件(粘合代碼)。
- 通過您的網絡瀏覽器提供 helloworld.html 頁面。
WebAssembly 的優勢
採用 WebAssembly 及其相關技術的原因有很多,包括:
- 近乎原生的性能——WebAssembly 具有如此低級的設計,它提供的性能類似於 C 和 C++ 等低級語言。
- 安全性 – 該系統旨在通過將其隔離在具有有限系統訪問權限的虛擬環境中來確保安全。
- 開放標準——許多組織和個人都在為 WebAssembly 做出貢獻,它是 W3C 的官方推薦。
- 輕量級——WebAssembly 編譯成二進制代碼以在虛擬機中執行。 此代碼是可移植的,不需要或附帶系統文件。
- 多語言支持——超過 50 種語言可以編譯成 WebAssembly。
- 平台無關——WebAssembly 虛擬機是為每個架構設計的,以呈現相同的運行時環境。 開發人員所要做的就是為 WebAssembly 編寫代碼。
WebAssembly 的局限性
- 正在進行的工作——該標準仍在開發中,因此還有許多功能和改進尚未到來。
- 沒有垃圾收集——WebAssembly 仍然缺乏垃圾收集,儘管它可能很快就會實現。
- 沒有 DOM 訪問——你不能直接從 WebAssembly 訪問 Web 瀏覽器的 DOM,你需要通過 JavaScript。
WebAssembly 與 Java
Java 是最早的 WebAssembly 實現。 它被設計為一種一次性編寫、隨處運行的語言,但在此過程中出現了許多問題。

與 Java 一樣,WebAssembly 使用 RE(運行時環境)來執行其代碼,但與 Java 不同的是,您可以使用您選擇的語言編寫 WebAssembly。
WebAssembly 與 JavaScript
WebAssembly 在瀏覽器或其他宿主環境中執行,就像 JavaScript。 但是,在 JavaScript 以文本格式交付到執行環境並及時編譯的情況下,WebAssembly 具有文本和二進制格式。
在 Web 瀏覽器中,JavaScript 可以訪問 DOM,而 WebAssembly 則不能。 然而,在執行速度方面,WebAssembly 以接近原生的代碼執行速度擊敗了 JavaScript。
速度是 WebAssembly 的亮點,也是它非常適合多種用途的原因。 您可以使用 JavaScript 將 WebAssembly 加載到瀏覽器中,這兩個代碼可以一起運行並共享資源。
WebAssembly 與 Docker 與 Kubernetes
Docker 和 Kubernetes 是支持雲計算的兩種流行技術。 Docker 是一種容器技術,使開發人員能夠將應用程序及其所有系統依賴項打包到一個包中。 這使得在任何云環境中部署應用程序變得很容易,一秒鐘或更短的時間。
另一方面,Kubernetes 是一個開源系統,用於管理和部署容器化應用程序,例如 Docker、CRI-O、containerd 和任何 Kubernetes CRI(容器運行時接口)實現。 Kubernetes 還可以輕鬆跨多個服務器或虛擬機擴展雲部署。
從這個角度來看,WebAssembly 更類似於 Docker,可以使用 Kubernetes 作為容器化雲應用程序運行。 與 Docker 相比,它還提供了許多優勢,但可能不會取代它。
超越瀏覽器
起初,有網絡服務器。 您必須專用一台完整的機器作為服務器。 然後,出現了虛擬機或 VM,它們允許服務器僅在一個或多個 CPU 線程上運行。 不過,您必須擁有一個專用的虛擬機。
雲計算通過容器化應用程序,使僅在需要時啟動和運行服務器成為可能。 這降低了成本,因為您只需為使用的東西付費——不再需要專用機器。 但仍有一些問題。
首先,docker 文件可能有數 GB 大,這意味著啟動和其他管理問題的延遲很小。 然而,類似的 Wasm 文件可能只有幾 MB 大,因為它是預編譯的二進製文件。 這使其啟動時間比 Docker 快得多,非常適合某些時間關鍵型應用程序。
其次,WebAssembly 的設計意味著開發人員不必管理和分配系統資源,他可以使用他選擇的編程語言簡單地達到目的。
這些特性使 WebAssembly 非常適合運行雲微服務,儘管 Docker 應用程序仍然更適合需要對操作環境和文件系統進行更多控制的應用程序。
有關更多信息,WasmCloud 和 WasmEdge 等項目正在將 WebAssembly 開發為可行的計算平台。
Wasm 用例
鑑於 WebAssembly 的特殊性質,它有許多用例。 它們可以分為三大類; 瀏覽器內、瀏覽器外和混合設置。
瀏覽器內類型是不言自明的,瀏覽器外主要是指服務器、物聯網和雲部署,而混合是指兩者的混合。
以下是 Wasm 擅長的用例:
- 已經存在的高性能代碼——你可以移植到 WebAssembly 的古老但奇妙的代碼。
- 新的高性能代碼——你必須從頭開始設計和實現的代碼。
- 將桌面應用程序移植到網絡——這可能會開闢一種基於網絡的新型桌面解決方案,例如基於網絡的視頻編輯。
- 雲計算——與 Docker 和 Kubernetes 一起運行以尋找新的機會。
以下是 Wasm 擅長的具體應用和場景:
- 視頻和圖像編輯
- 遊戲設計
- 人工智能應用
- 虛擬和增強現實應用
- 音樂應用
- P2P 應用
- 服務器端應用程序
- 雲/集群計算
- 計算機輔助設計
- OS平台模擬
- 加密
- 本地網絡服務器
- 遠程桌面應用程序
- 科學可視化
- 智能手機上的混合原生應用
- 在物聯網設備上
支持的語言和框架列表
超過 50 種語言編譯為 WebAssembly,以下是一些最受歡迎的語言:
- C
- C++
- R
- 紅寶石
- 迅速
- 去
- 科特林
- 銹
- PHP
- Blazor – .NET 開發人員的框架。
- JwebAssembly – Java 字節碼和相關語言(如 JRuby、Jython、Groovy、Scala 和 Kotlin)的編譯器。
- Yew – 一個使用 WebAssembly 創建多線程 Web 應用程序的 Rust 框架。
- AssemblyScript – 一種專門用於創建 WebAssembly 代碼的語言。
- Grain——一種強類型的函數式語言。
- 元子
您可以在此處找到更多語言。
WebAssembly 運行時和工具列表
- 所有主流瀏覽器都支持 Wasm
- Pyodide – 瀏覽器上的 Python 運行時,帶有 Python 科學堆棧,包括 Pandas、NumPy、SciPy。
- 溫暖
- wagi – 用於微服務和 Web 應用程序
- Wasi – 模塊化系統界面
- WasmTime – 快速且安全的 WebAssembly 運行時。
- 瓦斯默
- 盧塞特
- wasmCloud – 雲環境
- Krustlet – 用於運行 Wasm 的 Kubernetes kublete,用 Rust 編寫。
- WasmEdge – 雲和邊緣運行時環境
結論
我們已經走到了 WebAssembly 之旅的終點,以及它對計算的影響。 正如你所看到的,它有很多希望。
儘管它仍在進行中,但仍在不斷發展中。 如果您有興趣,可以在此處、此處和此處找到更多信息。