WebAssembly
WebAssembly(缩写为 wasm)是一种使用非 JavaScript 代码,并使其在浏览器中运行的方法
什么是WebAssembly (WASM)
把应用的抽象层拿出来,把它编译成WASM,然后部署即可。这里面的核心技术就是WASM。
WASM是一个编译目标(二进制指令集格式),一般是将别的编程语言例如Go,Rust,C++,Java,C sharp写出的应用编译成WASM。如果程序使用的是更加动态类型的语言,例如Python,JS,这样其实是把它们的解释器编译成了WASM,然后再把源代码跑在编译成WASM上的解释器上。
目的:使代码运行接近原生机器性能(接近是因为编译后的代码是跑在类似VM上的,而不是像原先那样直接跑在X86/ARM架构上,最后运行时还是需要从WASM编译成X86/ARM,因此这个编译过程会有些损耗,所以它的性能最多只能是非常接近 85%)
跟JS比起来,WASM更加的紧凑
当我们把应用编译成WASM时,会添加上边界检测,来检测这个WASM是否有内存问题,如果一个进程中有多个WASM 模块在跑的话,每一个WASM 模块都会有自己的线性内存空间,并且RunTime保证它们之间不会跨越彼此的线性内存空间。
比如下面的计算阶乘的代码
function fac(){
if n <= 1:
return 1
else:
return n * fac(n-1)
}
其编译后的WASM代码如下
(module
(func $fac(param $n i64)(result i64)
;; implementation
local.get $n
i64.const 1
i64.le_s
(if (result i64))
(then (i64.const 1))
(else
(i64.sub (local.get $n) (i64.const 1))
call $fac
local.get $n
i64.mul
)
)
)
(export "fac" (func $fac))
)
最外层的module是WASM里最小的执行单元,WASM有自己的类型系统,例如第二行中的参数n的类型是i64。
题外话:最近WASM的两个重要提案
- WASM中只有四个类型 i32,i64,f32,f64 (i ~ int,f ~ float),因此WASM最近有提案说要新增一些类型,为了让WASM能更好的跟其它的编程语言结合。
- 模块链接,顾名思义模块链接的主要作用是在运行时将两个模块链接在一起,比如一个模块的输出可以作为另一个模块的输入。
WebAssembly 的优点
- 安全,WASM运行在一个沙盒之中
- 可移植性强,经过编译之后可以运行在几乎任何平台上
- 性能,可以很快的启动,大概1ms左右,拥有接近原生平台的性能