我正在寫一個基於(基於堆棧)的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
這將是一個更好的辦法:這一點,或存儲有關變量本身的類型(可能只是一個額外的字節)的數據?將變量和其數據一起存儲在代碼和內存中看起來像是一個很大的膨脹,就像它的使用一樣。
在此先感謝。
這個問題是相當意見的基礎。但我更喜歡類型是語言概念並且應該只在編譯時存在的想法。 –