2016-02-29 85 views
2

我正在写一个基于(基于堆栈)的VM,它在存储变量时不包括类型元数据,无论是在堆栈中还是实际的字节码。另外,所有的数据都作为无符号存储(如果适用的话)(所有整数和字符都作为无符号存储)为没有类型元数据的虚拟机推断数据类型

考虑到我想保持内存非常小(以下是bool的8位,短小的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 

这将是一个更好的办法:这一点,或存储有关变量本身的类型(可能只是一个额外的字节)的数据?将变量和其数据一起存储在代码和内存中看起来像是一个很大的膨胀,就像它的使用一样。

在此先感谢。

+0

这个问题是相当意见的基础。但我更喜欢类型是语言概念并且应该只在编译时存在的想法。 –

回答

0

因为只有你的意图的一部分是已知的,所以很难给你一个完整的分析。但如果它可以帮助,这里有一些想法。

与往常一样,你将不得不作出的速度和空间之间的权衡:

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

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

  • 通过使操作码包含参数(这是大多数现代非RISK CPU指令集的设计方式),您可以进一步优化第二个选项。因此,您可以不使用例如一条带有3个参数(3个额外字节?)的ADD32(1字节代码)的指令,而是可以有几个专门的和优化的操作码(组织考虑到操作码字段,甚至可能是以2字节组织)。

请注意,第二种和第三种方法需要强大的源语言输入,才能转换为虚拟机。如果你想拥有动态类型,你需要第一种方法。