2017-01-13 22 views
1

我目前正在爲Java類語言構建編譯器的代碼生成階段。我試圖瞭解如何實現虛擬方法的動態分派。動態調度實現 - 虛函數表偏移

我得到如何爲每個類構建一個虛擬函數表,並在每個對象中存儲一個指向它的指針。我不明白的是,當爲函數調用生成代碼時,如何知道表中該函數的偏移量?

謝謝。

+0

這是您的語言,編譯器和二進制表示的設計問題。您可以考慮研究JLS和JVM規範,以便深入瞭解Java如何實現它(自從您提到Java以來​​),但是存在各種變體和其他所有替代方法。總的來說,這個問題太廣泛了,無法在這裏回答。 –

+0

你如何知道數據成員的偏移量?這兩個問題如何不同? – rici

回答

0

你怎麼知道你的語言裏有什麼東西?你在解析的時候把它寫下來。

我在我的一種玩具語言中所做的就是爲每個類保留一個「vtable size」,並且當您向類中添加一個新方法時,您將vtable大小寫爲某處某處的偏移量即創建一個查找表,將方法名映射到關於它的信息,比如它的參數類型及其在vtable中的偏移量),然後添加到該大小以說明新添加的方法。

當然,這假設你的語言實際上使用了一個vtable,比如C++。如果您使用Smalltalk或Objective-C的風格來使用消息傳遞,那麼您構建的這個表格實際上會保存到您編譯的產品中,並直接使用。現在查表比直接訪問偏移要慢,但也有一個好處,即調用者不需要知道對象的類型以調用對象的方法,並且可以輕鬆地將對象添加到對象,而無需重新編譯整個程序。