- Lua解釋器構(gòu)建:從虛擬機(jī)到編譯器
- 吳尹杰
- 712字
- 2023-06-28 15:30:27
1.1.2 Lua解釋器的運(yùn)行機(jī)制
上一節(jié)介紹了Lua解釋器的整體架構(gòu),并且在比較抽象的層面上,介紹了它的運(yùn)作機(jī)制。本節(jié)會(huì)詳細(xì)論述Lua解釋器的整體運(yùn)行機(jī)制。讀者已經(jīng)知道:Lua解釋器由編譯器和虛擬機(jī)兩個(gè)部分組成;腳本代碼,在經(jīng)過編譯器編譯之后,會(huì)得到一系列的字節(jié)碼,它們會(huì)被存放到一個(gè)Proto結(jié)構(gòu)中。
這里需要對(duì)字節(jié)碼進(jìn)行解釋,字節(jié)碼是一種能夠被虛擬機(jī)識(shí)別的中間代碼。一些解釋型語言,能夠通過它們的編譯器將源代碼編譯成字節(jié)碼,再交給虛擬機(jī)去執(zhí)行。和機(jī)器碼不同,它不能直接被CPU識(shí)別和執(zhí)行,而需要借助虛擬機(jī)。只要虛擬機(jī)程序能夠在不同架構(gòu)的CPU上運(yùn)行,那么同一份字節(jié)碼,就能在這些不同架構(gòu)的CPU上運(yùn)行。字節(jié)碼的名稱來自其指令的組織形式。一般來說,一個(gè)字節(jié)碼指令是由1字節(jié)的操作碼(opcode)和若干個(gè)可選操作參數(shù)組成(如圖1-9所示)。一般來說,字節(jié)碼指令就是虛擬機(jī)中定義的指令。

·圖1-9
如圖1-10所示,Lua解釋器的內(nèi)置編譯器會(huì)將腳本編譯成類似這種形式的指令,也就是虛擬機(jī)指令(后文統(tǒng)稱為指令)。前文所述的Proto結(jié)構(gòu),有一個(gè)指令列表(code列表),這個(gè)列表會(huì)用來存放編譯好的指令。指令列表的最后一個(gè)指令通常是RETURN指令,代表程序結(jié)束。

·圖1-10
在Lua-5.3.5中,編譯腳本源碼,并將指令存入Proto結(jié)構(gòu)是通過luaL_loadfile函數(shù)來進(jìn)行的。這步操作完之后,腳本代碼并不會(huì)立即被執(zhí)行,而需要調(diào)用lua_pcall函數(shù)來執(zhí)行Proto里的指令。lua_pcall函數(shù)會(huì)調(diào)用Lua虛擬機(jī)的入口函數(shù),進(jìn)入到這個(gè)函數(shù)之后,Lua虛擬機(jī)會(huì)將Proto指令列表中的指令,逐個(gè)取出來并執(zhí)行。虛擬機(jī)內(nèi)執(zhí)行的偽代碼,如下所示。

Proto結(jié)構(gòu)的code列表,最后一般都是RETURN指令,這是編譯器自動(dòng)加上去的,它要確保程序最終能夠被終止。當(dāng)然,虛擬機(jī)的指令執(zhí)行函數(shù)不會(huì)這么簡單,這里只是為了給讀者建立一個(gè)整體的概念,理解它大體的運(yùn)行流程。
- 自己動(dòng)手寫搜索引擎
- Apache ZooKeeper Essentials
- CMDB分步構(gòu)建指南
- R語言數(shù)據(jù)可視化之美:專業(yè)圖表繪制指南
- DevOps Automation Cookbook
- Visual Basic程序設(shè)計(jì)教程
- 3D少兒游戲編程(原書第2版)
- Hands-On Functional Programming with TypeScript
- VMware虛擬化技術(shù)
- 網(wǎng)站構(gòu)建技術(shù)
- Android開發(fā):從0到1 (清華開發(fā)者書庫)
- 微服務(wù)架構(gòu)深度解析:原理、實(shí)踐與進(jìn)階
- Node Cookbook(Second Edition)
- MySQL入門很輕松(微課超值版)
- Web App Testing Using Knockout.JS