2016-02-29 89 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字節組織)。

請注意,第二種和第三種方法需要強大的源語言輸入,才能轉換爲虛擬機。如果你想擁有動態類型,你需要第一種方法。