Lua代碼是怎么執(zhí)行的?
1.和靜態(tài)語言的差異悍引?
2.通過什么執(zhí)行?
3.執(zhí)行的是什么帽氓?
一.解釋器VS編譯型
1.解釋性(動(dòng)態(tài))語言與編譯型(靜態(tài))語言差異
1.1 解釋型語言
解釋型語言在代碼執(zhí)行階段通過解釋器一行行翻譯趣斤,通過字節(jié)碼一行行執(zhí)行。Lua屬于動(dòng)態(tài)解釋型語言黎休。
Lua執(zhí)行的流程主要分為:
1.Lua腳本先翻譯字節(jié)碼
2.然后通過虛擬機(jī)執(zhí)行
ByteCode通過虛擬機(jī)執(zhí)行
Lua虛擬機(jī)核心能力分為:
1.虛擬寄存器:通過內(nèi)存層面上的數(shù)據(jù)結(jié)構(gòu)模擬CPU物理寄存器浓领。
2.字節(jié)碼執(zhí)行
1.2.編譯型語言
編譯型語言通過不同的編譯器編譯成各CPU架構(gòu)類型可直接執(zhí)行的機(jī)器碼,可以直接供CPU執(zhí)行势腮。編譯后的機(jī)器碼不需要二次翻譯联贩,即為靜態(tài)語言。比如C/C++語言捎拯。編譯器最主要職責(zé):1.翻譯泪幌;2.優(yōu)化;3.機(jī)器碼生成署照。
1.3.編譯的作用
1.提升程序的遠(yuǎn)行效率祸泪。
2.盡量小的節(jié)省存儲(chǔ)空間。
二.VM及指令執(zhí)行
1.VM
虛擬機(jī)相對(duì)于物理機(jī)建芙,借助于操作系統(tǒng)對(duì)物理機(jī)器(CPU等硬件)的一種模擬浴滴、抽象,主要扮演CPU和內(nèi)存的作用岁钓。
主要職責(zé):
執(zhí)行字節(jié)碼中的指令升略,管理全局狀態(tài)(global_state)、數(shù)據(jù)棧(StackValue)和函數(shù)調(diào)用鏈狀態(tài)(CallInfo)
2.指令構(gòu)成
指令由4個(gè)字節(jié)32位組成屡限,以Lua5.4.3為例其中低7位為操作碼品嚣,后25位為操作數(shù),操作數(shù)又分了iABC, iABx, iAsBx, iAx, isJ幾種模式钧大。具體指令詳見:lopcodes.h/lopcodes.c文件翰撑,里面詳細(xì)列出了各指令的使用模式。
3.Lua執(zhí)行流程
虛擬機(jī)類似cpu執(zhí)行流程取指啊央、譯碼眶诈、執(zhí)行,Lua通過數(shù)據(jù)結(jié)構(gòu)來抽象模擬CPU遠(yuǎn)行的流程瓜饥,當(dāng)原型到某個(gè)Proto(函數(shù)原型逝撬,編譯生成的產(chǎn)物),通過for (;;)不斷去取指乓土,然后匹配Lua虛擬機(jī)指令類型宪潮,最后執(zhí)行相關(guān)指令溯警。整個(gè)過程通過指針pc++來指向下一條指令(Instruction)來不停的獲取指令執(zhí)行。通過斷言檢查棧的大小狡相,防止過棧頂梯轻。具體詳見:lvm.c#luaV_execute函數(shù)。
三.總結(jié)--執(zhí)行效率
1.靜態(tài)語言前面提到通過各平臺(tái)類型編譯器尽棕,最終編譯各CPU架構(gòu)能直接執(zhí)行的機(jī)器碼喳挑,而Lua屬于解釋型腳本語言,通過虛擬機(jī)執(zhí)行中間生成的字節(jié)碼滔悉。多了這么一層抽象伊诵,效率明顯也沒有直接執(zhí)行機(jī)器碼效率高。
2.雖然Lua虛擬機(jī)也是虛擬寄存器來實(shí)現(xiàn)氧敢,但我理解是內(nèi)存層面上的數(shù)據(jù)結(jié)構(gòu)模擬日戈。相比靜態(tài)語言是cpu通過物理寄存器存儲(chǔ)機(jī)器指令询张。指令讀取速度明顯要比內(nèi)存讀取要塊很多孙乖。