wasm和wasi

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