匯編器與虛擬機(jī)
- 作者:新網(wǎng)
- 來(lái)源:新網(wǎng)
- 瀏覽:100
- 2018-05-10 13:22:51
上篇文章主要觀點(diǎn)是程序?qū)崿F(xiàn)就是一個(gè)翻譯過(guò)程,最終會(huì)翻譯成(JIT)CPU指令。我們倒著推,那么GIT的上層就是虛擬機(jī),而虛擬機(jī)是針對(duì)中間字節(jié)碼的。中間字節(jié)碼就是油匯編器對(duì)匯編語(yǔ)言文件的一個(gè)翻譯。
上篇文章主要觀點(diǎn)是程序?qū)崿F(xiàn)就是一個(gè)翻譯過(guò)程,最終會(huì)翻譯成(JIT)CPU指令。我們倒著推,那么GIT的上層就是虛擬機(jī),而虛擬機(jī)是針對(duì)中間字節(jié)碼的。中間字節(jié)碼就是油匯編器對(duì)匯編語(yǔ)言文件的一個(gè)翻譯。
<
div> 那么我們先來(lái)談?wù)剠R編器(虛擬匯編):
對(duì)于匯編器實(shí)現(xiàn)中的詞法分析肯定是很簡(jiǎn)單的,語(yǔ)法分析也嗯容易,因?yàn)槠湔Z(yǔ)法大致有三種:
1:函數(shù)定義
2:標(biāo)簽定義
3:定義變量
3:匯編指令語(yǔ)句
所以語(yǔ)法分析的結(jié)果就是要得到所有的函數(shù)定義表,然后每個(gè)函數(shù)中又有標(biāo)簽表和變量表)
我們的目的是生成中間字節(jié)碼,以至于提高速度,那么盡量讓每個(gè)指令干自己指令內(nèi)部的事情而不需要關(guān)心其他(否則速度就降下來(lái)了)。
這樣虛擬機(jī)的實(shí)現(xiàn)也就更簡(jiǎn)單。
因?yàn)樘摂M機(jī)的實(shí)現(xiàn)大概只需要一個(gè)函數(shù)表以及一個(gè)運(yùn)行時(shí)堆棧就OK。那么我們的中間字節(jié)碼中的虛擬指令就應(yīng)該只針對(duì)棧進(jìn)行操作(而且都是固定了偏移的)
(想象一下,如果不存在匯編器,而進(jìn)行純粹的語(yǔ)言解釋器,那么會(huì)通過(guò)一個(gè)map結(jié)構(gòu)去查詢某個(gè)變量,而先通過(guò)匯編器-(可以看成預(yù)處理,事實(shí)上預(yù)處理也就是一個(gè)翻譯過(guò)程)
去生成中間指令,給每個(gè)變量安排一個(gè)相對(duì)索引,那么查詢某變量,只需要一個(gè)常量時(shí)間-更短的時(shí)間即可)
(正因?yàn)轭A(yù)處理-翻譯過(guò)程,所以才使得下一步過(guò)程的執(zhí)行速度才更快)
接下來(lái)就是代碼生成,寫入OPcode,然后它具有參數(shù),而參數(shù)無(wú)非就是一個(gè)特定偏移。
虛擬機(jī)去執(zhí)行這個(gè)中間字節(jié)碼,提供一個(gè)堆棧作為運(yùn)行時(shí)。