基于WebAssembly堆栈的虚拟机在哪里实现?

cap*_*ene 4 virtual-machine webassembly

引用https://web assembly.org/

WebAssembly(缩写为 Wasm)是一种基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为编程语言的可移植编译目标,支持在网络上部署客户端和服务器应用程序。

我在维基百科上读到过有关基于堆栈的虚拟机的信息。不过,我想知道基于 WebAssembly 堆栈的虚拟机驻留在哪里。它是否嵌入在 javascript 引擎中(例如,在 V8 上)?V8是否将.wasm文件交给另一个虚拟机来运行?

jmr*_*mrk 5

该语句描述了 Wasm 指令在值堆栈上操作的概念。例如,i32.add从此堆栈中获取两个 i32 值,并将另一个值(结果)推送到该堆栈上。请注意,这是一个抽象的理论模型。

当然,Wasm 引擎必须接受这些指令,并且表现得就像指令用来交换输入和输出值的堆栈一样。他们可能会也可能不会将此概念行为映射到实际堆栈,这是一个实现细节。事实上,引擎通常会同时执行这两种操作:非优化基线编译器经常(但并非总是)将概念堆栈映射到内存中的实际堆栈(因为这使编译器更简单,从而更快),而优化最后层编译器通常使用 SSA(“静态单赋值”)形式的 IR(“中间表示”),这不是概念性的堆栈机(并且使编译器更强大)。

“堆栈机”的替代方案是“寄存器机”。例如,x86 和 ARM 机器代码都基于此模型:指令对它们用来获取输入值和返回结果的寄存器进行编码。还可以基于“注册机”模型构建引擎;V8 的“Ignition”解释器(用于 JavaScript)就是一个例子。本来可以将 Wasm 指令格式设计为基于寄存器的东西——我不知道为什么不这样做;可能是因为如果例如i32.add必须指定它从虚拟寄存器 x 和虚拟寄存器 y 获取两个输入,而不是仅仅隐式地获取最上面的两个堆栈值,则二进制形式的模块会更大。

  • 不,“虚拟机”并不意味着隔离。它意味着_虚拟化_,例如:采用基于寄存器的物理 x86 机器并在其上构建一个软件层,假装是可以执行 Wasm 模块的基于堆栈的机器。(确实,各种虚拟机(V8、JVM、Qemu、VMware 等)通常也用于(并旨在提供)隔离目的,但这是正交的:您可以在不使用虚拟机的情况下实现隔离(即是一个“沙箱”),并且您可以拥有不提供任何有意义的隔离的虚拟机。) (2认同)