gpt4 book ai didi

c++ - 推断没有类型元数据的虚拟机的数据类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:32 25 4
gpt4 key购买 nike

我正在编写一个(基于堆栈的)VM,它在存储变量时不包括类型元数据,无论是在堆栈中还是在实际的字节码中。此外,在适用的情况下,所有数据都以无符号形式存储(所有整数和字符都以无符号形式存储)

以下哪种方法会更有效,考虑到我想保持内存非常小(bool 8 位,short 16 位等等)并且不想让代码膨胀,或者工作内存太大。

//Type info.
enum TypeInfo {
TYPE_INT8, //=0
TYPE_INT16,
TYPE_INT32,
TYPE_INT64,
TYPE_STRING,
TYPE_CHAR,
TYPE_BOOL,
TYPE_POINTER,
LEFT_S_RIGHT_S,
LEFT_U_RIGHT_U,
LEFT_S_RIGHT_U,
LEFT_U_RIGHT_S,
BOTH_SAME_TYPE,
SIGNED,
UNSIGNED //=14
};

使用上面的代码,我可以按以下方式解释字节码。我用某种语言完成了以下操作:

unsigned int one = 78888;
signed int two = -900;
signed int result = one - two;
print(result); //inferred overloaded function targeting the 'unsigned int' print function

因此,我的虚拟机程序集可以生成如下内容:

PUSH32 <78888>                            //push 'one' onto stack
PUSH32 <-900 cast to an unsigned int> //push 'two' onto stack
ADD32, TypeInfo::LEFT_U_RIGHT_S, TypeInfo::BOTH_SAME_TYPE, TypeInfo::TYPE_INT32
PRNT32, TypeInfo::SIGNED, TypeInfo::INT32

哪种方法更好:这个,还是用变量本身存储有关类型的数据(可能只是一个额外的字节)?将变量及其数据一起存储在代码和内存中,就像它使用的那样,似乎有很多膨胀。

提前致谢。

最佳答案

很难为您提供完整的分析,因为我们只知道您的部分意图。但如果它能有所帮助,这里有一些想法。

与往常一样,您必须在速度和空间之间做出权衡:

  • 如果用变量存储类型,VM 数据会更大。然而,你的 VM 引擎的操作码会更小(没有额外的操作参数,因为它们可以从类型信息中推断出来),所以最终,整体内存占用可能更小。然而,在运行时,每个操作码都必须分析其参数的类型,决定转换(在混合类型的情况下)。因此执行速度可能会变慢。

  • 如果您存储没有类型的变量,数据会更小。但是操作码将需要额外的参数(这里,ADD32 有 3 个参数,正如您已经确定的那样)。所以代码会更大。然而,在执行时间上你可以走得更快。

  • 您可以进一步优化第二个选项,方法是制作包含参数的操作码(这是大多数现代非 RISK CPU 指令集的设计方式)。因此,您可以使用多个专门的和优化的操作码(具有考虑到操作码字段的漂亮位组织,它甚至可以是以 2 个字节组织)。

请注意,第二种和第三种方法需要在您转换为 VM 的源语言中使用强类型。如果你想拥有动态类型,你需要第一种方法。

关于c++ - 推断没有类型元数据的虚拟机的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35711486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com