Virtual machine webassembly中基于堆栈的虚拟机在哪里?

Virtual machine webassembly中基于堆栈的虚拟机在哪里?,virtual-machine,v8,webassembly,spidermonkey,stack-based,Virtual Machine,V8,Webassembly,Spidermonkey,Stack Based,在: WebAssembly(缩写为Wasm)是用于基于堆栈的虚拟机的二进制指令格式。Wasm被设计为编程语言的可移植编译目标,支持在web上部署客户端和服务器应用程序 我在维基百科上读到了关于基于堆栈的虚拟机的内容。但我想知道webassembly运行的基于堆栈的虚拟机在哪里?它是否嵌入javascript引擎,例如V8?V8将.wasm文件提供给这个虚拟机,而这个虚拟机运行它?我真的很困惑这句话描述了Wasm指令在值堆栈上运行的概念。例如,i32.add从该堆栈中获取两个i32值,并将另一个

在:

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


我在维基百科上读到了关于基于堆栈的虚拟机的内容。但我想知道webassembly运行的基于堆栈的虚拟机在哪里?它是否嵌入javascript引擎,例如V8?V8将.wasm文件提供给这个虚拟机,而这个虚拟机运行它?我真的很困惑

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

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


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

谢谢。术语“虚拟机”意味着隔离。那么基于堆栈的虚拟机是否提供隔离呢?不,“虚拟机”并不意味着隔离。它意味着虚拟化,例如:采用一台基于物理寄存器的x86机器,并在其上构建一个软件层,假装是一台可以执行Wasm模块的基于堆栈的机器。(的确,各种虚拟机(V8、JVM、Qemu、VMware等)也经常用于(并构建为提供)隔离目的,但这是正交的:您可以在不使用虚拟机的情况下实现隔离(这将是一个“沙箱”),您可以拥有没有提供有意义的隔离的虚拟机。)