Linux中國

WebAssembly 介紹

到底什麼是 WebAssembly?

WebAssembly,也叫 Wasm,是一種為 Web 優化的代碼格式和 API(應用編程介面),它可以大大提高網站的性能和能力。WebAssembly 的 1.0 版本於 2017 年發布,並於 2019 年成為 W3C 官方標準。

該標準得到了所有主流瀏覽器供應商的積極支持,原因顯而易見:官方列出的 「瀏覽器內部」用例 中提到了,其中包括視頻編輯、3D 遊戲、虛擬和增強現實、p2p 服務和科學模擬。除了讓瀏覽器的功能比JavaScript 強大得多,該標準甚至可以延長網站的壽命:例如,正是 WebAssembly 為 互聯網檔案館的 Flash 動畫和遊戲 提供了持續的支持。

不過,WebAssembly 並不只用於瀏覽器,目前它還被用於移動和基於邊緣環境的 Cloudflare Workers 等產品中。

WebAssembly 如何工作?

.wasm 格式的文件包含低級二進位指令(位元組碼),可由使用通用棧的虛擬機以「接近 CPU 原生速度」執行。這些代碼被打包成模塊(可以被瀏覽器直接執行的對象),每個模塊可以被一個網頁多次實例化。模塊內部定義的函數被列在一個專用數組中,或稱為 Table ,相應的數據被包含在另一個結構中,稱為 緩存數組 arraybuffer 。開發者可以通過 Javascript WebAssembly.memory() 的調用,為 .wasm 代碼顯式分配內存。

.wasm 格式也有純文本版本,它可以大大簡化學習和調試。然而,WebAssembly 並不是真的要供人直接使用。從技術上講,.wasm 只是一個與瀏覽器兼容的編譯目標:一種用高級編程語言編寫的軟體編譯器可以自動翻譯的代碼格式。

這種選擇正是使開發人員能夠使用數十億人熟悉的語言(C/C++、Python、Go、Rust 等)直接為用戶界面進行編程的方式,但以前瀏覽器無法對其進行有效利用。更妙的是,至少在理論上程序員可以利用它們,無需直接查看 WebAssembly 代碼,也無需擔心物理 CPU 實際運行他們的代碼(因為目標是一個虛擬機)。

但是我們已經有了 JavaScript,我們真的需要 WebAssembly 嗎?

是的,有幾個原因。首先,作為二進位指令,.wasm 文件比同等功能的 JavaScript 文件小得多,下載速度也快得多。最重要的是,Javascript 文件必須在瀏覽器將其轉換為其內部虛擬機可用的位元組碼之前進行完全解析和驗證。

而 .wasm 文件則可以一次性驗證和編譯,從而使「流式編譯」成為可能:瀏覽器在開始下載它們的那一刻就可以開始編譯和執行它們,就像串流電影一樣。

這就是說,並不是所有可以想到的 WebAssembly 應用都肯定會比由專業程序員手動優化的等效 JavaScript 應用更快或更小。例如,如果一些 .wasm 需要包含 JavaScript 不需要的庫,這種情況可能會發生。

WebAssembly 是否會讓 JavaScript 過時?

一句話:不會。暫時不會,至少在瀏覽器內不會。WebAssembly 模塊仍然需要 JavaScript,因為在設計上它們不能訪問文檔對象模型 (DOM)—— 主要用於修改網頁的 API。此外,.wasm 代碼不能進行系統調用或讀取瀏覽器的內存。WebAssembly 只能在沙箱中運行,一般來說,它能與外界的交互甚至比 JavaScript 更少,而且只能通過 JavaScript 介面進行。

因此,至少在不久的將來 .wasm 模塊將只是通過 JavaScript 提供那些如果用 JavaScript 語言編寫會消耗更多帶寬、內存或 CPU 時間的部分。

Web 瀏覽器如何運行 WebAssembly?

一般來說,瀏覽器至少需要兩塊來處理動態應用:運行應用代碼的虛擬機(VM),以及可以同時修改瀏覽器行為和網頁顯示的 API。

現代瀏覽器內部的虛擬機通過以下方式同時支持 JavaScript 和 WebAssembly:

  1. 瀏覽器下載一個用 HTML 標記語言編寫的網頁,然後進行渲染
  2. 如果該 HTML 調用 JavaScript 代碼,瀏覽器的虛擬機就會執行該代碼。但是...
  3. 如果 JavaScript 代碼中包含了 WebAssembly 模塊的實例,那麼就按照上面的描述獲取該實例,然後根據需要通過 JavaScript 的 WebAssembly API 來使用該實例
  4. 當 WebAssembly 代碼產生的東西將修改 DOM(即「宿主」網頁)的結構,JavaScript 代碼就會接收到,並繼續進行實際的修改。

我如何才能創建可用的 WebAssembly 代碼?

越來越多的編程語言社區支持直接編譯到 Wasm,我們建議從 webassembly.org入門指南 開始,這取決於你使用什麼語言。請注意,並不是所有的編程語言都有相同水平的 Wasm 支持,因此你的工作量可能會有所不同。

我們計劃在未來幾個月內發布一系列文章,提供更多關於 WebAssembly 的信息。要自己開始使用它,你可以報名參加 Linux 基金會的免費 WebAssembly 介紹在線培訓課程。

這篇WebAssembly 介紹首次發布在 Linux Foundation – Training

via: https://www.linux.com/news/an-introduction-to-webassembly/

作者:Dan Brown 選題:lujun9972 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國