WebAssembly learning note

484 阅读2分钟

WevAssembly on MDN

WebAssembly 概念

官方文档

是由w3c指定的一个新规范,有一套完整的语义

二进制格式,体积小加载快,

目标是充分发挥硬件能力 以达到原生执行效率。

目标:

  • 快速,高效,可移植
  • 可读 可调试
  • 保持安全
  • 不要破坏网络

融入 web 平台

相关技术

LLVMLow Level Virtual Machine 底层虚拟机)

想要编译成WebAssembly,你首先需要先编译 LLVM。这是运行后续工具的先决条件

LLVM的核心是中间端表达式(Intermediate Representation,IR),一种类似汇编的底层语言。

LLVM支持三种表达形式:人类可读的汇编,在C++中对象形式和序列化后的bitcode形式。

IR

是一种强类型精简指令集(Reduced Instruction Set Computing,RISC),并对目标指令集进行了抽象。

例如,目标指令集的函数调用惯例被抽象为callret指令加上明确的参数。

另外,IR 采用无限个数的暂存器,使用如%0,%1等形式表达。

Asm.js

Asm.js 包括一个 JavaScript 的严格子集,可以被用来作为一个底层的、高效的编译器目标语言.

代码使用一个源代码至源代码编译器(例如基于LLVMEmscripten)翻译,就是通过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。