三、跨平臺性說明

一、舉例說明

我們知道,只要是用標準C開發的程序,使用不同的編譯器編譯後的可執行文件是可以在對應平臺運行的,比如windows可以使用VC編譯,那編譯後的exe文件就可以在windows下運行;liunx下可以使用GCC編譯,生成的可執行文件就可以在Liunx上運行。

到這裏請大家思考一個問題:“VC編譯的exe能在Liunx上運行嗎?” 
答案肯定是否定的。使用特定編譯器編譯的程序只能在對應的平臺運行,這裏也可以說編譯器是與平臺相關的,編譯後的文件也是與平臺相關的。我們說的語言跨平臺是編譯後的文件跨平臺,而不是源程序跨平臺,如果是源程序,任何一門語言都是跨平臺的語言了。這個如果您不明白,看下面一個案例: 
比如火星真的有外星人,就像我們觀察螞蟻一樣,火星人默默的觀察着我們,有一天,當人類做的什麼事情讓火星人實在是看不下去了,所以決定來地球教育我們,但有一個問題,火星人只會說火星文,地球人理解不了,怎麼辦啊?找翻譯唄!由中文翻譯把火星文翻譯爲中文,英文翻譯把火星文翻譯爲英文等等等等,但這樣問題來了,中文翻譯翻譯的東西只有中國人能聽懂,美國人法國人根本不明白,英文翻譯翻譯的文章中國人也不明白,也就是語言不能跨平臺。

那上例中,火星文就是C語言,各個國家是平臺,中文翻譯英文翻譯就是對應平臺的編譯器,編譯後的文章就是可執行文件。雖然源文章火星文是與平臺無關的,但翻譯器是與特定國家相關的,翻譯後的文章也是與特定國家相關的。 
接下來思考另一個問題“怎麼讓火星文跨平臺呢?” 
火星人想到了地球上有世界語,於是首先把自己的文章翻譯爲世界語;世界語各國人當然看不懂,沒關係,火星人又給每個國家配備了一個世界語到本地語的翻譯,這樣火星文只要翻譯一次(翻譯爲世界語),就可以到各個國家運行了。還要記住,這個過程火星人要提供兩個組件,第一是火星文到世界語的翻譯,第二是世界語到對應本地語言的翻譯。如下圖: 
有了上面案例的積累,我們也知道了語言跨平臺原理:“不能編譯成機器語言,因爲那樣就與平臺相關了,編譯爲中間語言,再由解釋器二次編譯,解釋執行。

類似於c語言的.c,java生成的中間碼是.class,這個既是我們上文中說的中間語,各個平臺解釋器就是各種國家翻譯。

接下來我們再比較下兩種方式的差異:第一,C語言是編譯執行的,編譯器與平臺相關,編譯生成的可執行文件與平臺相關;第二,Java是解釋執行的,編譯爲中間碼的編譯器與平臺無關,編譯生成的中間碼也與平臺無關(一次編譯,到處運行),中間碼再由解釋器解釋執行,解釋器是與平臺相關的,也就是不同的平臺需要不同的解釋器。

這裏再說下語言根據執行方式的不同分類:第一是編譯執行,如上文中說到的C,它把源程序由特定平臺的編譯器一次性編譯爲平臺相關的機器碼,它的優點是執行速度快,缺點是無法跨平臺;第二是解釋執行,如HTML,JavaScript,它使用特定的解釋器,把代碼一行行解釋爲機器碼,類似於同聲翻譯,它的優點是可以跨平臺,缺點是執行速度慢,暴露源程序;第三種是從Java開始引入的“中間碼+虛擬機”的方式,它既整合了編譯語言與解釋語言的優點,同時如虛擬機又可以解決如垃圾回收,安全性檢查等這些傳統語言頭疼的問題,所以其後微軟的.NET平臺也使用的這種方式。

最後再請大家思考一個問題:“開發Java程序需要什麼?運行Java程序需要什麼?”

答案:開發Java需要由源文件到中間文件的解釋器;運行Java需要對應平臺的解釋器。與火星人要提供兩個組件一樣,SUN也得提供兩個組件:第一,把源程序翻譯爲中間碼的編譯器;第二,相應平臺的解釋器。SUN把這兩個組件包含在一個工具包中,我們把它叫做JDK(Java Developent ToolKit)。
原文鏈接:https://blog.csdn.net/weixin_39877284/article/details/81516647

二、跨平臺的優勢

java的跨平臺,是指java運行時候凌駕於os之上,是在jvm中運行的,跟os沒有直接聯繫。(os:Operating System:操作系統)
如果有機會寫數據導入導出,和服務器之間交互的應用,就會知道“跨平臺”有什麼意義了。 (難道意義是把要交互的信息轉成統一格式?不懂爲什麼這麼類比)
在java之前,跨平臺是很痛苦的事情,主要是因爲所有對於系統的調用,在不同的操作系統下結果都不一樣,簡單的來說,int的長度在不同操作系統裏面就不一樣,甚至於連字節排列的順序都不同。調用同一個函數返回的格式也不同,因此,寫程序的人自己要對不同的系統非常瞭解,如果真的需要對不同操作系統進行兼容,要在程序裏面寫很多if,編譯的時候要先判斷使用的操作系統,創造很多環境變量才能編譯,而且編譯好的二進制可執行文件只能在本系統上運行。如果你寫的是個功能庫供別人調用的,那麼光對操作系統的判斷就佔了代碼的絕大部分,而且,還要你在不同平臺下進行測試,這可是個艱苦卓絕的工作。建議你有空可以看看apache httpd服務器的源代碼就知道了。 
自從有了java之後,就把操作系統兼容的工作丟給了jvm了,對於程序員來說就再也不要關心int有幾位,還有高位在前還是地位在前的問題了,你只要用java的代碼把你程序的邏輯實現出來就可以了,這些兼容的問題就交給jvm去處理吧。這樣,如果你寫一個程序交付給客戶使用,如果客戶的環境是運行AIX的,你就不需要在本地也裝一個AIX來開發和運行,你可以在windows上完成所有的開發,然後把編譯好的文件交給客戶就可以了,以後有別的客戶需要在Solaris上運行這個程序,你都不用修改,直接拿過去就可以運行,這難道不是一種方便嗎?只有被跨平臺開發折磨過的人才能更深得體會到用java開發跨平臺應用的優勢。

三、Java語言的跨平臺性是如何實現的?

Java屬於高級語言中的編譯語言(其實是兩種高級編程語言:編譯語言與解釋型語言的結合),編譯語言運行的大致過程爲:

源代碼文件是人工編寫的文件,如.cpp、.java等由相應語言代碼組成的源文件;

源文件不能直接被計算機執行,需要相應的編譯器,將源代碼進行翻譯(編譯),得到的是彙編語言組成的彙編程序(不同cpu、操作系統平臺編譯出的彙編代碼不同)

不同的彙編程序經過彙編器的彙編,得到的是計算機可以運行的二進制文件,程序就可以執行了(如果需要生成可執行文件,如exe等,需要經過鏈接器將文件再次“打包”)

通常所說的編譯語言的不可跨平臺問題一般指,不同平臺需要的編譯器不同(對源代碼的編譯過程不同)、編譯出的彙編文件不同(後續也不同),當在平臺A中的代碼在平臺B上編譯運行時,會出現部分偏差甚至錯誤。

Java文件運行大致過程

Java文件在運行時,會將源文通過javac命令編譯爲字節碼文件,這個文件是跨平臺的,java虛擬機(jvm,在java運行環境/jre中)也對應的只接收處理class文件,java虛擬機是一個通用的執行平臺(但有不同版本),不同java平臺編寫文件通過java虛擬機轉換的文件最後功能相同,因而實現在任意平臺的java程序都可以在其他平臺運行。
原文鏈接:https://blog.csdn.net/nominior/article/details/82686966

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