C ,C ,Lua在執行時,各自都做了什麼?

時間 2021-06-01 07:21:12

1樓:徐波

c#的IL是一種標準,微軟的所有.net語言,諸如vb,f#等都可以編譯為IL,所以虛擬機器寫一套就可以。

lua的虛擬機器為自己優化,沒法通用

2樓:

首先,你要明白JIT是做什麼的,這玩意兒就是把某種位元組碼編譯成機器碼,然後直接呼叫執行。因此本質上就是個翻譯器。既然是翻譯器,那麼自然用什麼語言寫都是可以的,比如說C++,C神馬的。

你願意的話拿rust寫都成。只要語言支援「直接執行機器碼」的能力就成。

然後逐條回答問題:

其實在書上有寫過具體的,比如C++編譯成了機器碼.C#編譯成了中間語言,然後由JIT解釋執行,Lua則是由C寫的虛擬機器解釋的

但腦子裡就有很多問題

1.C#通過JIT解釋執行,JIT是什麼寫的?他是將IL解釋成了什麼?

JIT不是直譯器,是編譯器,編譯成機器碼以後在機器上直接執行。因此談不上解釋成什麼。另外直譯器也不是「解釋成什麼」,而是按照位元組碼逐個直接做事。至於C#,我猜是C++寫的。

2.Lua通過C寫的虛擬機器解釋字串來執行,那麼它是如何執行的?比如local a=1+1,是將這句話變成了機器碼直接執行?還是使用C來實現這個加法,再返回結果呢?

你可以用luac -l -l 看到結果:

$ cat test.lua

local a = 1 + 1

$ luac -l -l test.lua

main (2 instructions at 0x7f8e04403630)

0+ params, 2 slots, 1 upvalue, 1 local, 1 constant, 0 functions

1 [1] LOADK 0 -1 ; 2

2 [1] RETURN 0 1

constants (1) for 0x7f8e04403630:

1 2locals (1) for 0x7f8e04403630:

0 a 2 3

upvalues (1) for 0x7f8e04403630:

0 _ENV 1 0

編譯器將1+1直接優化為了2,然後載入這個2,然後return。解釋執行的時候先執行LOADK載入這個2,然後執行RETURN返回上層函式。

3.如果C#能將某些字串(IL)在執行時變成機器碼,那Lua為什麼不這麼做?

LuaJIT了解一下?

Chrome 在執行時占用記憶體太多了嗎?為什麼?

粗鹽與膠泥與貓 不是,記憶體不就是拿來用的嗎,占用滿了也是作業系統自己分配調整的事,占用記憶體大說明後台有各種預載入。大家買房子回來是空著欣賞的還是利用好每塊地方住的舒服的?不會真的有人的記憶體是拿來看的不拿來充分利用的吧,不會吧不會吧不會吧這類人建議用的各種防毒軟體 燃燒記憶體 玩, Skatin...

為什麼多型呼叫方法必須在執行時才能確定,難道在編譯的時候無法確定到底引用的是哪個方法嗎?

喬冬 實現多型的機制 父類或介面定義的引用變數可以指向子類或具體實現類的例項物件,而程式呼叫的方法在執行期才動態繫結,就是記憶體裡正在執行的那個物件的方法,而不是引用變數的型別中定義的方法。因為在編譯期不會分配記憶體空間,更不會建立例項物件,所以父類引用無法確定指向那個物件的方法。 因為class檔...

最近買了一台創維電視,我能聽見機身在執行時發出高頻噪音,別人聽不到,換了一台依然如此,這是為什麼?

可能是聽覺敏感。耳蝸型聽力損傷會出現這種狀況,別人聽到增加10個分貝的音量,你的耳朵感受是增加20個分貝。建議進行聽力檢測。 歐堡諾門窗 別人聽不到,你可以聽到,說明你耳朵對聲音比較靈敏,人耳正常聽力的頻率範圍是20HZ到2萬HZ,但是實際上的情況,由於每個人對聽覺的靈敏度等多種情況有所不同,所以一...