WebAssembly 技术汇总
官方网站
https://webassembly.org/
要点
- 文件格式(wasm,wast/wat,asm.js)
- 编译(emscripten)
- 编程语言(C/C++、Rust、Golang、Javascript、Typescript)
- 执行环境(browser、node.js、kernel)
Mozilla 开发的在线IDE,支持Rust、C、Wat开发WebAssembly https://webassembly.studio/
在线编译C到wasm https://wasdk.github.io/WasmFiddle/
wasm格式
wasm是WebAssembly的二进制字节码,后面将直接用wasm来指代WebAssembly。 要获得wasm格式,可以通过
- 使用emscripten编译命令加上参数-s WASM=1来得到
emcc -o test.js -s WASM=1 test.c
我们将获得一个test.wasm格式的文件和一个test.js文件。 其中test.js中有大量对wasm的封装,方便操控wasm的内存。 2. 使用工具将wast格式转换成wasm格式https://webassembly.github.io/wabt/demo/wat2wasm/
- 其他语言编译得到
wast/wat格式
wast和wat的区别 https://webassembly.js.org/docs/contrib-wat-vs-wast.html wast/wat格式是wasm的文本类型格式,使用的是lisp语言的S表达式。 可以 使用工具将wasm转换成wast/wat格式https://webassembly.github.io/wabt/demo/wasm2wat/
Asm.js
emscripten 不加参数-s WASM=1即可编译成asm.js的代码,asm.js可以兼容大多数浏览器。
Golang编译成wasm
GOARCH=wasm GOOS=js go build -o test.wasm main.go
JavaScript(walt)编译成wasm
walt项目:https://github.com/ballercat/walt 该项目可以编写javascript代码来生成wasm。 可以通过webpack打包(walt-loader)、walt-cli命令行编译等方式。
npm i walt-cli walt -- test.walt -o test.wasm
TypeScript (AssemblyScript)
https://assemblyscript.org/
C#编译成wasm
https://github.com/migueldeicaza/mono-wasm https://github.com/aspnet/Blazor
eos中编译成wast
eosiocpp -o test.wast test.cpp
浏览器中调用
fetch('module.wasm').then(response => response.arrayBuffer() ).then(bytes => WebAssembly.instantiate(bytes, importObject) ).then(results => { // Do something with the compiled results! });
Node.js中使用
const fs = require('fs') const wasmFile = fs.readFileSync('test.wasm') WebAssembly.instantiate(fs).then(module=>{ module.exports.xxx() })
使用Linux内核模式调用wasm
https://github.com/rianhunter/wasmjit
Mac中直接执行wasm
在 Mac 系统下通过 brew install binaryen 安装成功后,通过 wasm-shell f.wasm 文件即可直接运行