版權聲明:本文為部落客原創文章,轉載注明出處http://blog.csdn.net/u013142781
這樣的平台無關性随之帶來許多的好處。這将極大地減輕系統管理者的工作;此外java的平台無關性在嵌入式裝置環境下也非常有用;從開發者的觀點看,java能夠減少開發和在多個平台上部署應用程式的成本和時間。
java的平台無關性自然不言而喻。對于我們開發者來說,可能對下面的java是如何實作支援平台無關的方法或原理更加感興趣。
java對平台無關性的支援,就像對安全性和網絡移動性的支援一樣,是分布在整個java體系結構中的,所有的組成部分——語言、class檔案、api以及虛拟機,都在對平台無關性的支援扮演着重要角色。
2.1、java平台
java平台扮演一個運作時java程式與其下的硬體和作業系統之間的緩沖角色。java程式被編譯為可運作于java虛拟機中的二進制程式,并且假定java api的class檔案在運作時是可用的。接着虛拟機運作程式,那些api則給予程式通路底層計算機資源的能力。無論java程式被部署到何處,它隻需要與java平台互動,而不需要擔心底層的硬體和作業系統。
2.2、java語言
java程式設計語言主要通過以下方式支援java的平台無關性:它的基本資料類型的值域和行為都是由語言自己定義的。
在像c/c++這樣的語言中,基本資料類型int的值域是由它的占位寬度決定的,而它的占位寬度則由平台決定的。而java程式,不管其運作的平台是什麼,java中的int都是32位二進制不罵表示的有符号整數,而float則總是遵循ieee754浮點标準的32位浮點數。同樣,這一點在java虛拟機内部以及class檔案中都是一緻的。通過確定基本資料類型在所有平台上的一緻性,java語言本身為java程式的無平台性提供了強有力的支援。
2.3、java class檔案
java class檔案可以在任何平台上建立,也可以被任何平台的java虛拟機裝入并運作。它的格式,包括多位元組值的高位優先存放約定,都有嚴格定義,并且是與java虛拟機所在平台無關。
2.4、可伸縮性
java支援平台無關,一個方面就是它的可伸縮性。java平台可以在各種各樣不同類型(從嵌入式裝置到大型主機)的計算機上實作。
sun改變過的api定義方式得到了三個基本api集合,它們表現java平台的不同的伸縮性:
(1)企業版(j2ee),java網路程式設計 主要用來寫一些動态網站
當編寫java程式時,平台無關性隻是一個可選的性能。java程式的平台無關程度依賴于多種因素,其中有些因素不在開發人員的控制範圍内,但大多數是由開發人員控制的。從根本上說,任何java程式的平也台無關程度都依賴于作者怎麼編寫它。
平也台無關程度影響因素有如下幾點:
3.1、java平台的部署
隻有擁有java平台的計算機或裝置才能運作java程式。裝置運作java程式前,需要做兩件事,首先必須将java平台移植到對應裝置上,此外,實作接口還必須安裝到對應裝置上。
3.2、java平台的版本
并非所有的标準運作時庫在每個java平台上都是可用的。作為一名開發人員,你不可能控制java版本的釋出周期或者部署進度,但是你可以選擇自己的程式所依賴的java平台。
3.3、本地方法
決定java程式的平台無關程度的另一個主要因素就是你是否調用了本地方法。編寫java程式時,必須遵守的一條最重要的原則就是:不要直接或間接調用不屬于java api的本地方法。如果必須使用本地方法,而且要使程式可以在多種平台上運作,必須将本地方法移植到所有需要的平台上。
3.4、非标準運作庫
java平台可以由許多開發商來實作,雖然每個開發商必須提供java api的标準運作時庫,但是個别開發商還可能提供了另外的庫。如果開發者側重于平台無關性,那麼就必須清楚地知道所使用的那些非标準運作時庫是否調用了本地方法。如沒有調用本地方法的非标準庫不會降低程式的平台無關性。否則,會事程式和平台相關了。
3.5、對虛拟機的依賴
在編寫平台獨立的java程式時,還必須遵從兩條原則,這兩條原則和java虛拟機中的某些部分有關,java虛拟機中的某些部分可以由不同的開發商用不同的方法實作。這兩條原則是:
1)不要依賴及時終結(finalization)來達到程式的正确性;
2)不要依賴線程的優先級(thread prioritization)來達到程式的正确性。
這兩條原則可以防止java虛拟機規範中運作的垃圾收集和線程在不同的實作中的變化帶來的不利影響。
所有的java虛拟機都必須有垃圾收集堆,但是不同的實作可能使用不同的垃圾收集技術。在java虛拟機規範中的這個靈活性意味着,在不同的虛拟機中,一個特定的java程式中的對象可能在不同的時間被垃圾收集。這也意味着那些在對象被釋放前由垃圾收集器運作的終結方法(finalizer),在不同的虛拟機這可能是不同的時間運作的。如果使用了一個終結方法來釋放有限的記憶體資源,例如檔案句柄,程式就可能可以在一些虛拟機的實作上運作,而在其它實作上卻不能。在一些實作上,程式可能在垃圾收集器得到機會調用釋放資源的終結方法之前,就已經将有限的資源耗盡了。
在不同的java虛拟機的實作中,另一個變化和線程的優先級有關。java虛拟機規範隻保證了,程式中所有擁有最高優先級的可運作線程将會得到一些cpu時間。這個規範也保證了在較高優先級的線程被阻塞時,較低優先級的線程将會運作。但是,在較高優先級的線程沒有被阻塞的情況下,并沒有禁止較低優先級的線程的運作。在某些虛拟機的實作中,即使較高優先級的線程并未被阻塞,那些較低優先級的線程也可能先得到cpu時間。如果你的程式依賴于這個行為的正确性,它将在某些虛拟機的實作上可以正常運作,而在某些實作上卻不能。為了保證多線程java程式的平台獨立,必須依賴同步(sychronization)而不是優先級來線上程之間協調互相間的動作。
3.6、對使用者界面的依賴
在不同的java平台的實作之間 ,另一個主要的變化就是使用者的接口:在編寫平台獨立的java程式時,使用者界面是一個更為困難的問題。使用者必須利用這些基礎類庫建立一個接口,使許多不同平台上的使用者使用起來比較舒适,這往往不是一項簡單的工作。
雖然awt和swing庫使得建立運作在不同平台上的使用者界面變得比較容易,但是它們并不一定使界面設計變得友善、界面必須使不同平台上的使用者使用起來感覺到愉快。
3.7、java平台實作中的bug
java平台的不同實作之間還有一個變化就是bug,雖然sun已經開發了一套全面的測試标準,java平台實作必須通過這套标準測試。但是可能某些實作在釋出的時候仍然包含bug。你隻能通過測試來防止這種可能性。如果确實影響,那麼就必須試圖找到一個繞開的途徑。
3.8、測試
因為java平台的實作之間可能存在差異,依賴某些特定平台寫的java程式,已經在任何特定平台的實作中可能存在的bug。是以應該盡可能在所有希望運作的平台上對java程式進行測試。在實際情況中,在程式要運作的不同主機和不同java平台實作上測試你的java程式,是程式平台無關性的一個關鍵因素。
除了上面的内容外,《深入java虛拟機 第二版》中,關于平台無關内容還有:平台無關的七個步驟、平台無關性的政策、平台無關性和網絡移動對象
對于部落客目前而言,了解java如何實作平台無關的支援和影響平台無關性的因素的内容就足夠了。如果需要猿友們可以下載下傳《深入java虛拟機 第二版》自行學習了解。
參考書籍:《深入java虛拟機 第二版》