我一直在閱讀JIT和LuaJIT的跟蹤編譯器,我最終提出了一些問題。根據我的理解,LuaJIT的JIT不會像Java的HotSpot那樣編譯熱門方法,它會編譯源自循環的熱路徑。這是否意味着如果某個東西不是來自一個循環(比如我稱之爲C-api中的Lua函數),那麼代碼將永遠不會被激發?當你打另一個循環時會發生什麼?到第二個循環的路徑是否會被JIT處理,然後從該循環中得到一條新的路徑,或者第二個循環是否是同一條路徑的一部分?LuaJIT的跟蹤編譯器如何工作?
翻譯人員如何選擇最理想的熱路徑?假設我有一個ints - >字符串的散列表。現在想象一下,我調用table [x]時,x足夠3次和5次,它們已經變成了熱門路徑,並且解釋器如何決定哪個jDesc代碼調用table [x],其中x是4?
另一件事一直困擾着我的大腦。由於路徑是編譯的,而不是函數,編譯器會不會需要更多的內存?既然你不能真正重新使用另一條路徑的編譯代碼,我的意思是,因爲在一般情況下路徑可能會大於單個函數......
我明白字節碼和IR的工作方式,以及跟蹤編譯器的主要部分,至少我認爲我是這樣做的:P我只是有一些我不確定的細節。我已經遠離了LuaJIT源代碼,因爲我還沒有學會彙編(而且很多LuaJIT都是用匯編語言編寫的?) –
無論如何,我會閱讀你所建議的內容,看看它是否會帶來啓示。很好的答案btw! +1 –
@RobinHeggelundHansen:從技術上講,只有線程化解釋器在裝配中(以及與dynasm一起使用的特殊抽象),實際的示蹤劑和代碼發射器都在C中(這有點奇怪,因爲字段名稱非常緊湊,但當你理解這些約定時,它更容易一些)和Lua,我通常使用VS來爲我更容易地對源進行探測。我已經添加了幾個包含許多跟蹤方面的源文件 – Necrolis