「Java 路線」| 為什么 Java 實現(xiàn)了平臺無關(guān)性?

點贊關(guān)注,不再迷路,你的支持對我意義重大!

?? Hi,我是丑丑。本文 「Java 路線」| 導讀 —— 他山之石,可以攻玉 已收錄,這里有 Android 進階成長路線筆記 & 博客,歡迎跟著彭丑丑一起成長。(聯(lián)系方式在 GitHub)

前言

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

為什么是“不需要(那么)關(guān)心”,而不是“不需要關(guān)心”?因為在工程實踐中,不全面考量運行程序的系統(tǒng) / 網(wǎng)絡(luò) / 硬件 / 國家等因素是不可能的。

目錄

1. 運行環(huán)境 = 操作系統(tǒng) + 硬件

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

1.1 操作系統(tǒng)屏蔽了除 CPU 外的硬件差異

操作系統(tǒng)(Operating System)是管理計算機硬件與軟件資源的程序。對于現(xiàn)代應(yīng)用程序來說,它們是不會直接操作硬件的,而是采用向操作系統(tǒng)發(fā)送指令的方式來間接控制硬件,這些指令就是系統(tǒng)調(diào)用。

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

應(yīng)用通過系統(tǒng)調(diào)用間接控制硬件

1.2 CPU 只能運行本地代碼

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

本地代碼是 CPU 唯一的語言

下面,我們對比C/C++ & Java兩種語言是使用什么方式將源代碼轉(zhuǎn)換為本地代碼的。


2. C/C++ 如何將源代碼轉(zhuǎn)換為本地代碼

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

3. Java 如何將源代碼轉(zhuǎn)換為本地代碼

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

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


4. Java 虛擬機的公有協(xié)議與私有實現(xiàn)

  • Java 虛擬機的協(xié)議 指的是《Java 虛擬機規(guī)范》,它規(guī)定了 Java 虛擬機的概念模型;
  • Java 虛擬機實現(xiàn) 是指各種平臺上具體的虛擬機實現(xiàn),例如 Classic VMHotSpot VM;

在這個概念模型下,不同的虛擬機實現(xiàn)有統(tǒng)一的輸入輸出模型:

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

關(guān)于 Class 文件 的更多介紹,請閱讀文章:《Java | 請概述一下 Class 文件的結(jié)構(gòu)》


5. 總結(jié)

虛擬機與字節(jié)碼是Java實現(xiàn)無關(guān)性的基礎(chǔ)。首先,與不同于C/C++,Java將程序存儲格式從本地代碼轉(zhuǎn)變?yōu)樽止?jié)碼;其次,不同平臺的虛擬機都統(tǒng)一采樣字節(jié)碼作為輸入語言,并統(tǒng)一遵守《Java 虛擬機規(guī)范》,最終提供了一個不依賴于特定操作系統(tǒng) & 硬件的運行環(huán)境,即平臺無關(guān)性。

虛擬機提供了統(tǒng)一的運行環(huán)境

參考資料

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

創(chuàng)作不易,你的「三連」是丑丑最大的動力,我們下次見!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容