WASM 原生時代已經到來 | 解讀 WebAssembly 的 2022

Ending定律:一切可編譯為 WebAssembly 的,終將被編譯為 WebAssembly(Any application that can be compiled to WebAssembly, will be compiled to WebAssembly eventually)。

作者 | 柴樹杉 責編 | 夢依丹

引子:作者在 2018 年寫作《WebAssembly 標準入門》時,有幸邀請到 CSDN和極客幫的創始人蔣濤先生為該書作序,當時蔣濤先生就對 WebAssembly 的技術做出了高度評價。2022 年我們針對 WebAssembly 開源了凹語言,CSDN 平臺也在第一時間提供了報道。在此一併感謝CSDN 平臺對 WebAssembly 技術推廣的支持!

WebAssembly 作為一種新興的網頁虛擬機器標準,它的設計目標包括:高可移植性、高安全性、高效率。2018 年 WebAssembly 第一個規範草案誕生,2019 年成為 W3C 第四個標準語言。到了 2022 年底可以說我們已經進入了WASM 原生時代……

Ending 定律和 WASM 原生

Ending 定律和 WASM 原生

1、什麼是 Ending 定律

  • Ending’s law: 「Any application that can be compiled to WebAssembly, will be compiled to WebAssembly eventually.」

  • Ending 定律:「一切可編譯為 WebAssembly 的,終將被編譯為 WebAssembly。」

Ending 定律也稱為終結者定律,它是 Ending 在 2016 年 Emscripten 技術交流會上針對 WebAssembly 技術給出的斷言。Ending 定律的威力不僅僅在語言層面。WebAssembly 是第一個虛擬機器世界標準,以後將人手至少一個 WASM 虛擬機器。不過和之前被大家鄙視的 JavaScript 語言大舉入侵各個領域的情況不同,這次 Python、Ruby 這些語言將徹底擁抱 WebAssembly 技術,因為它是一個更底層、也更加開放的新興生態平臺。從 Ending 定律可以預測 WASM 原生時代遲早都會到來。

2、什麼是 WASM 原生

WASM 原生可以類比雲原生的定義:就是天生就是為 WebAssembly 平臺設計的程序和語言。比如專門為 WebAssembly 設計的 AssemblyScript 語言和 凹語言就是 WASM 原生的程式語言。如果一個應用天生就是考慮了 WebAssembly 的生態支持,那麼就是 WASM 原生的應用。一個 WASM 原生應用很容易支持純瀏覽器環境,因此不支持純瀏覽器環境的應用大概率不是 WASM 原生。

現在 Docker 已經開始支持 WASM 程序,因此 WASM 原生軟體天然也是雲原生的軟體,但是反之則不能成立。而云原生因為受限於雲的環境、導致其應用的場景和領域有較大的限制,比如雲原生應用強依賴網路因此無法在很多微控制器環境、甚至是本地環境運行,因此雲原生更多是在網際網路企業流行。但是 WASM 原生的程序則可以輕鬆在 Arduino 等受限環境、本地桌上型電腦機環境、個人智慧手機環境和 Kubernetes 等雲原生環境執行。可以說未來 WASM 原生應用將無處不在!

WebAssembly 簡史

WebAssembly 簡史

WebAssembly(簡稱 WASM)是 W3C 定義的第 4 個標準,是 Web 的第四種語言。說 WebAssembly 是一門程式語言,但實際上它更像一個編譯器,其實它是一個虛擬機器,它還包含了一門低級組合語言和對應的虛擬機器體系結構,而 WebAssembly 這個名字從字面理解就說明了一切:「Web 的組合語言」。簡而言之、WebAssembly 是一種新興的網頁虛擬機器標準,它的設計目標包括:高可移植性、高安全性、高效率(包括載入效率和運行效率)、儘可能小的程序體積。

1.1 Emscripten 項目

1.1 Emscripten 項目

WebAssembly 的前身是 Mozilla 創建的 Emscripten 項目(2010年)——通過將 C/C++ 通過 LLVM 編譯到 JavaScript 的 asm.js 子集來提速!JavaScript作為弱類型語言,由於其變數類型不固定,使用變數前需要先判斷其類型,這樣無疑增加了運算的複雜度、降低了執行效能。因為 asm.js 僅包含可以預判變數類型的數值運算,有效的避免了 JavaScript 弱類型變數語法帶來的執行效能低下的頑痾。根據測試,針對 asm.js 最佳化的引擎執行速度和 C/C++ 原生應用在一個數量級。

2015 年 6 月 Mozilla 在 asm.js 的基礎上發佈 WebAssembly 項目,隨後Google、Microsoft、Apple 等各大主流的瀏覽器廠商均大力支持。WebAssembly 不僅擁有比 asm.js 更高的執行效能,由於使用了二進位制編碼等一系列技術,WebAssembly 編寫的模組有更小的體積和更高的解析速度。目前不僅 C/C++ 語言編寫的程序可以編譯為 WebAssembly 模組,Go、Kotlin、Rust、Python、Ruby、Node.js、AssemblyScript、凹語言等新興的程式語言都開始對 WebAssembly 提供支持。

1.2 WebAssembly 1.0 草案

WebAssembly 技術自誕生之日就進入高速發展階段。在 2018 年 7 月 WebAssembly 1.0 草案正式發佈,在 2019 年 12 月正式成為 W3C 國際標準,成為與 HTML、CSS 和 JavaScript 並列的唯四前端技術。2019 年,同樣誕生了 WASI(WebAssembly System Interafce)規範,用於將基本的系統調用帶入到WASM生態。2022年Docker對WASM提供支持,目前 WebAssembly 已經是一個獨立的生態。

1.3 WebAssembly 生態大圖

下面是 「WebAssembly 將引領下一代計算正規化」 展示的生態大圖:

可以看到從工具鏈、基礎設施、到應有和 Web3 均有涉及,生態已經非常豐富。正和 JVM 構建的生態類似,WebAssembly 也在構建自己的龐大生態。

WASM 社區 22 年的變化

WASM 社區 22 年的變化

2022 年,國內外自媒體社區對 WebAssembly 的評價態度可謂是完美遵循了欲揚先抑的劇本。先是有熱文爆大佬 WebAssembly 創業失敗引發質疑,然後是傳出社區分裂、應用爭議再引發炒錯的方向等爭論,然後隨著 Docker 對 WASM 支持的預覽版發佈帶來風向 180 度大轉彎,簡直是要把不明真相的群眾徹底忽悠拐了。其實 WebAssembly 從誕生之日起,真正的從業人員始終在穩步推進,完全沒有自媒體想象和策劃的這些劇本演義。

3.1 WebAssembly 2.0 草案

4 月 20 日,W3C 公佈了 WebAssembly 2.0 的第一批公共工作草案。主要包含向量類型、引用類型、多返回值、多 Table 支持、Table 和記憶體指令增強等。向量類型的支持可以用於最佳化純計算類型的併發程序、引用類型可以用於和外部的瀏覽器 DOM 對象等更好的互動、多返回值可以可以簡化某些程序的表示(比如凹語言後端依賴該特性)、多 Table 支持可能用於靈活支持多模組連接等。可以說 WebAssembly 標準是該生態的統一基準平面,而且這些特性的實現已經相對普及,可以作為實驗特性試試用。

完整文件參考:https://www.w3.org/TR/wasm-core-2/

3.2 Docker 支持 WebAssembly

2019 年,Docker 創始人 Solomon Hykes 發佈了一條推文,他說如果 2008 年就誕生 WebAssembly 和 WASI 的話,Docker 就沒有必要誕生了。

其實作者在 2018 年寫作《WebAssembly 標準入門》時, 通過推演也得出過類似的結論:當時的結論是 WebAssembly 更大的生命力在瀏覽器之外,如果配合檔案系統、網路系統將得到一個更為迷你的作業系統無關的運行平臺。

Docker 與 WasmEdge 合作創建了一個 containerd shim,該運行時支持運行 WASM 程序。下面是 Docker 對 WASM 的支持原理圖:

Docker 執行 wasm 需要指定一些額外參數:

$ docker run -dp 8080:8080 \--name=wasm-example \--runtime=io.containerd.wasmedge.v1 \--platform=wasi/wasm32 \michaelirwin244/wasm-example

首先 runtime 參數指定 wasmedge 運行時,然後 platform 指定採用 wasi/wasm32 規範(指定有哪些宿主 api)。

完整的資訊可以參考 Docker 的官方文件:https://docs.docker.com/desktop/wasm/

3.3 SQLite3 官方支持 WebAssembly

SQLite3 作為一個純粹的 C 語言庫,其實在 WebAssembly 標準誕生之前就可以通過 Emscripten 技術將 C 程式碼編譯為 asm.js。因此,網上很早就有在瀏覽器的 JS 版本、甚至直接通過 Emscripten 輸出 WebAssembly。不過這次是 SQLite3 官方提供了對 WebAssembly 的支持,這表示 WebAssembly 在 SQLite 社區完全進入工業級應用階段!

根據官網介紹,主要有 4 個目標:

  • 綁定一個低級的 sqlite3 API,在使用方面儘可能接近原生 API;

  • 更高級別的物件導向風格 API,類似於 sql.js 和 node.js 樣式的實現;

  • 基於 Worker 的 API,以支持多執行緒環境更容易使用 SQLite 功能;

  • 基於 Worker API 的 Promise 包裝,對使用者完全隱藏了跨執行緒通訊方面複雜性。

而不在此列的特性包括不支持 UTF 16、和清除老舊特性等。簡而言之,在提供底層 API 能力的同時,針對物件導向、多執行緒等環節提供簡單易用的 API。完整的介紹請參考:https://sqlite.org/wasm

3.4 Ruby 3.2 支持 WebAssembly

12 月發佈的 Ruby 3.2 也增加了基於 WASI 的 WebAssembly 支持。使得 CRuby 二進位制內容可用於瀏覽器、Serverless Edge、以及其他 WebAssembly/WASI 嵌入環境。目前,此功能已通過除 Thread API 之外的 basic 和 bootstrap 測試套件。

雖然目前基於安全原因,還缺少一些功能來實現纖程、異常和垃圾回收的特性,但是這已經讓使用者可以在瀏覽器中嘗試原生的 CRuby:https://try.ruby-lang.org/playground/

3.5 Python 3.11 支持 WebAssembly

和 Ruby 社區的目標類似,Python 社區也在 4 月啟動在 Python 3.11 增加對 WebAssembly 的支持。Python 3.11 對 wasm32-emscripten 和 wasm32-wasi 提供了支持,從而也實現了在瀏覽器執行 Python 的夢想。

具體細節可參考以下文件:

  • https://pythondev.readthedocs.io/wasm.html

  • https://docs.python.org/3/library/intro.html#webassembly-platforms

  • https://speakerdeck.com/tiran/python-3-dot-11-in-the-web-browser-a-journey-pycon-de-2022-keynote

因為有了 WebAssembly 魔法加持,Ruby 和 Python 等手稿語言也終於可以在瀏覽器玩耍了。

3.6 為 WebAssembly 而生的凹語言

WebAssembly 草案剛剛發佈不久,國外就誕生了專門為其設計的 AssemblyScript 語言。在2022年7月,國內 Gopher 也發起了針對 WebAssembly 平臺的凹語言。目前凹語言不僅僅提供了線上的 Playground,還上線了用凹語言開發的貪吃蛇小遊戲。希望新興的語言可以為 WebAssembly 注入更多的活力。

  • 凹語言主頁:https://wa-lang.org/

  • 凹語言倉庫:https://github.com/wa-lang/wa

  • 凹語言開發的貪吃蛇:https://wa-lang.org/wa/snake/

WASM 虛擬機器實現

WASM 虛擬機器實現

對於 JavaScript 使用者,直接通過瀏覽器內建的 WebAssembly 模組即可,或者是通過 Node.js 提供的模組 API。我們這裡簡要介紹的是瀏覽器環境之外的 WASM 虛擬機器實現,這裡介紹的主要有 C/C++、Rust 和 Go 語言幾類實現。總體來說,大家完全不需要擔心 WASM 虛擬機器的選擇和切換代價,只要遵循 WASM 標準原則切換虛擬機器就和換個滑鼠一樣容易。

4.1 C/C++ 語言 – WasmEdge、wasm3 和 WAMR

WasmEdge 和 wasm3 是 C/C++ 語言實現的具有代表性的兩個 WebAssembly 虛擬機器(沒有包含 V8 的虛擬機器)。

WasmEdge 可以說是目前最受關注的 WebAssembly 虛擬機器實現,因為它不僅僅是 CNCF 推薦的 WASM 虛擬機器,更是 Docker 內建的 WebAssembly 虛擬機器。WasmEdge 是由美國的袁鈞濤(Michael Juntao Yuan)發起,是由 CNCF 託管的雲原生 WebAssembly runtime。它廣泛應用於邊緣運算、汽車、Jamstack、Serverless、SaaS、服務網格,乃至區塊鏈應用。WasmEdge 可以進行 AOT (提前編譯)編譯器最佳化,是當今市場上最快的 WebAssembly runtime 之一。可以預計,隨著 Docker Wasm 的普及,WasmEdge 將成為最流行的 WASM 虛擬機器實現之一。

  • WasmEdge:https://wasmedge.org

  • 袁鈞濤(Michael Juntao Yuan):https://github.com/juntao

wasm3 是 C 實現的 WebAssembly 引擎,可運行在嵌入式設備上。因為需要的資源比較少,目前可以運行在Arduino和樹莓派環境。

  • wasm3 倉庫:https://github.com/wasm3/wasm3

由 Mozilla、英特爾、RedHat 和 Fastly 公司宣佈成立位元組碼聯盟(Bytecode Alliance)開發的 WebAssembly Micro Runtime(WAMR)也是一個非常優秀的虛擬機器實現,其提供AOT、JIT等多種不同的最佳化手段,底層也是依賴LLVM後端的一些能力。

  • WAMR的倉庫:https://github.com/bytecodealliance/wasm-micro-runtime

4.2 Rust 語言 – wasmer 和 wasmtime

wasmer 和 wasmtime 是 Rust 實現的兩個流行的 WebAssembly 虛擬機器。根據 2022 年 7 月的調查報告(300人提交問卷)顯示,來自位元組碼聯盟的 wasmtime 最流行、其次為 wasmer。不過從長期看,作者推測 WasmEdge 將隨著 Docker/wasm 成為瀏覽器外最流行的 Wasm 虛擬機器實現。

  • wasmtime 倉庫:https://github.com/bytecodealliance/wasmtime

  • wasmer 倉庫:https://github.com/wasmerio

4.3 Go 語言 – WaZero

WaZero 是純 Go 語言實現的 WebAssembly 虛擬機器,因此不需要依賴 CGO 特性。目前凹語言內建的就是 WaZero 虛擬機器。

倉庫地址:https://github.com/tetratelabs/wazero

另外,國內張秀宏著的《WebAssembly 原理與核心技術》討論了用 Go 語言如何實現 WebAssembly 虛擬機器,感興趣的讀者可以參考。

支持 WASM 的程式語言

支持 WASM 的程式語言

WebAssembly 允許開發者用幾十種程式語言(包括 AssemblyScript、C/C++、Rust、Golang、JavaScript 和凹語言等)編寫應用程序。支持 WASM 的程式語言主要分為 3 類:

  1. 首先是專門為 WebAssembly 設計的新語言,比如 AssemblyScript 和凹語言等;

  2. 其次是將語言編譯到 WebAssembly 目標平臺,比如 C/C++、Rust、Golang 這類語言(和第一類有一定重疊);

  3. 最後是將語言的虛擬機器或直譯器編譯到 WebAssembly 平臺,比如 Lua、JavaScript、Ruby和Python這些。

除此之外,還有一些其它的領域語言也在支持 WebAssembly 平臺。

  • 支持 WebAssembly 的語言列表:https://github.com/appcypher/awesome-wasm-langs

5.1 JavaScript —— WebAssembly 替換的目標

JavaScript 開始其實是 WebAssembly 要替換的目標。但是隨著 WasmEdge 等引擎支持 QuickJS 的直譯器,JavaScript 逐漸變成了 WebAssembly 平臺之上的最流行的程式語言。這裡除了有 JavaScript 語言使用者比較多的因素,同時 JavaScript 的單執行緒模型也非常契合 WebAssembly 的單執行緒模型(只是相對於 Python 等支持多執行緒的手稿語言,套娃的性能損失至少 10 倍起)。JavaScript 和 WebAssembly 無限套娃的事情真在切實發生,同時 JavaScript 也失去了瀏覽器中的霸主地位,降級為普通公民。

5.2 AssemblyScript —— 為 WebAssembly 而生的 TypeScript

AssemblyScript 是一個把 TypeScript 語法搬到 WebAssembly 的編譯器。它目前是 WebAssembly 環境非常受歡迎的一個語言。AssemblyScript 只允許 TypeScript 的有限功能子集,因此不需要花太多時間就可以上手。同時它與 JavaScript 非常相似,所以 AssemblyScript 使 Web 開發人員可以輕鬆地將 WebAssembly 整合到他們的網站中,而不必使用完全不同的語言。

下面是一個 AssemblyScript 程序,和 TypeScript 幾乎是一樣的:

export function add(a: i32, b: i32): i32 {return a + b;}

不過 AssemblyScript 只有 WebAssembly 支持的基本類型,而複雜的類型通過內建庫實現。同時為了提供靈活的擴展能力,AssemblyScript 編譯器提供了擴展能力。

  • AssemblyScript 主頁:https://www.assemblyscript.org/

5.3 C/C++ —— WebAssembly 為其而生

C/C++ 是 WebAssembly 該技術前身 Emscripten 誕生時的初始目標。Emscripten 項目,嘗試通過 LLVM 工具鏈將 C/C++ 語言編寫的程序轉譯為 JavaScript 程式碼,在此過程中創建了 JavaScript 子集 asm.js,asm.js 僅包含可以預判變數類型的數值運算,有效的避免了 JavaScript 弱類型變數語法帶來的執行效能低下的頑痾。其中的核心魔法使 WebAssembly 和 C/C++ 採用相似的線性記憶體模型,提供為 JIT 提供了轉化為相似程式碼的可能。

5.4 Rust 語言 —— 基於 LLVM 的輸出 WebAssembly 能力

Rust 和 Emscripten 都誕生於 Mozilla 公司,因此目前 WebAssembly 社區和 Rust 社區有著很大的重疊部分。很多 Rust 實現的 WebAssembly 虛擬機器,同時 Rust 編譯器藉助 LLVM 的能力輸出 WebAssembly 模組。可以說 Rust 技術的發展和抱住 WebAssembly 這個大腿有極大的關係。當然,因為 Rust 兼容 C/C++ 記憶體模型同時又無 GC 依賴,使得 Rust 可以構造出非常輕量高效的 WASM 模組。不過 Rust 本身的超高門檻也為初學者帶來了極大的挑戰。

5.5 Go 語言 —— 獨立的 WebAssembly 後端

Go 語言作為雲端運算等領域的主流語言,從 Go1.11 開始,WebAssembly 開始作為一個標準平臺被官方支持,這說明了 Go 語言官方團隊也認可了 WebAssembly 平臺的重要性和巨大潛力。目前 Go 語言社區已經有眾多與 WebAssembly 相關的開源項目,比如有很多開源的 WebAssembly 虛擬機器就是採用 Go 語言實現的。不過 Go 語言對 WebAssembly 被詬病的一個方面是官方生成的 WASM 檔案不是 wasi 規範,同時因為 GC 等特性導致 WASM 體積比較大。

社區有個針對嵌入式環境等 TinyGo 變種,後端同樣藉助 LLVM 的能力輸出 WebAssembly 模組。不過因為 LLVM 的依賴非常重,導致 TinyGo 的單個命令列將近 100MB、同樣的原因導致無法方便在瀏覽器環境使用。可以說 TinyGo 本身並不 Tiny,只是其目標平臺是針對 Tiny 的微控制器和 WASM 等平臺。

5.6 凹語言 —— 為 WebAssembly 而生的國產語言

凹語言是為 WebAssembly 而設計的新語言,是國內 Gopher 發起的純社區構建的開源國產程式語言項目。同時凹語言也是國內第一個實現純瀏覽器內編譯、執行全鏈路的自研靜態類型的編譯型通用程式語言。凹語言不僅僅點亮了 Arduino Nano 33 開發板,同時也通過實現了 BrainFuck 虛擬機器證明了其圖靈完備的能力,最近還驗證了通過凹語言開發 Web 版本貪吃蛇的能力。

5.7 KCL —— 向 WebAssembly 遷移的領域語言

Kusion 配置語言(KCL)是由來自螞蟻的徐鵬飛負責設計的、基於約束的記錄及函數語言。KCL 通過成熟的程式語言技術和實踐來改進對大量繁雜配置比如雲原生場景的編寫,致力於構建圍繞配置的更好的模組化、擴展性和穩定性,更簡單的邏輯編寫,以及更快的自動化集成和良好的生態延展性。作為領域語言,KCL 目前也是基於 LLVM 的能力輸出 WebAssembly 模組,通過 WebAssembly 模組良好的隔離性和跨平臺特性,KCL 可以輕易實現在瀏覽器當中運行。

KCL 語言的主頁:https://kcl-lang.io/

5.8 其它支持 WASM 的語言

比如 Zig 等一些語言也支持 WASM,本質上它們和 C/C++/Rust/TinyGo 一樣,都是依賴 LLVM 的輸出 WASM 的能力。當然,也有一些採用類似 AssemblyScript 路線,通過 Binaryen 輸出 WASM。還有一些特殊場景,比如 OPA 的 Rego 是獨立實現輸出 WASM 的能力。WASM 雖然和 C/C++ 採用相似的記憶體模型,但是依然有一些細微的差異,如果希望發揮其最大優勢需要從語言設計和後端輸出兩個方便考慮,這也是很多新語言正在探索的方向。

WASM的一些場景

WASM的一些場景

6.1 Web 應用

隨著 WebAssembly 的成熟,Web 應用不在是 JavaScript 的天下。比如之前就有國外大牛基於 WASM 技術將 Windows 2000 搬到了瀏覽器中。而像 AutoCAD 和Google地球這些重量級的應用均通過 WebAssembly 支持了瀏覽器。

當然,不僅僅是重量級的 Web 應用,隨著 WASM 原生程式語言的成熟,可以預期會有更多的其他語言開發的 Web 應用。比如,下面是採用凹語言開發的貪吃蛇小遊戲就是基於 WebAssembly:

  • 貪吃蛇遊戲線上地址:https://wa-lang.org/wa/snake/

6.2 Web3 和元宇宙應用

隨著 Web3 和元宇宙概念的興起,WebAssembly 也將作為其中的關鍵技術,甚至是基石技術。目前 Web3 相關的區塊鏈行業有大量的技術基於 WebAssembly 構建,甚至專門定製 EWASM 技術標準。而元宇宙作為數字化和現實完全融合的新社會生態,其底層的軟體系統更是非常依賴純開源軟體和平臺無關的通用技術,因此作者推測 GPL 開源協議和 WebAssembly 技術將會是元宇宙的兩大關鍵支柱。

6.3 Serverless 應用

Serverless 強依賴高度最佳化的冷啟動,Wasm 非常適合作為下一代無伺服器平臺運行時。SecondState、Cloudflare、Netlify 和 Vercel 等公司都支持通過其邊緣運行時部署 WebAssembly 功能。

下圖是 AWS Lambda 中的 WebAssembly Serverless 函數工作原理:

具體細節可以參考這個文章:https://www.cncf.io/blog/2021/08/25/webassembly-serverless-functions-in-aws-lambda/

6.4 外掛系統應用

得益於 WASM 的跨平臺的特性,很多系統和框架在考慮通過 WASM 開發外掛系統。比如基於 eBPF 和 Wasm 技術實現給 Linux 打動態的補丁。

比如阿里雲剛開源的 Higress 網關的外掛系統也支持 wasm,對比傳統 Nginx 網關使用 lua 進行擴展,wasm 的多語言和安全沙箱特性帶來了革命性的變化。同時對比傳統 Nginx 網關,修改 lua 程式碼後需要 reload 才能生效,Higress 可以實現外掛的熱分發和熱載入,外掛邏輯發生變化對流量完全無損,長連接也不會斷開。

  • 使用 Go 開發 Higress 外掛可參考:https://higress.io/zh-cn/docs/user/wasm-go.html

比如螞蟻開源的 MOSN(Modular Open Smart Network),是一款主要使用 Go 語言開發的雲原生網路代理平臺。MSON 就支持通過 WASM 外掛來擴展其能力。下圖是 MOSN 外掛的工作原理圖:

MOSN 外掛的細節可參考:https://mosn.io/blog/posts/mosn-wasm-framework/

6.5 微控制器應用

Wasm 不僅僅應用在瀏覽器、雲端運算等行業,在邊緣運算等嵌入式領域也有應用場景。比如 wasm3 虛擬機器就針對 arduino 提供的更精簡的虛擬機器,使用者可以通過 wasm 技術為不同的微控制器開發應用。

比如可以通過凹語言結合 wasm3-arduino 來開發 arduino 的例子,下圖是本地模擬環境程式碼和執行效果圖:

wasm3-arduino 倉庫:https://github.com/wasm3/wasm3-arduino

WASM 教程推薦

WASM 教程推薦

WebAssembly 屬於這個新生態的根技術、而目前正是處於根技術生態的構建階段。因此,這類推薦的更多是偏向 WebAssembly 規範、原理和實現的教程。我們希望當 WebAssembly 技術正在普及之後,使用者可以通過流行的程式語言直接開發 WebAssembly 應用而不需要關係根技術的細節。

7.1 《WebAssembly 規範》—— 2022

WebAssembly 規範 1.0 草案在 2018 年發佈,現在最新的 WebAssembly 2.0 在 2022 年發佈。WebAssembly 規範是市面上所有該技術的實現和實踐的參與源頭。任何希望追根溯源、獲取最前沿的 WebAssembly 發展方向的同學不僅僅推薦精讀該規範,甚至還建議跟蹤規範的討論和誕生的過程。

該文件並非正式出版的圖書,目前規範只有線上電子版,建議自行列印。

7.2 《WebAssembly 標準入門》—— 2018

本書是本文作者和前同事於 2018 年合著,主要講解了 WebAssembly 的基礎知識,其內容涵蓋了 WASM 的歷史背景、WASM 中組合語言和虛擬機器指令、瀏覽器對 WASM 的支持、其它高級語言對 WASM 的支持等。

本書適合想要掌握 WebAssembly 技術、構建對應虛擬機器工具、程式語言或希望了解底層細節的使用者學習。

7.3 《WebAssembly: The Definitive Guide》—— 2021

這是 Oreilly 出版的相對較新的 WebAssembly 專著,不僅僅覆蓋了規範本身同時結合了主流程式語言的案例。

目前國內還沒有中文版本,大家可以閱讀英文版本。

7.4 《WebAssembly 原理與核心技術》—— 2021

這是國內虛擬機器實現專家張秀宏寫的一本講述如何實現 WebAssembly 虛擬機器的專著。它不僅對 WebAssembly 的工作原理、核心技術和規範進行了全面的剖析和解讀,而且給出了實現 WebAssembly 直譯器和 AOT 編譯器的思路和程式碼。

對於希望嘗試自己實現 WebAssembly 的同學建議閱讀本書。

2023 年展望

2023 年展望

對於 WebAssembly 來說,2022 年是真正潤物細無聲開始落地的過程:從新的 2.0 標準到 Ruby、Python 兩大主流手稿語言開始官方支持,從 SQLite3 開始官方支持、從 Docker 開始官方支持等,到為其而生的凹語言等,到真正的商業應用都有巨大的發展(而完全不是因為某個大佬的項目黃了就斷言 WASM 要涼的節奏)。

在商業應用上,Figma 基於 WebAssembly 打造在瀏覽器中的高性能應用,後被 Adobe 以 200 億美元收購,而 Adobe 也在向瀏覽器遷移。此外,WebAssembly 也是雲廠商、邊緣運算和 Serverless 的候選人。

隨著 WebAssembly 的普及,有一些相關技術流行趨勢也日趨明朗化。作者做 2 個小小的趨勢預測:

  1. 首先是 WasmEdge 將成為瀏覽器外最流行的運行時;

  2. 其次是 JavaScript 將成為 WebAssembly 平臺上最流行的程式語言。

不過這只是 5 年內的短期預測,更長的發展趨勢還需要看 WebAssembly 生態其他的基礎設施和程式語言發展狀態。

儘管目前 WebAssembly 發展喜人,但百廢待興仍有許多工作要做。我們希望大家更多的是參與到 WebAssembly 建設中去,而不是僅僅作為圍觀者。作為凹語言作者,我們希望在 2023 年真正解決語言的可用性和易用性的問題,讓 WebAssembly 應用構建更加簡單。

WebAssembly 作為一個新興的賽道,作為一個基礎設施必將帶來更大的生態洗牌,這是一個值得關注和投入的方向,讓我們攜手共建 WASM 原生時代。

作者簡介:

柴樹杉,KusionStack 項目開源負責人,凹語言作者。國內最早一批 WebAssembly 技術愛好者,在 2016 年在公司實踐 Emscripten 技術,在 WebAssembly 1.0 草案誕生之初出版了《WebAssembly 標準入門》,併發起了面向 WebAssemlby 的凹語言項目。同時也是 Go 語言愛好者,組織翻譯了《Go 語言聖經》、出版了《Go 語言高級程式設計》《Go 語言定製指南》等 Go 暢銷圖書。

相關文章

WebAssembly 真能取代 Kubernetes?

WebAssembly 真能取代 Kubernetes?

摘要:許多開發者總是習慣性地將 WebAssembly 與 Kubernetes 進行對比,也許將來可能會出現某種技術,在雲環境中部署和管理...