【问题标题】:Type of a stack entry (in a virtual machine)堆栈条目的类型(在虚拟机中)
【发布时间】:2018-11-24 21:18:39
【问题描述】:

关于基于堆栈的虚拟机,我不太了解一些东西:存储在堆栈中的值的类型是什么?我的意思是,例如,如果我将一个整数压入堆栈,很明显它的类型是一个 32 位整数。但是,如果我推送一个浮点数、一个字符串甚至一个对象引用(在 OOP 中),它们的类型就会改变。创建堆栈时,它是否会在它们被压入堆栈时确定它们的类型,或者堆栈是否具有预定义的条目类型,例如只有整数,或者可能是指针?实在是搞不明白,大家多多指教。

【问题讨论】:

  • 你是在实现语言,而不是写作。源鳕鱼Si。语言。 stack 元素可以是您认为的任何内容,具体取决于您作为实现者的需求。

标签: types stack vm-implementation


【解决方案1】:

方法有很多种,这里只举几个例子。

在 V8 JavaScript 引擎 VM(来自 Chrome 浏览器和 Node.js)中,堆栈上的所有对象指向一个结构的指针可能与此类似:

class Value {
   char type;
   union {
      Number, String, Object, Array, Date, Set
   }
};

Firefox 的 SpiderMonkey 的 JavaScript VM 在堆栈上保存 64 位值,这些值被称为 NaN-boxed。如果高 3 位全部设置为1,则接下来的几位用于确定对象类型,其余 48 位用作指向对象结构的指针。如果 3 个最高有效位不是全部 111,则整个 64 位值是 double

垃圾收集环境中的虚拟机栈通常必须保存同质对象,即相同类型的对象,而不是混合指针和整数,例如,垃圾收集器可以成功地遍历并从堆栈开始递归检查每个对象。例如,堆栈上看起来像0x123456789 的值既可以是有效整数,也可以是有效指针,垃圾收集器不知道忽略它(如果它是整数)或取消引用它(指向可能错误的内存位置)。

事实上,有一些高级垃圾收集器实际上可以处理堆栈中的混合数据,做出一些假设、猜测并保留额外的记录。

【讨论】:

    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 2021-06-20
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2012-01-31
    相关资源
    最近更新 更多