天天看點

java跨平台

慣例:

我是溫浩然:

轉載文章,要在明顯位置标注轉載出處:http://xiaozhen1900.blog.163.com/blog/static/1741732572011325111945246/

1、是麼是平台

java是可以跨平台的程式設計語言,那我們首先得知道什麼是平台,我們把cpu處理器與作業系統的整體叫平台。

cpu大家都知道,如果計算機是人,那cpu就是人的大腦,它既負責思維運算,又負責身體各部件的指令控制。cpu的種類很多,除去我們熟知的intel與amd外,還有比如上面說到的sun的sparc,比如ibm的powerpc等等,這些各個公司生産的cpu使用或相同或不同的指令集。指令集就是cpu中用來計算和控制計算機系統的一套指令的集合。指令集又分為精簡指令集(risc)與複雜指令集(cisc),每種cpu都有其特定的指令集。開發程式,首先要知道該程式在什麼cpu上運作,也就是要知道cpu所使用的指令集。

下面說作業系統,作業系統是充當使用者和計算機之間互動的界面軟體,不同的作業系統支援不同的cpu,嚴格意義上說是不同的作業系統支援不同cpu的指令集。例如  windows和liunx都支援intel和amd的複雜指令集,但并不支援powerpc所使用的精簡指令集,而早期的mac電腦使用的是powerpc處理器,是以也就無法在mac下直接安裝windows,直到05年mac改用了intel的cpu,才使在mac下安裝windows成為可能。但問題來了,原來的mac 作業系統也隻支援powerpc,在intel上也不能安裝,怎麼辦?是以蘋果公司也得重寫自己的mac作業系統以支援這種變化。最後總結下,我們要知道,不同的作業系統支援不同的cpu指令集,現在的windows,liunx,mac,solaris都支援intel與amd的cpu指令集。

有了上面的鋪墊,旺旺老師就要告訴大家,如果您要開發程式,首先應該确定:1,cpu類型,也就是指令集類型;2,作業系統;我們把這種軟硬體的結合叫平台。也可以說“平台=

cpu+os”。又因為現在主流的作業系統都支援主流的cpu,是以有時也把作業系統稱為平台。

  知道什麼是平台,我們看java跨平台原理。

  2、java跨平台原理

首先看一張與c語言有關的圖: 

    

java跨平台

如果您有過c的開發經曆,這張圖看起來将非常輕松。我們知道,隻要是用标準c開發的程式,使用不同的編譯器編譯後的可執行檔案是可以在對應平台運作的,比如windows可以使用vc編譯,那編譯後的exe檔案就可以在windows下運作;liunx下可以使用gcc編譯,生成的可執行檔案就可以在liunx上運作。

到這裡請大家思考一個問題:“vc編譯的exe能在liunx上運作嗎?”

答案肯定是否定的。使用特定編譯器編譯的程式隻能在對應的平台運作,這裡也可以說編譯器是與平台相關的,編譯後的檔案也是與平台相關的。我們說的語言跨平台是編譯後的檔案跨平台,而不是源程式跨平台,如果是源程式,任何一門語言都是跨平台的語言了。這個如果您不明白,看下面一個案例:

比 如火星真的有外星人(并且毋庸置疑,火星是南韓人的,火星文也一定是南韓人發明的),就像我們觀察螞蟻一樣,火星人默默的觀察着我們,有一天,當人類做的 什麼事情讓火星人實在是看不下去了(比如旺旺老師的書出版了你不買,哈哈,嘔吐中,沒關系,吐啊吐啊就吐習慣了),是以決定來地球教育我們,但有一個問

題,火星人隻會說火星文,地球人了解不了,怎麼辦啊?找翻譯呗(也許非主流可以幫忙,玩笑)!由中文翻譯把火星文翻譯為中文,英文翻譯把火星文翻譯為英文 等等等等,但這樣問題來了,中文翻譯翻譯的東西隻有中國人能聽懂,美國人法國人根本不明白,英文翻譯翻譯的文章中國人也不明白,也就是語言不能跨平台。

那上例中,火星文就是c語言,各個國家是平台,中文翻譯英文翻譯就是對應平台的編譯器,編譯後的文章就是可執行檔案。雖然源文章火星文是與平台無關的,但翻譯器是與特定國家相關的,翻譯後的文章也是與特定國家相關的。

接下來思考另一個問題“怎麼讓火星文跨平台呢?”

火星人想到了地球上有世界語,于是首先把自己的文章翻譯為世界語;世界語各國人當然看不懂,沒關系,火星人又給每個國家配備了一個世界語到本地語的翻譯,這 樣火星文隻要翻譯一次(翻譯為世界語),就可以到各個國家運作了。還要記住,這個過程火星人要提供兩個元件,第一是火星文到世界語的翻譯,第二是世界語到

對應本地語言的翻譯。如下圖:

java跨平台

有了上面案例的積累,我們也知道了語言跨平台原理:“不能編譯成機器語言,因為那樣就與平台相關了,編譯為中間語言,再由解釋器二次編譯,解釋執行。”如下是java跨平台原理表示圖:

java跨平台

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

接下來我們再比較下兩種方式的差異:第一,c語言是編譯執行的,編譯器與平台相關,編譯生成的可執行檔案與平台相關;第二,java是解釋執行的,編譯為中間碼的編譯器與平台無關,編譯生成的中間碼也與平台無關(一次編譯,到處運作),中間碼再由解釋器解釋執行,解釋器是與平台相關的,也就是不同的平台需要不同的解釋器.

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

   

  java先編譯後解釋

  同一個.class檔案在不同的虛拟機會得到不同的機器指令(windows和linux的機器指令不同),但是最終執行的結果卻是相同的