JavaRush /Java Blog /Random-TW /機器碼和位元組代碼:您的程式使用什麼語言?

機器碼和位元組代碼:您的程式使用什麼語言?

在 Random-TW 群組發布
那些剛開始熟悉 Java 的人常常對機器碼字節碼的概念感到困惑。這些是什麼?有什麼區別?簡而言之,我們將嘗試盡可能簡單明了地描述它們的功能,以便一勞永逸地解決這個問題。
機器碼和位元組代碼:您的程式使用什麼語言? - 1

機器碼

處理器本質上是一個非常複雜和先進的計算器。它有許多記憶體位置(稱為暫存器),在這些位置上和之間執行各種數學和位元組運算。機器代碼正是操作序列和所涉及的資料集的描述。事實上,它是電腦處理器能夠理解的唯一語言。

先天性不合

此外,並非所有處理器都「講」同一種語言。不僅CISCRISC架構之間存在差異,而且這些「陣營」內部也存在差異。

CISC(複雜指令集運算)是一種處理器設計概念,具有以下一組特性:

  • 許多命令,長度不同;
  • 多種尋址方式;
  • 複雜的指令編碼。
RISC(精簡指令集計算) - 具有精簡指令集的處理器。指令格式相同、簡短、編碼簡單。
新一代處理器引入了老一代型號根本不知道的附加指令集。因此,為一種架構(或一代處理器)編譯的程式無法在其他硬體上運行。所有這些都迫使我們重新編譯程式以確保它們可以在其他電腦上運行。然而,您必須重新編譯不僅因為處理器,還因為程​​式和作業系統互動的差異。正是因為它們,才不可能在Linux下執行「Windows」程序,在Windows下執行「Linux」程序。

位元組碼

字節碼在許多方面與機器碼相似,只是它使用的一組指令不是來自真實處理器,而是來自虛擬處理器。此外,它可能包括專注於JIT 編譯器的使用的部分,該編譯器優化了運行程式的真實處理器的命令執行。
JIT編譯(Just-in-time Compilation,即時編譯)或動態編譯(動態翻譯)是一種透過將字節碼直接編譯為機器碼或其他格式來提高使用字節碼的軟體系統效能的技術。正在運行。在 Java 版本 9 之前,「正式」只有 JIT 編譯器。在Java 9中,出現了另一個編譯器,它是提前編譯(AoT)。此功能允許 Java 類別在虛擬機器上運行之前編譯為本機程式碼。此功能旨在縮短小型和大型應用程式的啟動時間,同時對峰值效能的影響有限。
對於CISC處理器,一些指令可以組合成處理器支援的更複雜的結構,而對於RISC,相反,它們可以被分解成更簡單的指令序列。

也是一個虛擬作業系統

然而,字節碼不僅包含處理器指令。它還包含與虛擬作業系統互動的邏輯,這使得應用程式的行為獨立於電腦上使用的作業系統。這在JVM中清晰可見,其中系統呼叫和GUI的工作通常獨立於程式運行的作業系統。總的來說,JVM模擬程式進程的啟動,這與Virtual Box等僅創建虛擬系統/硬體的解決方案不同。

JVM 是唯一這樣的嗎?

當然不是。同樣的DotNet CLI也是一個虛擬機,最常用來運行具有 x86 相容處理器的 Windows 的電腦。然而,有一個針對其他系統的實現:它的應用程式必須運行在運行於ARM (RISC)相容處理器上的Windows RT上,或者您可以在Mono環境中的Linux/OSX上運行它們,這是第三方的(因此不完全相容)這些平台的DotNet實作。所以這個平台就像JVM一樣,運作在不同的處理器和不同的作業系統上。還有許多類似的解決方案(新舊):LLVMFlash SWF等。有些程式語言有自己的虛擬機器。例如,CPython將PY 原始碼編譯為PYC檔- 已編譯的位元組程式碼,準備在PVM中執行。或者有一個更古老的例子 - Lisp可以編譯成FASL(快速載入)檔案。事實上,它們包含生成器根據原始程式碼建構的AST 樹。這些檔案可以由各種平台上的Lisp解釋器讀取和執行,或用於為目前使用的硬體架構產生機器碼。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION