在接觸Java的時候,常常能聽到Java的特色之一就是:「一次編譯,處處運行(Write Once, Run Anywhere)」。這種特色對於Java來講,有什麼好處呢?Java又是怎麼支持這一特性呢?本文簡單對這個特色簡單介紹一下。html
(若文章有不正之處,或難以理解的地方,請多多諒解,歡迎指正)java
平臺無關性,就是在一種語言在計算機運行時,不受其平臺的約束。c++
換句話說,源碼不作任何修改就能夠在多個平臺上運行。編程
平臺無關性對於一個語言的發展來講,意味着它能夠運行在電腦、打印機等多種設備,這也決定了這個語言流行的廣度。網絡
並且平臺無關性爲開發者減小了開發和部署到多種平臺的精力和時間成本,開發者爲了程序在多種平臺運行時儘量達到高效,須要深刻了解語言的特性,進一步推動語言優化,從必定程度上也推動了語言發展的深度。編程語言
編程語言分爲低級語言和高級語言,機器語言和彙編語言屬於低級語言,能夠直接用計算機指令編寫程序;而C、C++等屬於高級語言,用語句編寫程序,是不能直接被計算機識別並執行的。真正被計算機執行的是由0和1組成的二進制文件。工具
因此,想讓計算機識別咱們編寫的高級語言程序,須要將程序翻譯成0和1組成的二進制文件。這個翻譯的過程稱爲「編譯」,執行這個過程的工具稱爲「編譯器」。優化
在介紹支持平臺無關性的要求以前,咱們先來看一個例子。spa
C語言是編譯型語言,沒有平臺無關的特性。編譯型語言的代碼在某平臺編譯後的文件,能夠直接在該平臺下運行。咱們先簡單瞭解一下C語言的編譯過程:① 預處理;②編譯;③彙編;④連接操作系統
C語言在編譯過程當中,其與平臺有關的部分在第二步編譯過程,這裏的編譯是指通過預處理以後的程序轉換成特定彙編代碼,而編譯後生成的彙編代碼會因不一樣的CPU和環境而有所不一樣。
若是在轉換成二進制文件前的彙編代碼都不能適用於任何平臺,何談平臺無關性呢?此外,平臺不一樣,C語言的基本數據類型的值域佔位寬度也會不一樣(如int類型,在16位操做系統中佔2個字節,在32位操做中佔4個字節,在64位操做系統中佔8個字節)。
因此,我的總結,語言實現平臺無關性有如下要求:
鋪墊了那麼多,接下來進入正題啦。
從上文咱們能夠知道,要實現平臺無關性得作到幾件事:
這裏先祭上Java編譯過程示意圖:
接下來,咱們來看看Java實現平臺無關性的三大主力軍。
不一樣的平臺下的硬件和操做系統確定也不同,並且光是不一樣的硬件和操做系統的指令就已經不大相同了。因此要想作到平臺無關,最重要的是要作到能夠根據相應的硬件和操做系統,生成對應的二進制文件。
這一任務,由Java虛擬機完成,不一樣的操做系統上須要安裝對應的Java虛擬機。
雖然說Java語言是平臺無關性的,但JVM的確是平臺有關的,在此的平臺無關性是相對的(對於開發者來講,算是平臺無關)
Java能作到跨平臺,Java虛擬機功不可沒,由於Java虛擬機是Java文件及其編譯文件與硬件和操做系統之間的橋樑。
JVM不會直接執行Java文件,實際上,JVM不只被Java語言所使用,還有如Scala、Jython等語言的編譯過程也使用JVM。也就是說JVM運行的時候並不依賴於Java語言,能在JVM上運行的文件是Class文件。
各類運行在不一樣平臺上的虛擬機都統一使用字節碼(Byte Code)組成的Class文件進行交互,而Class文件是由javac處理Java文件後獲得的。
Class文件能夠在任何平臺上被建立,也能夠被任何平臺上的JVM裝載運行。它的格式有着嚴格的定義,因此Class文件是構成平臺無關性的基石之一。
Java編程語言也在用它本身的方式支持這Java平臺無關性事業的發展:它的基礎數據類型的值域和行爲是由語言本身定義的,不像C語言的是由平臺決定。舉個栗子,Java語言中,int類型不管是在16位操做系統、32位操做系統和64位操做系統下,都是佔4個字節。
總結一下,Java經過規定Java語言中基本數據類型的取值範圍和行爲,統一Java文件編譯成Class文件,而且最後由Java虛擬機將Class文件轉換成對應平臺的二進制文件,才實現了平臺無關性。
在總結平臺無關性的時候特意標註「我的總結」,是由於這裏的總結是爲下文介紹Java實現平臺無關性服務的。若是須要更加深刻了解平臺無關性,能夠參考一下如下資料。
參考資料: