wasm,即WebAssembly(官网 )是一套被四大浏览器(Chrome、Safari、Firefox、Edge)共同支持的二进制指令标准,类似于介于机器指令和高级指令之间的一套通用中间指令方案,宣称效率和机器指令基本一致。它的优势第一是标准化,第二是支持多种语言,比如rust、C、go等等。相比Javascript,它的开发灵活性更高,多语言的支持能力更强。
wasi,即Web Assembly System Interface(官网 ),是基于WASM的一套API规范,提供了文件IO、网络等通用的能力,使得wasm可以脱离浏览器,运行在任何环境或OS上。
wasm尝试
wasm支持rust、c、go,由于目前wasm的浏览器支持还比较初期,类似go等提供gc等高级支持的语言沙箱环境比较大,不如c、rust相对简单。
C语言的支持通过emsdk来实现,emsdk的安装参考emsdk官网 。
先写一个简单的C程序 test.c :
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}
然后执行:
emcc -o test.html test.c
即可生成三个文件:test.html test.js test.wasm,即可打开test.html测试看到wasm的执行结果:
wasm应用
-
UE和Unity应用支持
借助wasm支持,UE和Unity的应用已经可以直接浏览器发布了,点击这里可以样例 。
-
Sqlite页面应用
借助wasm,利用sql.js 可以在页面中载入sqlite数据文件,执行查询检索操作,在node服务器端还可以写入和更新。
wasi尝试
先安装wasmtime,参考:(https://github.com/bytecodealliance/wasmtime)。
还要安装rust对wasm的支持:
rustup target add wasm32-wasi
然后编辑rust源文件 hello.rs :
fn main() {
println!("Hello, world!");
}
然后执行:
rustc hello.rs --target wasm32-wasi
wasmtime hello.wasm
就可以看到执行的结果。wasmtime支持Rust、C、Python、.Net和Go语言。
要编译C代码,需要先安装 wasi-sdk ,然后利用clang编译:
~/local/wasi-sdk-12.0/bin/clang a.c -o aa.wasm --sysroot ~/local/wasi-sdk-12.0/share/wasi-sysroot
wasmtime aa.wasm