天天看點

Bytecode Alliance為何沉迷 Wasmtime?WebAssembly 的福音?

作者:前端進階

大家好,很高興又見面了,我是"前端進階",由我帶着大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點贊、收藏、轉發!

前言

Bytecode Alliance為何沉迷 Wasmtime?WebAssembly 的福音?

什麼是Bytecode Alliance?圖檔來自:https://bytecodealliance.org/

Bytecode Alliance(位元組碼聯盟)是一個非營利組織,緻力于建立安全的新軟體基礎,建立在 WebAssembly 和 WebAssembly 系統接口 (WASI,即WebAssembly System Interface) 等标準之上。

WASI 是 WebAssembly 的子產品化系統接口,它專注于安全性和可移植性。WASI 正在 WebAssembly CG 的一個子組中進行标準化。

位元組碼聯盟緻力于建立一個功能強大、安全的平台,使應用程式開發人員和服務提供商能夠在任何基礎設施、任何作業系統或裝置上充分利用Web浏覽器的數十年經驗安全地運作不受信任的代碼。

Bytecode Alliance 的願景是為所有平台建立一個預設安全的 WebAssembly 生态系統!

1.什麼是 Wasmtime?

Wasmtime是一個位元組碼聯盟項目,它是一個獨立的 wasm-only 優化運作時,用于 WebAssembly 和 WASI。 它可以在 Web 環境之外運作 WebAssembly 代碼,既可以用作指令行程式,也可以用于嵌入到更大應用程式中的庫。

Bytecode Alliance為何沉迷 Wasmtime?WebAssembly 的福音?

圖檔來源:https://bytecodealliance.org/articles/wasmtime-1-0-fast-safe-and-production-ready

Wasmtime 緻力于成為一個高度可配置和可嵌入的運作時,以在任何規模的應用程式上運作,不過目前許多功能仍在開發中。

2.Wasmtime有那些特點?

Bytecode Alliance為何沉迷 Wasmtime?WebAssembly 的福音?

Wasmtime有那些特點?

  • 速度快: Wasmtime 建立在優化的 Cranelift 代碼生成器之上,可以在運作時或提前快速生成高品質的機器代碼。 Wasmtime 針對執行個體化、嵌入器和 wasm 之間的低開銷調用以及并發執行個體的可擴充性進行了優化。
  • 安全: Wasmtime 的開發非常注重正确性和安全性。 基于 Rust 的運作時安全保證,每個 Wasmtime 功能都通過 RFC 流程進行仔細審查。 功能設計後,将接受由 Google 的 OSS Fuzz 提供的 24/7 全天候模糊測試。 同時在出現問題後,有一個定義明确的安全政策來快速緩解和修補問題。
  • 可配置: Wasmtime 使用合理的預設值,但也可以配置為對 CPU 和記憶體消耗等次元提供更細粒度的控制。 無論在微型環境、多并發執行個體的大型伺服器上運作 Wasmtime都滿足。
  • WASI: Wasmtime 支援一組豐富的 API,用于通過 WASI 标準與主機環境進行互動
  • 符合标準: Wasmtime 通過了官方的 WebAssembly 測試套件,實作了 wasm 的官方 C API,并對 WebAssembly 的未來提案提供支援。 Wasmtime 開發人員也一直密切參與 WebAssembly 标準流程。

3.Wasmtime支援那些語言?

Bytecode Alliance為何沉迷 Wasmtime?WebAssembly 的福音?

圖檔來源:https://bytecodealliance.org/articles/img/1-year-update/wasmtime-embedding.png

您可以通過嵌入實作來使用各種不同語言的 Wasmtime:

  • Rust - wasmtime crate
  • C - wasm.h, wasi.h和wasmtime.h headers, CMake 或 wasmtime Conan package
  • C++ - wasmtime-cpp 存儲庫或使用 wasmtime-cpp Conan 包
  • Python - wasmtime PyPI 包
  • .NET - Wasmtime NuGet 包
  • Go - wasmtime-go 存儲庫

4.從一個Wasmtime的hello world開始

4.1 建立hello-world.wasm

有很多方法可以建立 .wasm 檔案,本文将使用 Rust 工具鍊。 要使用 Rust 建構 WebAssembly 二進制檔案,您需要标準的 Rust 工具鍊。首先安裝 rustc、rustup 和 cargo(安裝教程在文末參考資料):

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh           

接下來,需要将 WebAssembly 添加為 cargo 的建構目标,如下所示:

$ rustup target add wasm32-wasi           

最後,建立一個名為“hello-world”的新 Rust 項目

$ cargo new hello-world           

此時hello-world的檔案夾目錄結構如下:

hello-world/
├── Cargo.lock
├── Cargo.toml
└── src
   └── main.rs           

為src 檔案夾中的 main.rs 檔案添加以下 rust 代碼。

fn main() {
    println!("Hello, world!");
}           

現在,可以告訴 cargo 建構一個 WebAssembly 檔案:

$ cargo build --target wasm32-wasi           

此時在目标檔案夾中,有一個 hello-world.wasm 檔案。

hello-world/
├── Cargo.lock
├── Cargo.toml
├── src
└── target
   └── ...
   └── wasm32-wasi
      └── debug
         └── ...
         └── hello-world.wasm           

4.2 執行hello-world.wasm

安裝 Wasmtime

Wasmtime CLI 可以使用下面安裝腳本安裝在 Linux 和 macOS 上:

$ curl https://wasmtime.dev/install.sh -sSf | bash           

運作 hello-world.wasm

有多種方法可以使用 Wasmtime 運作 .wasm 檔案。 本文将使用 CLI,Wasmtime 也可以嵌入到您的應用程式中。

如果您已經建構了 hello-world.wasm 檔案,您可以使用 Wasmtime 從指令行運作它,如下所示:

$ wasmtime target/wasm32-wasi/debug/hello-world.wasm           

5.總結

據介紹,Shopify 于 2021 年 7 月從另一個 WebAssembly 引擎切換到 Wasmtime。切換後,Shopify 的平均執行性能提升了大約 50%。Fastly 于 2022 年 3 月從另一個 WebAssembly 引擎切換到 Wasmtime。切換後,Fastly 的執行時間優化了大約 50%,每秒請求數的增加幅度從 72% 到 163% 不等。下面是已經切換到Wasmtime的部分公司名單。

Bytecode Alliance為何沉迷 Wasmtime?WebAssembly 的福音?

Wasmtime使用公司?圖檔來源:https://bytecodealliance.org/

通過本文應該對Wasmtime有一個比較宏觀、深入的了解,如果有興趣可以繼續閱讀文末參考資料,如果有不足之處歡迎指正,下期再見!

參考資料

https://wasmtime.dev/

https://docs.wasmtime.dev/introduction.html

https://bytecodealliance.org/

https://bytecodealliance.org/articles/1-year-update

https://bytecodealliance.org/articles/wasmtime-1-0-fast-safe-and-production-ready