揭祕Java虛擬機器閱讀筆記一:何為虛擬機器
序
《揭祕Java虛擬機器:JVM設計原理與實現》一書的第一章概述了虛擬機器,更多的是基礎知識的普及,比如彙編的基礎知識,主要講述了Java程式碼是怎麼被機器執行的,以下是我對書中知識的理解!
如果有幸能被您看到,並且發現其中有不足之處,還望指出,不斷犯錯,才能不斷進步!
越是學習,才能越是知道,學無止境!
正文
要知道何為虛擬機器,就要先從Java程式碼是如何執行的這點說起
由於CPU只能執行機器指令 ,要想執行Java程式碼,需要先把Java原始碼轉換成中間語言(Java位元組碼指令集 ),再通過虛擬機器判定當前執行平臺並把中間語言轉換成相應的機器指令,即
Java原始碼 => 中間語言 => 機器指令
Java語言是親和人類的,因為它是根據人類的習慣模式設計的,但這樣的方式並不是機器所能理解的,機器只認得記憶體、堆疊..
要執行Java程式碼,還是需要把符合人類思維的Java程式碼轉換為符合機器習慣的機器指令,但是這裡引發了一個問題,那就是不同作業系統的指令集並不是統一的。
Java設計的初衷是實現相容,實現平臺無關,實現write once,run anywhere!所以在Java程式碼和機器指令之間,引入了中間語言,即Java位元組碼指令集
機器指令集是面對CPU的硬體指令集,Java實現相容的方式是開發一套各大作業系統通用的軟體層面的指令集 -- Java位元組碼指令集
把符合人類思維模式的Java程式碼轉換成符合機器習慣的中間語言,再由中間語言去應付不同的作業系統,從而實現相容
這裡需要著重記錄Java位元組碼指令集,Java的中間語言是刻板的,不知道何為物件,它的職能是實現壓棧、讀寫區域性變量表、呼叫目標方法...
Java位元組碼指令集比硬體指令集更加豐富,因為Java是面向物件的程式語言,自然需要一套支援型別操作的特殊指令,書中把指令集分為:
-
資料交換指令
提供資料在不同記憶體區之間的傳送和交換
-
函式呼叫指令
-
運算指令集
包含算術運算、位運算、比較運算、邏輯運算....
-
控制轉移指令
switch分支選擇、if條件判斷、for迴圈...
-
物件建立與型別轉換指令
new、型別轉換
程式設計人員只需要熟練的使用這套通用的API,就可實現跨平臺的開發,因為Java程式碼 => 中間語言這步是平臺無關的,剩下的,就交給虛擬機器吧!
何為虛擬機器?
虛擬機器的職能就相當於一個翻譯,具備把中間語言翻譯成各大作業系統的機器指令的能力,事實上,虛擬機器一直在做這件事!
虛擬機器把記憶體分為:運算元棧、區域性變量表、Java堆、常量池、方法區
Java程式碼本質上就是在這些記憶體區中執行的,虛擬機器把執行翻譯為機器指令使之能在CPU中真實的執行!