2013-05-10 48 views
0

我正在編寫一個編譯器,它將與C具有相似概念的語言編譯爲字節碼,然後應該由相應的基於堆棧的VM進行解釋。當我談到如何編譯結構時,我就陷入了困境,例如如何處理字節碼和基於堆棧的虛擬機中的結構變量?

struct my_struct_s { 
    int anInt; 
    char* aString; 
} my_struct_t; 

/* ... */ 
my_struct_t my_struct_var; 

哪裏最好把my_struct_var放在字節碼中? C編譯器如何處理這些東西?稍後,VM還必須處理表示此結構變量所需的內存,因爲它應該是可寫的和可重用的。

你會把這種變量放在哪裏?在堆棧上?只要把這個var的內存地址放到堆棧上?

感謝, 喬納斯

回答

0

編譯C到更高層次的語言,最困難的部分是處理指針。

如果你不關心這一點,事情就容易多了。我只需將結構編譯到具有給定字段的類中。只要你使用'正常'結構,這將工作,即明確地獲取和設置字段。您不必擔心分配內存或放置地址的位置,JVM會自動處理所有內容。

如果你拿一個指向字段成員的指針,事情就會有更多的問題。我能想到的兩種方法是將內存表示爲一個巨大的字節數組,並在運行時手動解釋值(非常慢)或用代碼替換指針來獲取或設置相應的字段(希望不要太慢,特別是因爲invokedynamic可以讓你做相似的東西)。

編輯:我假設你的目標是上面的JVM。 CIL更好,因爲它具有顯式的結構變量並支持不安全的內存訪問。

0

我會認爲一個結構是一個變量的集合與膠帶粘在一起。如果結構foo具有字段xy,則聲明類型foo的變量,字段或參數應基本上聲明稱爲foo___xfoo___y的變量,字段或參數。事情變得棘手的唯一地方是數組或byrefs。如果有人希望處理這些問題,那麼必須能夠創建任意大小的數組元素,訪問數組元素和具有位移的引用。處理這些需要能夠將數組的元素設置爲任意大小,並且需要能夠在解引用數組元素或byref時應用位移。此外,如果代碼需要對結構進行byref,則必須確保其存儲位置總是以相同的方式排列;這很可能意味着如果某些參數作爲寄存器傳遞,結構必須始終作爲寄存器完全傳遞,或者完全傳遞到堆棧上。如果一個值參數在一個或多個寄存器中傳遞給稍後將其作爲byref傳遞的代碼,則必須將該值複製到堆棧中;無論參數是結構還是基元,這都是必需的。

相關問題