第5章 指令集和解釋器

Java虛擬機(jī)顧名思義,就是一臺虛擬的機(jī)器,而字節(jié)碼(bytecode)就是運(yùn)行在這臺虛擬機(jī)器上的機(jī)器碼
每一個類或者接口都會被Java編譯器編譯成一個class文件,類或接口的方法信息就放在class文件的method_info結(jié)構(gòu)中 商佑。
如果方法不是抽象的,也不是本地方法厢塘,方法的Java代碼就會被編譯器編譯成字節(jié)碼(即使方法是空的茶没,編譯器也會生成一條return語句),存放在method_info結(jié)構(gòu)的Code屬性中晚碾。

package jvmgo.book.ch03;

public class ClassFileTest {
    
    public static final boolean FLAG = true;
    public static final byte BYTE = 123;
    public static final char X = 'X';
    public static final short SHORT = 12345;
    public static final int INT = 123456789;
    public static final long LONG = 12345678901L;
    public static final float PI = 3.14f;
    public static final double E = 2.71828;
    
    public static void main(String[] args) throws RuntimeException {
        System.out.println("Hello, World!");
    }
}

方法信息就放在class文件的method_info結(jié)構(gòu)中,方法的Java代碼編譯成字節(jié)碼存method_info的Code屬性的code子屬性中

字節(jié)碼中存放編碼后的Java虛擬機(jī)指令抓半。每條指令都以一個單字節(jié)的操作碼(opcode)開頭,這就是字節(jié)碼名稱的由來格嘁。由于只使用一字節(jié)表示操作碼笛求,顯而易見,Java虛擬機(jī)最多只能支持256(2^8 )條指令糕簿。
到第八版為止探入,Java虛擬機(jī)規(guī)范已經(jīng)定義了205條指令,操作碼分別是0(0x00)到202(0xCA)懂诗、254(0xFE)和255(0xFF)蜂嗽。
這205條指令構(gòu)成了Java虛擬機(jī)的指令集(instruction set)。

和匯編語言類似殃恒,為了便于記憶植旧,Java虛擬機(jī)規(guī)范給每個操作碼都指定了一個助記符(mnemonic)。比如操作碼是0x00這條指令芋类,因為它什么也不做隆嗅,所以它的助記符是nop(no operation)界阁。

Java虛擬機(jī)使用的是變長指令侯繁,操作碼后面可以跟零字節(jié)或多字節(jié)的操作數(shù)(operand)。如果把指令想象成函數(shù)的話泡躯,操作數(shù)就是它的參數(shù)贮竟。為了讓編碼后的字節(jié)碼更加緊湊,很多操作碼本身就隱含了操作數(shù)较剃,比如把常數(shù)0推入操作數(shù)棧的指令是iconst_0咕别。

0xB2

可以看到,該指令的操作碼是0xB2写穴,助記符是getstatic惰拱。

它的操作數(shù)是0x0002,代表常量池里的第二個常量啊送。


0x0002

在第4章中討論過偿短,操作數(shù)棧和局部變量表只存放數(shù)據(jù)的值欣孤,并不記錄數(shù)據(jù)類型。
結(jié)果就是:指令必須知道自己在操作什么類型的數(shù)據(jù)昔逗。這一點(diǎn)也直接反映在了操作碼的助記符上降传。
例如,
iadd指令就是對int值進(jìn)行加法操作勾怒;
dstore指令把操作數(shù)棧頂?shù)?code>double值彈出婆排,存儲到局部變量表中;
areturn從方法中返回引用值笔链。
也就是說段只,如果某類指令可以操作不同類型的變量,則助記符的第一個字母表示變量類型鉴扫。

Java虛擬機(jī)規(guī)范把已經(jīng)定義的205條指令按用途分成了11類:

  • 常量(constants)指令:
    把常量推入操作數(shù)棧頂翼悴。常量可以來自三個地方:隱含在操作碼里、操作數(shù)運(yùn)行時常量池幔妨。常量指令共有21條

加載(loads)指令鹦赎、
存儲(stores)指令、
操作數(shù)棧(stack)指令误堡、
數(shù)學(xué)(math)指令古话、
轉(zhuǎn)換(conversions)指令、
比較(comparisons)指令锁施、
控制(control)指令陪踩、
引用(references)指令、
擴(kuò)展(extended)指令
保留(reserved)指令悉抵。

保留指令一共有3條肩狂。其中一條是留給調(diào)試器的,用于實現(xiàn)斷點(diǎn)姥饰,操作碼是202(0xCA)傻谁,助記符是breakpoint
另外兩條留給Java虛擬機(jī)實現(xiàn)內(nèi)部使用列粪,操作碼分別是254(0xFE)和266(0xFF)审磁,助記符是impdep1impdep2
這三條指令不允許出現(xiàn)在class文件中岂座。

5.2 指令和指令解碼

Java虛擬機(jī)規(guī)范的2.11節(jié)介紹了Java虛擬機(jī)解釋器的大致邏

do {
  atomically calculate pc and fetch opcode at pc;
  if (operands) fetch operands;
  execute the action for the opcode;
} while (there is more to do);

每次循環(huán)都包含三個部分:
計算pc态蒂、指令解碼、指令執(zhí)行费什。
go偽代碼

for {
  pc := calculatePC()
  opcode := bytecode[pc]
  inst := createInst(opcode)
  inst.fetchOperands(bytecode)
  inst.execute()
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钾恢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘩蚪,老刑警劉巖刑桑,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異募舟,居然都是意外死亡祠斧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門拱礁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琢锋,“玉大人,你說我怎么就攤上這事呢灶∥獬” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵鸯乃,是天一觀的道長鲸阻。 經(jīng)常有香客問我,道長缨睡,這世上最難降的妖魔是什么鸟悴? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮奖年,結(jié)果婚禮上细诸,老公的妹妹穿的比我還像新娘。我一直安慰自己陋守,他們只是感情好震贵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著水评,像睡著了一般猩系。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上中燥,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天寇甸,我揣著相機(jī)與錄音,去河邊找鬼褪那。 笑死幽纷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的博敬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼峰尝,長吁一口氣:“原來是場噩夢啊……” “哼偏窝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤祭往,失蹤者是張志新(化名)和其女友劉穎伦意,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硼补,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驮肉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了已骇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片离钝。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖褪储,靈堂內(nèi)的尸體忽然破棺而出卵渴,到底是詐尸還是另有隱情,我是刑警寧澤鲤竹,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布浪读,位于F島的核電站,受9級特大地震影響辛藻,放射性物質(zhì)發(fā)生泄漏碘橘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一吱肌、第九天 我趴在偏房一處隱蔽的房頂上張望蛹屿。 院中可真熱鬧,春花似錦岩榆、人聲如沸错负。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犹撒。三九已至,卻和暖如春粒褒,著一層夾襖步出監(jiān)牢的瞬間识颊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工奕坟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祥款,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓月杉,卻偏偏與公主長得像刃跛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苛萎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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

  • 第6章類文件結(jié)構(gòu) 6.1 概述 6.2 無關(guān)性基石 6.3 Class類文件的結(jié)構(gòu) java虛擬機(jī)不和包括java...
    kennethan閱讀 908評論 0 2
  • Java 虛擬機(jī)的指令由一個字節(jié)長度的桨昙、代表著某種特定操作含義的數(shù)字(稱為操作碼检号,Opcode)以及跟隨其后的零至...
    好好學(xué)習(xí)Sun閱讀 538評論 0 0
  • 銀東縣城有位劉大媽,她可是位在方圓百里小有名氣的接生婆蛙酪。 劉大媽從二十幾歲便開始為人接生齐苛,到五十多歲,經(jīng)她接生的孩...
    無為山人閱讀 489評論 0 0
  • 一 再幾日 可夭夭 可灼灼 冠名的潭水 吟為美酒千盅 嫣紅輕淺 尋作城南的優(yōu)柔 我打馬馳過 以筆作鞭 誰是我的汪倫...
    張綱閱讀 175評論 0 1
  • 成了成年人桂塞,終于知道了成年人的焦慮凹蜂。我媽發(fā)燒住院的幾天,我要照顧媽媽又要照顧女朋友阁危,感覺哪一點(diǎn)做不好就心里對不起她...
    A01琪公子閱讀 187評論 0 0