簡體   English   中英

虛擬機如何執行指令?

[英]How does a virtual machine execute instructions?

我有很強的C ++背景知識,但從未真正了解Java或C#。 但是,我對虛擬機的內部運作感到好奇。 我已經嘗試了一些Windows exe文件,並發現實際的虛擬機是jvm和clr動態庫。

現在,這讓我感到困擾: 這些庫如何與exe文件中的指令進行交互?

我唯一的猜測是字節碼實際上存儲在exe文件的.data段中。 它實際上將控制權傳遞給了.dll,后者翻譯了字節碼指令。 那是對的嗎?

我找不到關於該主題的任何內容,因此將不勝感激。

好吧,從最基本的層面上講,您是正確的:有一個本機應用程序(運行時,例如java.exe )讀取字節碼並通過解釋其中包含的指令來“運行”它。

您必須對該圖片進行的第一個調整是,出於性能原因,大多數VM現在使用JIT編譯,這意味着字節碼不會被解釋,而是會即時編譯為本地代碼。

我唯一的猜測是字節碼實際上存儲在exe文件的.data段中。

要看。 對於Java,通常只有一個帶有字節碼的JAR文件,與啟動的本機二進制文件分開。 但是,是的,您可以將它們組合成一個可執行文件,然后將包含本機啟動器代碼(但可能不是所有依賴的啟動庫)以及字節碼“作為數據”。

例如,Eclipse在JVM上運行對嗎? 仍然可以通過exe啟動它。

是。 Eclipse具有這些“啟動包裝程序exe”之一。 但是,如果您看一下,它很小。 它所做的全部工作就是顯示一個初始屏幕並啟動JVM(安裝在您的系統上,而不是exe的一部分),並向其拋出一些JAR文件(作為Eclipse的一部分安裝,但也不在exe內)。

您對IL的存儲位置的猜測在這里解決:

http://en.wikipedia.org/wiki/Portable_Executable#.NET.2C_metadata.2C_and_the_PE_format

您的猜想對於C#基本是正確的。 該可執行文件將啟動CLR並移交元數據和IL。 然后CLR找出“ Main”在哪里,為此獲取IL,然后將其jit編譯為x86(或任何其他形式)代碼,然后運行該代碼。 每個方法在首次運行之前都會“及時”編譯,因此稱為“ Jit編譯器”。

當然,這是一個大大簡化的概述。 如果您想了解有關.NET工作原理的更多信息,請從以下開始:

http://msdn.microsoft.com/en-us/library/a4t23ktk.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM