2013-11-28 55 views
6

我一直在閱讀JIT和LuaJIT的跟蹤編譯器,我最終提出了一些問題。根據我的理解,LuaJIT的JIT不會像Java的HotSpot那樣編譯熱門方法,它會編譯源自循環的熱路徑。這是否意味着如果某個東西不是來自一個循環(比如我稱之爲C-api中的Lua函數),那麼代碼將永遠不會被激發?當你打另一個循環時會發生什麼?到第二個循環的路徑是否會被JIT處理,然後從該循環中得到一條新的路徑,或者第二個循環是否是同一條路徑的一部分?LuaJIT的跟蹤編譯器如何工作?

翻譯人員如何選擇最理想的熱路徑?假設我有一個ints - >字符串的散列表。現在想象一下,我調用table [x]時,x足夠3次和5次,它們已經變成了熱門路徑,並且解釋器如何決定哪個jDesc代碼調用table [x],其中x是4?

另一件事一直困擾着我的大腦。由於路徑是編譯的,而不是函數,編譯器會不會需要更多的內存?既然你不能真正重新使用另一條路徑的編譯代碼,我的意思是,因爲在一般情況下路徑可能會大於單個函數......

回答

7

第一部分你需要在stand下面是LuaJIT IRBytecode,您可以在wiki上查看,這是LuaJIT解釋器運行和優化的內容,因此可以確定需要編譯的內容以及各種各樣的優化,以及優化的其他優化,如熱循環展開跟蹤路徑中的循環。

第二個地方,檢查是LJ FAQ,其中有這樣一段話:

問:在哪裏可以瞭解更多有關 LuaJIT使用的編譯器技術?

我打算寫更多關於LuaJIT的內部件 的文檔。在此期間,請使用以下谷歌學術 搜索來查找相關論文:

搜索:Trace Compiler

搜索:JIT Compiler

搜索:Dynamic Language Optimizations

搜索:SSA Form

搜索:Linear Scan Register Allocation

下面是LuaJIT中創新功能的列表。而且,你知道,閱讀 來源當然是啓蒙的唯一途徑。 :-)

教唆非常舌頭在臉頰(主要是「造成麥克側重於發展,而不是文檔),還有就是最後一句最重要的部分,來源是很乾淨,唯一實際途徑瞭解LJ如何做到它的魔術。此外,innovative features link還爲尋找什麼提供了一個線索。

維基百科在跟蹤JIT時有一個more descriptive page,但底層的論文是幫助理解LJ源文件中使用的概念的最有用的東西。

一些源文件(C語言),讓你開始

+0

我明白字節碼和IR的工作方式,以及跟蹤編譯器的主要部分,至少我認爲我是這樣做的:P我只是有一些我不確定的細節。我已經遠離了LuaJIT源代碼,因爲我還沒有學會彙編(而且很多LuaJIT都是用匯編語言編寫的?) –

+0

無論如何,我會閱讀你所建議的內容,看看它是否會帶來啓示。很好的答案btw! +1 –

+3

@RobinHeggelundHansen:從技術上講,只有線程化解釋器在裝配中(以及與dynasm一起使用的特殊抽象),實際的示蹤劑和代碼發射器都在C中(這有點奇怪,因爲字段名稱非常緊湊,但當你理解這些約定時,它更容易一些)和Lua,我通常使用VS來爲我更容易地對源進行探測。我已經添加了幾個包含許多跟蹤方面的源文件 – Necrolis