Wasm

目录

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的两个重要提案

  1. WASM中只有四个类型 i32,i64,f32,f64 (i ~ int,f ~ float),因此WASM最近有提案说要新增一些类型,为了让WASM能更好的跟其它的编程语言结合。
  2. 模块链接,顾名思义模块链接的主要作用是在运行时将两个模块链接在一起,比如一个模块的输出可以作为另一个模块的输入。

WebAssembly 的优点

  1. 安全,WASM运行在一个沙盒之中
  2. 可移植性强,经过编译之后可以运行在几乎任何平台上
  3. 性能,可以很快的启动,大概1ms左右,拥有接近原生平台的性能
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦