虛擬機(jī)字節(jié)碼執(zhí)行引擎【基于棧的字節(jié)碼解釋執(zhí)行引擎(二)】

基于棧的指令集與基于寄存器的指令集

Javac編譯器輸出的字節(jié)碼指令流毫缆,基本上是一種基于棧的指令集架構(gòu)(Instruction Set Architecture,ISA),字節(jié)碼指令流里面的指令大部分都是零地址指令梆掸,它們依賴(lài)操作數(shù)棧進(jìn)行工作痕慢。
與之相對(duì)的另外一套常用的指令集架構(gòu)師基于寄存器的指令集,最典型的就是x86的二地址指令集狂秘,通俗來(lái)講就是現(xiàn)在主流PC機(jī)中物理硬件直接支持的指令集架構(gòu)磅甩,這些指令依賴(lài)寄存器進(jìn)行工作。

兩者之間的區(qū)別:
以“1+1”為例绩社,

  • 基于棧的指令集如下
iconst_1
iconst_1
iadd
istore_0

兩條iconst_1指令連續(xù)把另個(gè)常量1壓入棧后,iadd指令把棧頂?shù)膬蓚€(gè)值出棧赂苗、相加愉耙。然后把結(jié)果放回棧頂,最后istore_0把棧頂?shù)闹捣诺骄植孔兞勘淼牡?個(gè)變量槽中拌滋。
這種指令流中的指令通常都是不帶參數(shù)的朴沿,使用操作數(shù)棧中的數(shù)據(jù)作為指令的運(yùn)算輸入,指令的運(yùn)算結(jié)果也存儲(chǔ)在操作數(shù)棧之中败砂。

  • 基于寄存器的指令集
mov  eax,1
add  eax,1

mov指令把EAX寄存器的值設(shè)為1赌渣,然后add指令再把這個(gè)值加1,結(jié)果就保存在EAX寄存器里昌犹。這種二地址指令是x86指令集中的主流坚芜,每個(gè)指令都包含兩個(gè)單獨(dú)的輸入?yún)?shù),依賴(lài)于寄存器來(lái)訪(fǎng)問(wèn)和存儲(chǔ)數(shù)據(jù)斜姥。

基于棧的指令集主要優(yōu)點(diǎn)是可移植鸿竖,因?yàn)榧拇嫫饔捎布苯犹峁绦蛑苯右蕾?lài)這些硬件寄存器則不可避免要受到硬件約束铸敏。如現(xiàn)在的32位80x86體系的處理器能提供了8個(gè)32位的寄存器缚忧,而ARMv6體系的處理器則提供了30個(gè)32位的通用寄存器,其中前16個(gè)用戶(hù)模式可使用杈笔。如使用棧架構(gòu)的指令集闪水,用戶(hù)程序不會(huì)直接用到這些寄存器,那就可由虛擬機(jī)實(shí)現(xiàn)來(lái)自行決定把一些訪(fǎng)問(wèn)最頻繁的數(shù)據(jù)(程序計(jì)數(shù)器蒙具、棧頂緩存等)放到寄存器中以獲取盡量好的性能球榆,這樣實(shí)現(xiàn)起來(lái)也更簡(jiǎn)單一些峰弹。棧機(jī)構(gòu)的指令集還有一些其它優(yōu)點(diǎn),如代碼相對(duì)更加緊湊(字節(jié)碼每個(gè)字節(jié)就對(duì)應(yīng)一條指令)芜果、編譯器實(shí)現(xiàn)更加簡(jiǎn)單(不需考慮空間分配)等。
主要缺點(diǎn)是理論上執(zhí)行速度相對(duì)來(lái)說(shuō)會(huì)稍慢一些融师,所有主流物理機(jī)的指令集都是寄存器架構(gòu)也從側(cè)面印證了這點(diǎn)右钾。不過(guò)這里的執(zhí)行速度就要局限于解析執(zhí)行的狀態(tài)下,如果經(jīng)過(guò)即時(shí)編譯器輸出成物理機(jī)上的匯編指令流旱爆,那就與虛擬機(jī)采用哪種指令的架構(gòu)沒(méi)什么關(guān)系舀射。
在解釋執(zhí)行時(shí),棧架構(gòu)指令集的代碼雖然緊湊怀伦,但完成相同功能所需的指令數(shù)量一般會(huì)比寄存器架構(gòu)來(lái)的更多脆烟。因?yàn)槌鰲!⑷霔2僮鞅旧砭彤a(chǎn)生了相當(dāng)大量的指令房待。更重要的是棧實(shí)現(xiàn)的內(nèi)存中邢羔,頻繁的棧訪(fǎng)問(wèn)也就意味著頻繁的內(nèi)存訪(fǎng)問(wèn),相對(duì)于處理器來(lái)說(shuō)桑孩,內(nèi)存始終是執(zhí)行速度的瓶頸拜鹤。盡管虛擬機(jī)可采取棧頂緩存的優(yōu)化方法,把最常用的操作映射到寄存器中避免直接內(nèi)存訪(fǎng)問(wèn)流椒,但這也只是優(yōu)化措施而不是解決本質(zhì)問(wèn)題的方法敏簿。因此由于指令數(shù)量和內(nèi)存訪(fǎng)問(wèn)的原因,導(dǎo)致了棧架構(gòu)指令集的執(zhí)行速度會(huì)相對(duì)慢上一些宣虾。

《深入理解Java虛擬機(jī)》第三版學(xué)習(xí)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惯裕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绣硝,更是在濱河造成了極大的恐慌蜻势,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件域那,死亡現(xiàn)場(chǎng)離奇詭異咙边,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)次员,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)败许,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人淑蔚,你說(shuō)我怎么就攤上這事市殷。” “怎么了刹衫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵醋寝,是天一觀(guān)的道長(zhǎng)搞挣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)音羞,這世上最難降的妖魔是什么囱桨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮嗅绰,結(jié)果婚禮上舍肠,老公的妹妹穿的比我還像新娘。我一直安慰自己窘面,他們只是感情好翠语,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著财边,像睡著了一般肌括。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酣难,一...
    開(kāi)封第一講書(shū)人閱讀 49,879評(píng)論 1 290
  • 那天谍夭,我揣著相機(jī)與錄音,去河邊找鬼憨募。 笑死慧库,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馋嗜。 我是一名探鬼主播齐板,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼葛菇!你這毒婦竟也來(lái)了甘磨?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤眯停,失蹤者是張志新(化名)和其女友劉穎济舆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體莺债,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滋觉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了齐邦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椎侠。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖措拇,靈堂內(nèi)的尸體忽然破棺而出我纪,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布浅悉,位于F島的核電站趟据,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏术健。R本人自食惡果不足惜汹碱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荞估。 院中可真熱鬧比被,春花似錦、人聲如沸泼舱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娇昙。三九已至,卻和暖如春笤妙,著一層夾襖步出監(jiān)牢的瞬間冒掌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工蹲盘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留股毫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓召衔,卻偏偏與公主長(zhǎng)得像铃诬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苍凛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容