天道不一定酬所有勤
但是,天道只酬勤

天津11选5任选基本走势:Java是如何實現平臺無關性的

開發十年,就只剩下這套架構體系了??!

天津11选5蛋托玩法 www.ijudhr.com.cn 相信對于很多Java開發來說,在剛剛接觸Java語言的時候,就聽說過Java是一門跨平臺的語言,Java是平臺無關性的,這也是Java語言可以迅速崛起并風光無限的一個重要原因。那么,到底什么是平臺無關性?Java又是如何實現平臺無關性的呢?本文就來簡單介紹一下。

什么是平臺無關性

平臺無關性就是一種語言在計算機上的運行不受平臺的約束,一次編譯,到處執行(Write Once ,Run Anywhere)。

也就是說,用Java創建的可執行二進制程序,能夠不加改變的運行于多個平臺。

平臺無關性好處

作為一門平臺無關性語言,無論是在自身發展,還是對開發者的友好度上都是很突出的。

因為其平臺無關性,所以Java程序可以運行在各種各樣的設備上,尤其是一些嵌入式設備,如打印機、掃描儀、傳真機等。隨著5G時代的來臨,也會有更多的終端接入網絡,相信平臺無關性的Java也能做出一些貢獻。

對于Java開發者來說,Java減少了開發和部署到多個平臺的成本和時間。真正的做到一次編譯,到處運行。

平臺無關性的實現

對于Java的平臺無關性的支持,就像對安全性和網絡移動性的支持一樣,是分布在整個Java體系結構中的。其中扮演者重要的角色的有Java語言規范、Class文件、Java虛擬機(JVM)等。

編譯原理基礎

講到Java語言規范、Class文件、Java虛擬機就不得不提Java到底是是如何運行起來的。

我們在Java代碼的編譯與反編譯那些事兒中介紹過,在計算機世界中,計算機只認識0和1,所以,真正被計算機執行的其實是由0和1組成的二進制文件。

但是,我們日??⑹褂玫腃、C++、Java、Python等都屬于高級語言,而非二進制語言。所以,想要讓計算機認識我們寫出來的Java代碼,那就需要把他”翻譯”成由0和1組成的二進制文件。這個過程就叫做編譯。負責這一過程的處理的工具叫做編譯器。

深入分析Java的編譯原理中我們介紹過,在Java平臺中,想要把Java文件,編譯成二進制文件,需要經過兩步編譯,前端編譯和后端編譯:

?

前端編譯主要指與源語言有關但與目標機無關的部分。Java中,我們所熟知的javac的編譯就是前端編譯。除了這種以外,我們使用的很多IDE,如eclipse,idea等,都內置了前端編譯器。主要功能就是把.java代碼轉換成.class代碼。

這里提到的.class代碼,其實就是Class文件。

后端編譯主要是將中間代碼再翻譯成機器語言。Java中,這一步驟就是Java虛擬機來執行的。

?

所以,我們說的,Java的平臺無關性實現主要作用于以上階段。如下圖所示:

?

我們從后往前介紹一下這三位主演:Java虛擬機、Class文件、Java語言規范

Java虛擬機

所謂平臺無關性,就是說要能夠做到可以在多個平臺上都能無縫對接。但是,對于不通的平臺,硬件和操作系統肯定都是不一樣的。

對于不同的硬件和操作系統,最主要的區別就是指令不同。比如同樣執行a+b,A操作系統對應的二進制指令可能是10001000,而B操作系統對應的指令可能是11101110。那么,想要做到跨平臺,最重要的就是可以根據對應的硬件和操作系統生成對應的二進制指令。

而這一工作,主要由我們的Java虛擬機完成。雖然Java語言是平臺無關的,但是JVM確實平臺有關的,不同的操作系統上面要安裝對應的JVM。

?

上圖是Oracle官網下載JDK的指引,不同的操作系統需要下載對應的Java虛擬機。

有了Java虛擬機,想要執行a+b操作,A操作系統上面的虛擬機就會把指令翻譯成10001000,B操作系統上面的虛擬機就會把指令翻譯成11101110。

? ps:圖中的Class文件中內容為mock內容

所以,Java之所以可以做到跨平臺,是因為Java虛擬機充當了橋梁。他扮演了運行時Java程序與其下的硬件和操作系統之間的緩沖角色。

字節碼

各種不同的平臺的虛擬機都使用統一的程序存儲格式——字節碼(ByteCode)是構成平臺無關性的另一個基石。Java虛擬機只與由自己碼組成的Class文件進行交互。

我們說Java語言可以Write Once ,Run Anywhere。這里的Write其實指的就是生成Class文件的過程。

因為Java Class文件可以在任何平臺創建,也可以被任何平臺的Java虛擬機裝載并執行,所以才有了Java的平臺無關性。

Java語言規范

已經有了統一的Class文件,以及可以在不同平臺上將Class文件翻譯成對應的二進制文件的Java虛擬機,Java就可以徹底實現跨平臺了嗎?

其實并不是的,Java語言在跨平臺方面也是做了一些努力的,這些努力被定義在Java語言規范中。

比如,Java中基本數據類型的值域和行為都是由其自己定義的。而C/C++中,基本數據類型是由它的占位寬度決定的,占位寬度則是由所在平臺決定的。所以,在不同的平臺中,對于同一個C++程序的編譯結果會出現不同的行為。

舉一個簡單的例子,對于int類型,在Java中,int占4個字節,這是固定的。

但是在C++中卻不是固定的了。在16位計算機上,int類型的長度可能為兩字節;在32位計算機上,可能為4字節;當64位計算機流行起來后,int類型的長度可能會達到8字節。(這里說的都是可能哦?。?/p>

?

通過保證基本數據類型在所有平臺的一致性,Java語言為平臺無關性提供強了有力的支持。

小結

對于Java的平臺無關性的支持是分布在整個Java體系結構中的。其中扮演者重要的角色的有Java語言規范、Class文件、Java虛擬機等。

  • Java語言規范
    • 通過規定Java語言中基本數據類型的取值范圍和行為
  • Class文件
    • 所有Java文件要編譯成統一的Class文件
  • Java虛擬機
    • 通過Java虛擬機將Class文件轉成對應平臺的二進制文件等

Java的平臺無關性是建立在Java虛擬機的平臺有關性基礎之上的,是因為Java虛擬機屏蔽了底層操作系統和硬件的差異。

語言無關性

其實,Java的無關性不僅僅體現在平臺無關性上面,向外擴展一下,Java還具有語言無關性。

前面我們提到過。JVM其實并不是和Java文件進行交互的,而是和Class文件,也就是說,其實JVM運行的時候,并不依賴于Java語言。

時至今日,商業機構和開源機構已經在Java語言之外發展出一大批可以在JVM上運行的語言了,如Groovy、Scala、Jython等。之所以可以支持,就是因為這些語言也可以被編譯成字節碼(Class文錦?。?。而虛擬機并不關心字節碼是有哪種語言編譯而來的。詳見牛逼了,教你用九種語言在JVM上輸出HelloWorld

參考資料

《深入理解Java虛擬機(第二版)》 《深入Java虛擬機》 《Java語言規范——基于Java SE 8》 《Java虛擬機規范第8版》

(全文完) 歡迎關注『Java之道』微信公眾號
贊(5)
如未加特殊說明,此網站文章均為原創,轉載必須注明出處。天津11选5蛋托玩法 » Java是如何實現平臺無關性的
分享到: 更多 (0)

評論 搶沙發

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址

HollisChuang's Blog

聯系我關于我