是由w3c指定的一个新规范,有一套完整的语义
二进制格式,体积小加载快,
目标是充分发挥硬件能力 以达到原生执行效率。
目标:
- 快速,高效,可移植
- 可读 可调试
- 保持安全
- 不要破坏网络
融入 web 平台
相关技术
LLVM (Low Level Virtual Machine 底层虚拟机)
想要编译成WebAssembly,你首先需要先编译 LLVM。这是运行后续工具的先决条件
LLVM的核心是中间端表达式(Intermediate Representation,IR),一种类似汇编的底层语言。
LLVM支持三种表达形式:人类可读的汇编,在C++中对象形式和序列化后的bitcode形式。
IR
是一种强类型的精简指令集(Reduced Instruction Set Computing,RISC),并对目标指令集进行了抽象。
例如,目标指令集的函数调用惯例被抽象为call和ret指令加上明确的参数。
另外,IR 采用无限个数的暂存器,使用如%0,%1等形式表达。
Asm.js
Asm.js 包括一个 JavaScript 的严格子集,可以被用来作为一个底层的、高效的编译器目标语言.
代码使用一个源代码至源代码编译器(例如基于LLVM的Emscripten)翻译,就是通过VM(如Emscripten)把一些本地代码(如C语言)生成的VM字节码(bytecode)翻译成前述严格子集的JS代码得以在Web上运行,并通过浏览器的支持,得到性能优化。
c/c++---->Emscripten(VM)---->asm.js(一种js语言)。
Rust
可以将 Rust 编译成 WASM,并在编织到互联网结构中的 Serverless 功能中调用它。
自动生成 Rust、WebAssembly 和 JavaScript API 之间的绑定代码。充分利用 web-sys 之类的库为整个 Web 平台提供预打包的绑定。
开发教程
webassembly.org.cn/getting-sta…
加载
在未来计划中,WebAssembly 模块可以使用 ES6 模块(使用<script type="module">)加载,WebAssembly 目前只能通过 JavaScript 来加载和编译。基础的加载,只需要3步:
- 获取
.wasm二进制文件,将它转换成类型数组或者ArrayBuffer - 将二进制数据编译成一个
WebAssembly.Module - 使用 imports 实例化这个
WebAssembly.Module,获取 exports。