- Lua解釋器構(gòu)建:從虛擬機(jī)到編譯器
- 吳尹杰
- 1096字
- 2023-06-28 15:30:28
1.2.2 虛擬機(jī)指令的編碼方式
前面介紹了虛擬機(jī)核心的數(shù)據(jù)結(jié)構(gòu)和基本的運行方式,使讀者對Lua虛擬機(jī)有了大概的認(rèn)識。Lua虛擬機(jī)運行的本質(zhì),就是不斷獲取并運行Lua的虛擬機(jī)指令。在Lua中,虛擬機(jī)有自己能夠識別的指令集,在這個集合里有不同的指令,會執(zhí)行不同的功能。Lua腳本經(jīng)過編譯后,會生成包含在指令集里的指令,以確保虛擬機(jī)能夠識別。在探討Lua虛擬機(jī)指令集之前,先來了解一下Lua虛擬機(jī)指令的幾種編碼方式。
Lua虛擬機(jī)指令的編碼方式(也是本書實現(xiàn)Lua解釋器采用的編碼方式)主要有3種,它們分別是iABC、iABx和iAsBx。虛擬機(jī)指令信息是保存在32bit無符號整型變量中,指令信息、參數(shù)信息會被編入這樣的整型變量中。每個指令一共有32bit(位),并且所有的指令長度都是一樣的。3種模式所表示的編碼方式是不一樣的。
iABC模式的編碼方式如圖1-16所示。從圖中可以看到,該模式的指令主要由4個部分組成,分別是opcode域、A域、B域和C域。

·圖1-16
opcode就是操作碼,本質(zhì)上指代的是虛擬機(jī)指令集里的指令(每個指令都有自己的數(shù)值編碼),也就是說,只要識別它就能夠知道當(dāng)前用的是哪個指令了。opcode占6bit,因此它能夠表示的最大值是26,也就是64,指令集的指令上限是64個。本書實現(xiàn)的Lua虛擬機(jī),并沒有包含官方所有的指令,隨書工程實現(xiàn)的指令一共是43個。
緊臨opcode域的是A域,它表示的是被操作的目標(biāo),本質(zhì)就是代表寄存器的位置。前文也提到過,Lua虛擬機(jī)的寄存器實際上用的是棧上的空間,因此A域的值指代的就是棧上的某個位置,在這個指令里被當(dāng)作寄存器使用了。A域占8bit,它能表示的最大值是256(所表示的值落在0~255這個區(qū)間),實際上限制了棧的有效空間(因為超過255,虛擬機(jī)指令就找不到這個位置了)。
接著是B域和C域,這兩個域主要是存放參數(shù)信息。它們各占9bit,能表示的最大范圍是29,也就是512。B域和C域具體代表什么信息,實際上是由opcode決定的。比如,操作對象如果是字符串,字符串本身的內(nèi)容是沒法編入這么短的域中的;因此,需要將不同的信息存放到不同的位置,再將它們的索引信息找出編入指令中。Lua的絕大多數(shù)指令,采用的是iABC模式。
iABx模式的編碼方式如圖1-17所示。和iABC模式不一樣的是,iABx模式?jīng)]有B和C域,而只有一個Bx域,這個域占18bit。使用這種模式的指令很少,只有OP_LOADK、OP_LOADKX和OP_CLOSURE三個指令。Bx所代表的值是無符號的。

·圖1-17
iAsBx模式的編碼方式如圖1-18所示。iAsBx的模式和iABx大體相當(dāng),只是高18bit的值是有符號的,可以表示負(fù)數(shù)。但是sBx域并沒有采取二進(jìn)制補(bǔ)碼的方式,而是采用一個bias值作為0值分界。因為sBx域占18bit,因此它能表示的最大無符號整數(shù)值是262143(218-1)。那么它的零值則是131071(262143>>1)。當(dāng)需要它表示-1時,那么sBx域的值為131070(131071-1)。采用iAsBx模式的指令一般和跳轉(zhuǎn)有關(guān)系,比如OP_JMP、OP_FORLOOP、OP_FORPREP和OP_TFORLOOP指令等。

·圖1-18
- 計算機(jī)圖形學(xué)編程(使用OpenGL和C++)(第2版)
- 劍指JVM:虛擬機(jī)實踐與性能調(diào)優(yōu)
- SAS數(shù)據(jù)統(tǒng)計分析與編程實踐
- C++從入門到精通(第5版)
- Learning Apache Cassandra
- Frank Kane's Taming Big Data with Apache Spark and Python
- Natural Language Processing with Python Quick Start Guide
- SAP Web Dynpro for ABAP開發(fā)技術(shù)詳解:基礎(chǔ)應(yīng)用
- 量子計算機(jī)編程:從入門到實踐
- Java Web應(yīng)用開發(fā)
- 計算機(jī)視覺增強(qiáng)現(xiàn)實應(yīng)用平臺開發(fā)
- C++ Game Development Cookbook
- C#程序開發(fā)教程
- Instant Buildroot
- 代碼揭秘