2014-01-17 46 views
3

我讀wikiinstruction set,我整個這一段就來了:是字節碼作爲JVM的指令集處理嗎?

支持字節碼的ISA如 Smalltalk中,Java虛擬機,而微軟的公共語言 運行一些虛擬機,實現這個通過將常用的 代碼路徑的字節碼轉換爲本地機器代碼。此外,這些虛擬機通過解釋 (請參閱:即時編譯)執行較不常用的代碼路徑。全美達以這種方式在VLIW處理器上實現了x86 指令集。

這究竟意味着什麼? 是bytecodesISA對於JVMJVM輪到支持ISA的處理器。

回答

10

是的,這是你猜對的。 JVM/JRE使用Java字節碼作爲其指令集,並且每個JVM需要在本地/本地硬件(因此也就是本地指令集)上編譯並可運行。這從維基百科圖說明了這口井,我認爲:

enter image description here

的JRE/JVM需要編譯它運行在特定的硬件,但由JVM本身的Java字節碼的定義和解釋保持不變。正如你指出的那樣,Java字節碼可以被看作是Java源代碼和本地機器/二進制代碼之間的一種抽象層。它確實允許典型的Java程序員和需要知道任何特定於機器的問題的分離,因爲幾乎所有這些都是由JVM/JRE處理的。

+0

+1選擇圖。 –

+0

我不會在JVM組件下面放置「Java API」,因爲大多數Java API都是用Java實現的,並且與應用程序代碼通過相同的鏈。 – Holger

3

是字節碼是ISA對於JVM

字節碼是JVM中的指令。

和JVM輪流支持處理器的ISA。

但真正的處理器做了真正的工作,所以JVM將這些轉換爲本地指令。首先它是互操作的,這很簡單,但執行速度較慢,一旦代碼被優化(代價很高),代碼就會像原始本機指令一樣快速運行。

+2

所以說JVM在本地指令和字節碼之間提供了一個抽象層是否正確? –

+1

@ user1988876:這是正確的。 – blackcompe

2

JVM基本上模擬了Java程序的CPU。正如CPU在硬件上本地執行組裝好的操作碼,JVM執行Java操作碼,但嚴格執行軟件。

這究竟意味着什麼?是字節碼是ISA的JVM和JVM 輪流支持處理器的ISA。

ISA(指令集架構)指定了適用於編寫直接在CPU上運行的低級軟件的整套規程和技術。它包含一組操作碼,它們是不可歸屬的直接CPU命令。 JVM識別它自己的一組字節碼(即8位操作碼),它們指示JVM執行解釋器原語指令。所以,是的,字節碼規範構成了JVM的ISA的一部分。

JVM利用其自己的內存 逐個遍歷執行它們的操作碼列表來模擬硬件組件(例如堆棧,寄存器,主存儲器)並使用基本算術和邏輯操作來模擬ALU。這些模擬組件也構成了JVM的ISA。這是任何口譯員的基本結構。但是,爲了改善Java應用程序的運行時間,JVM將「熱點」編譯爲機器特定的代碼以獲得最佳性能。熱點是頻繁運行的代碼的一部分。這就是所謂的「即時」編譯,可以在程序執行時完成。這種技術使Java的性能更接近於編譯語言的性能。 JIT也在.NET框架中使用。

每個操作系統都有自己的JVM實現,這也可能因設備的ISA而異。例如,您可能有一個爲Linux-Arm,Linux-x86或Windows-x86編寫的JVM。 JVM本身可以用像C這樣的獨立於平臺的語言(類似於C語言)編寫,但其JIT編譯器必須支持編譯到設備的指令集。

+0

爲新處理器編寫JVM將會很難,我猜想,一方面與ISA的處理器以及另一方面的字節碼有關! –

+0

@ user1988876:嗯......是的,你可以這樣說:)也許有了一羣成熟的開發者,它不會那麼糟糕。設計語言本身是很難的部分。 – blackcompe

+1

@ user1988876:爲字節代碼實現解釋器或JIT編譯器並不難,因爲您只需翻譯大約200條指令。但是使其實際工作意味着實現對象模型,內存管理,線程和同步,低級I/O部分等等。這會變成很多東西,消耗最初創建的字節碼部分容易的熱情。 – Holger