我已經用C語言編寫了一個虛擬機,它對於非JIT虛擬機具有不錯的性能,但是我想學習新的東西並提高性能。我目前的實現只是使用一個開關將VM字節碼轉換爲指令,並將其編譯爲跳轉表。就像我所說的那樣,它表現得不錯,但是我遇到了只能用JIT編譯器克服的障礙。在程序集中編寫JIT編譯器
不久前,我已經問過一個類似的問題,關於自修改代碼,但我意識到我沒有提出正確的問題。
所以我的目標是爲這個C虛擬機編寫一個JIT編譯器,並且我想在x86程序集中完成它。 (我使用NASM作爲我的彙編程序)我不太清楚如何去做這件事。我對彙編很熟悉,並且已經研究了一些自修改代碼示例,但是我還沒有弄清楚如何進行代碼生成。
到目前爲止,我的主要塊是將指令複製到一個可執行的內存塊,與我的論點。我知道我可以在NASM中標記某一行,並將該地址的整行與靜態參數一起復制,但這不是很動態,並且不適用於JIT編譯器。我需要能夠解釋來自字節碼的指令,將它複製到可執行內存,解釋第一個參數,將其複製到內存中,然後解釋第二個參數,並將其複製到內存中。
我已經被告知有幾個庫可以讓這個任務更容易,比如GNU閃電,甚至LLVM。但是,在使用外部資源之前,我想先手動編寫它,以瞭解它是如何工作的。
這個社區能提供哪些資源或例子來幫助我開始這項工作?一個顯示兩個或三個指令(如「add」和「mov」)的簡單示例將用於生成可執行代碼,並在內存中動態地生成參數,這將帶來奇蹟。
只是因爲抖動產生的機器代碼並不意味着它本身需要用匯編語言編寫。這樣做沒有意義。 – 2011-02-17 23:28:47
嘗試的一箇中間步驟是使用GCC計算出的goto擴展(使用`void * optable [] = {&& op_add,&& op_subtract,...}`並且每個操作數是`op_add:... goto * optable [* ip ++] ;`)。我已經看到了像你所描述的交換式口譯員的巨大成就。 – 2011-07-28 01:39:25