【问题标题】:where is stack-based virtual machine in webassembly?WebAssembly 中基于堆栈的虚拟机在哪里?
【发布时间】:2021-06-20 03:12:33
【问题描述】:

在https://webassembly.org/:

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

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

【问题讨论】:

    标签: virtual-machine v8 webassembly spidermonkey stack-based


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。 “虚拟机”一词意味着隔离。那么基于堆栈的虚拟机是否提供隔离?
    • 不,“虚拟机”并不意味着隔离。它意味着虚拟化,例如:采用基于物理寄存器的 x86 机器并在其上构建一个软件层,伪装成可以执行 Wasm 模块的基于堆栈的机器。 (确实,各种虚拟机(V8、JVM、Qemu、VMware 等)通常也用于(并且旨在提供)隔离目的,但这是正交的:您可以在不使用虚拟机的情况下进行隔离(即'将是一个“沙盒”),并且您可以拥有不提供有意义隔离的虚拟机。)
    猜你喜欢
    • 2014-05-18
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2013-01-14
    • 2017-12-05
    • 2018-11-24
    • 2020-04-25
    相关资源
    最近更新 更多