WebAssembly(简称 Wasm)是由 W3C 制定的二进制指令格式,于 2017 年首次发布。WebAssembly 允许 C/C++、Rust、Go 等语言编译为可在浏览器中高效运行的二进制代码,性能接近原生。
WebAssembly 的核心定位是 Web 平台的高性能计算引擎。它提供了:
# 编译流程
源代码 (C/C++/Rust/Go)
↓
LLVM IR
↓
WebAssembly 字节码 (.wasm)
↓
浏览器/运行时
// add.c
#include
EMSCRIPTEN_KEEPALIVE
int add(int a, int b) {
return a + b;
}
EMSCRIPTEN_KEEPALIVE
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
// 编译命令
// emcc add.c -o add.js -s EXPORTED_FUNCTIONS="[\"_add\", \"_factorial\"]"
// lib.rs
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
#[wasm_bindgen]
pub fn factorial(n: i32) -> i32 {
if n <= 1 { 1 } else { n * factorial(n - 1) }
}
// 编译命令
// wasm-pack build --target web
// main.go
package main
import "syscall/js"
func add(this js.Value, args []js.Value) interface{} {
a := args[0].Int()
b := args[1].Int()
return a + b
}
func factorial(this js.Value, args []js.Value) interface{} {
n := args[0].Int()
result := 1
for i := 2; i <= n; i++ {
result *= i
}
return result
}
func main() {
c := make(chan struct{})
js.Global().Set("add", js.FuncOf(add))
js.Global().Set("factorial", js.FuncOf(factorial))
<-c
}
// 编译命令
// GOOS=js GOARCH=wasm go build -o main.wasm
// 使用原生 WebAssembly API
async function loadWasm() {
// 加载 .wasm 文件
const response = await fetch("add.wasm");
const bytes = await response.arrayBuffer();
// 实例化模块
const { instance } = await WebAssembly.instantiate(bytes, {
env: {
console_log: (ptr) => {
console.log("Wasm log:", ptr);
}
}
});
// 调用导出函数
const result = instance.exports.add(10, 20);
console.log("10 + 20 =", result);
const fact = instance.exports.factorial(5);
console.log("5! =", fact);
return instance;
}
// 使用 ESM 方式
import init, { add, factorial } from "./pkg/hello_wasm.js";
async function run() {
await init();
console.log("10 + 20 =", add(10, 20));
console.log("5! =", factorial(5));
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WebAssembly 演示</title>
</head>
<body>
<h1>WebAssembly 计算器</h1>
<div>
<input id="num1" value="10" />
<span>+</span>
<input id="num2" value="20" />
<button id="calculate">计算</button>
<span id="result">结果: </span>
</div>
<script type="module">
import init, { add } from "./pkg/hello_wasm.js";
await init();
document.getElementById("calculate").addEventListener("click", () => {
const a = parseInt(document.getElementById("num1").value);
const b = parseInt(document.getElementById("num2").value);
const result = add(a, b);
document.getElementById("result").textContent = `结果: ${result}`;
});
</script>
</body>
</html>
// Rust WASI 示例(运行在浏览器外)
use std::fs::File;
use std::io::{Read, Write};
fn main() {
// 文件操作(WASI 支持)
let mut file = File::open("input.txt").unwrap();
let mut contents = String::new();
file.read_to_string(&mut contents).unwrap();
let output = contents.to_uppercase();
let mut out_file = File::create("output.txt").unwrap();
out_file.write_all(output.as_bytes()).unwrap();
println!("文件处理完成!");
}
// 编译命令
// cargo build --target wasm32-wasi
// 运行
// wasmtime target/wasm32-wasi/debug/wasi-example.wasm
// 性能测试示例
console.time("JavaScript");
for (let i = 0; i < 1000000; i++) {
jsAdd(i, i);
}
console.timeEnd("JavaScript");
console.time("WebAssembly");
for (let i = 0; i < 1000000; i++) {
wasmAdd(i, i);
}
console.timeEnd("WebAssembly");
// 典型结果:
// JavaScript: ~50ms
// WebAssembly: ~5ms (快 10 倍)
| 对比项 | WebAssembly | JavaScript |
|---|---|---|
| 执行方式 | 二进制字节码 | 源码解释/JIT |
| 性能 | 接近原生 | 快 |
| 语言生态 | C/C++/Rust/Go | JS/TS |
| DOM 操作 | 需通过 JS | 原生 |
| 调试 | 较困难 | 完善 |
| 适用场景 | 计算密集型 | 通用 Web |
JavaScript、C/C++/Rust 基础
WebAssembly 概念、编译流程、浏览器加载
WAT 文本格式、内存管理、与 JS 互操作
WASI、多线程、优化、边缘计算
WebAssembly 是 Web 平台的"性能引擎"。
它用 接近原生的性能、跨语言支持、安全沙箱 让 Web 应用可以运行计算密集型任务。WebAssembly 是 Web 技术的未来方向。
"WebAssembly 让 Web 应用跑得更快、更强。" 🚀