WebAssembly(缩写为 Wasm)是一种用于基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为编程语言的可移植编译目标,支持在 Web 上部署客户端和服务器应用程序。
我在 wikipedia 中阅读了有关基于堆栈的虚拟机的信息。但我想知道运行 webassembly 的这个基于堆栈的虚拟机在哪里?它是否嵌入在 javascript 引擎中,例如 V8?并且 V8 将 .wasm 文件提供给该虚拟机并且该虚拟机运行它?我真的很困惑
WebAssembly(缩写为 Wasm)是一种用于基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为编程语言的可移植编译目标,支持在 Web 上部署客户端和服务器应用程序。
我在 wikipedia 中阅读了有关基于堆栈的虚拟机的信息。但我想知道运行 webassembly 的这个基于堆栈的虚拟机在哪里?它是否嵌入在 javascript 引擎中,例如 V8?并且 V8 将 .wasm 文件提供给该虚拟机并且该虚拟机运行它?我真的很困惑
该语句描述了 Wasm 指令对值堆栈进行操作的概念。例如,i32.add
从该堆栈中获取两个 i32 值,并将另一个(结果)压入该堆栈。请注意,这是一个抽象的理论模型。
当然,Wasm 引擎必须接受这些指令,并且表现得好像存在这个指令用来交换输入和输出值的堆栈。他们可能会也可能不会将此概念性行为映射到实际堆栈,这是一个实现细节。事实上,引擎通常会同时做这两种事情:非优化基线编译器经常(但并非总是)将概念堆栈映射到内存中的实际堆栈(因为这使编译器更简单,因此更快),而优化最后一层编译器通常使用 SSA(“静态单一分配”)形式的 IR(“中间表示”),它不是概念堆栈机器(并使编译器更强大)。
“堆栈机”的替代品是“注册机”。例如,x86 和 ARM 机器代码都基于此模型:指令对它们用于获取输入值和返回结果的寄存器进行编码。也可以基于“注册机”模型构建引擎;V8 的“Ignition”解释器(用于 JavaScript)就是一个例子。将 Wasm 指令格式设计为基于寄存器的东西是可能的——我不确定为什么不这样做;可能是因为二进制形式的模块会更大,例如,如果i32.add
必须指定它从虚拟寄存器 x 和虚拟寄存器 y 获取两个输入,而不是隐式地获取最顶部的两个堆栈值)。