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

where is stack-based virtual machine in webassembly?

https://webassembly.org/ 中:

WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.

我在维基百科上阅读了有关基于堆栈的虚拟机的信息。但我想知道 webassembly 在其上运行的基于堆栈的虚拟机在哪里?它是否嵌入在 javascript 引擎中,例如V8? V8 将 .wasm 文件提供给该虚拟机并且该虚拟机运行它?我真的很困惑

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

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

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