Java是如何實現平臺無關性(跨平臺)的?


相信對於不少Java開發來講,在剛剛接觸Java語言的時候,就據說過Java是一門跨平臺的語言,Java是平臺無關性的,這也是Java語言能夠迅速崛起並風光無限的一個重要緣由。那麼,到底什麼是平臺無關性?Java又是如何實現平臺無關性的呢?本文就來簡單介紹一下。

一,什麼是平臺無關性

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

也就是說,用Java建立的可執行二進制程序,可以不加改變的運行於多個平臺。java

平臺無關性好處後端

做爲一門平臺無關性語言,不管是在自身發展,仍是對開發者的友好度上都是很突出的。安全

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

對於Java開發者來講,Java減小了開發和部署到多個平臺的成本和時間。真正的作到一次編譯,處處運行。eclipse

二,平臺無關性的實現

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

編譯原理基礎工具

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

咱們在Java代碼的編譯與反編譯那些事兒中介紹過,在計算機世界中,計算機只認識0和1,因此,真正被計算機執行的實際上是由0和1組成的二進制文件。操作系統

可是,咱們平常開發使用的C、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字節。(這裏說的都是可能哦!)



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

三,小結

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

Java語言規範
經過規定Java語言中基本數據類型的取值範圍和行爲
Class文件
全部Java文件要編譯成統一的Class文件
Java虛擬機
經過Java虛擬機將Class文件轉成對應平臺的二進制文件等
Java的平臺無關性是創建在Java虛擬機的平臺有關性基礎之上的,是由於Java虛擬機屏蔽了底層操做系統和硬件的差別。

四,語言無關性

其實,Java的無關性不只僅體如今平臺無關性上面,向外擴展一下,Java平還具備語言無關性,更準確的說是Java虛擬機具備語言無關性。

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

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

相關文章
相關標籤/搜索