我正在写一个基于(基于堆栈)的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
这将是一个更好的办法:这一点,或存储有关变量本身的类型(可能只是一个额外的字节)的数据?将变量和其数据一起存储在代码和内存中看起来像是一个很大的膨胀,就像它的使用一样。
在此先感谢。
这个问题是相当意见的基础。但我更喜欢类型是语言概念并且应该只在编译时存在的想法。 –