大家好,很高興又見面了,我是"前端進階",由我帶着大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點贊、收藏、轉發!
前言
什麼是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 代碼,既可以用作指令行程式,也可以用于嵌入到更大應用程式中的庫。
圖檔來源:https://bytecodealliance.org/articles/wasmtime-1-0-fast-safe-and-production-ready
Wasmtime 緻力于成為一個高度可配置和可嵌入的運作時,以在任何規模的應用程式上運作,不過目前許多功能仍在開發中。
2.Wasmtime有那些特點?
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支援那些語言?
圖檔來源: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的部分公司名單。
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