Java | 爲什麼 Java 實現了平臺無關性?

前言

  • 從最初學習Java開始,我們就知道Java的口號是:“一次編寫,到處運行”。沒有了平臺的束縛,使得我們再編寫Java時並不需要(那麼)關心將來運行程序的平臺。
  • 那麼,Java是如何實現 平臺無關性的呢?今天我們來討論這個問題。
# 咬文嚼字 #

爲什麼是“不需要(那麼)關心”,而不是“不需要關心”?因爲在工程實踐中,不全面考量運行程序的系統 / 網絡 / 硬件 / 國家等因素是不可能的。

目錄

1. 運行環境 = 操作系統 + 硬件

首先,理解清楚什麼是平臺?平臺是指程序的運行平臺,或者稱爲運行環境,具體來說:運行環境 = 操作系統 + 硬件(主要是CPU)

1.1 操作系統屏蔽了除 CPU 外的硬件差異

操作系統(Operating System)是管理計算機硬件與軟件資源的程序。對於現代應用程序來說,它們是不會直接操作硬件的,而是採用向操作系統發送指令的方式來間接控制硬件,這些指令就是系統調用

系統調用是操作系統與應用程序之間的接口(Application Programming Interface,API)。然而不同操作系統提供的 API 是不同的,這樣的話,程序調用 API 的代碼也會因操作系統不同而不同,因此操作系統是運行環境的要素之一。

1.2 CPU 只能運行本地代碼

每種CPU只能“讀懂”自身支持的機器語言或者本地代碼(native code),而每種CPU使用的指令集不盡相同。因此,任何高級編程語言 / 彙編語言編寫的程序,最後都需要“翻譯”爲CPU能夠讀懂的本地代碼。

下面,我們對比C/C++ & Java兩種語言是使用什麼方式將源代碼轉換爲本地代碼的。


2. C/C++ 如何將源代碼轉換爲本地代碼

  • 步驟1:編譯生成目標文件(編譯時)
  • 步驟2:鏈接生成可執行文件(編譯時 or 運行時)

3. Java 如何將源代碼轉換爲本地代碼

  • 步驟1:編譯前端生成 Class文件(編譯時)
  • 步驟2:編譯後端解釋或編譯爲本地代碼(編譯時 or 運行時)

關於 Java 編譯過程 的更多介紹,請閱讀文章:《Java | 聊一聊編譯過程(編譯前端 & 編譯後端)》


4. Java 虛擬機的公有協議與私有實現

  • Java 虛擬機的協議 指的是《Java 虛擬機規範》,它規定了 Java 虛擬機的概念模型;
  • Java 虛擬機實現 是指各種平臺上具體的虛擬機實現,例如 Classic VMHotSpot VM

在這個概念模型下,不同的虛擬機實現有統一的輸入輸出模型:

所有虛擬機實現的輸入與輸出都是一致的:輸入爲Class 文件,處理過程是字節碼解釋執行的等效過程,最終輸出的是預期的執行結果。這樣的方式即保證了不同平臺不同實現的虛擬機行爲一致,也提高了伸縮性。不同平臺的虛擬機實現可以根據具體平臺特點,賦予虛擬機實現更多的特點:更高的性能 or 更低的內存消耗 。

關於 Class 文件 的更多介紹,請閱讀文章:《Java | 請概述一下 Class 文件的結構》


5. 總結

虛擬機與字節碼是Java實現無關性的基礎。首先,與不同於C/C++Java將程序存儲格式從本地代碼轉變爲字節碼;其次,不同平臺的虛擬機都統一採樣字節碼作爲輸入語言,並統一遵守《Java 虛擬機規範》,最終提供了一個不依賴於特定操作系統 & 硬件的運行環境,即平臺無關性。


參考資料

  • 《程序是怎樣跑起來的》 (第7、8章)—— 矢澤久雄
  • 《深入理解Java虛擬機(第3版本)》(第6、7、8章)—— 周志明
  • 《深入理解Android:Java虛擬機ART》(第2章) —— 鄧凡平

推薦閱讀

感謝喜歡!你的點贊是對我最大的鼓勵!歡迎關注彭旭銳的簡書!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章