深入理解Java虛擬機讀書筆記之:第2章 平臺無關

爲什麼要平臺無關
    Java技術在網絡環境下非常有用,其中一個關鍵的理由就是,用Java創建的可執行二進制程序,能夠不加改變地運行於多個平臺。這一點在網絡化環境中尤爲重要,因爲大多數網絡通常都是由各種各樣不同種類的計算機和設備互聯而成。
    此外,新興的網絡化嵌入式設備則展示了Java又一擅長的領域,因爲它的平臺無關性在這種環境下非常有用。在這個嵌入式的世界,Java的平臺無關性也有助於簡化系統管理任務。
    從開發者的觀點看,Java能夠減少開發和在多個平臺上部署應用程序的成本和時間。
 
Java的體系結構對平臺無關的支持
    對平臺無關性的支持,像對安全性和網絡移動性的支持一樣,是分佈在整個Java體系結構中的,所有的組成部分——語言、class文件、API以及虛擬機,都在對平臺無關性的支持方面扮演着重要角色。
 
1)Java平臺
    Java平臺扮演一個運行時Java程序與其下的硬件和操作系統之間的緩衝角色 。
    無論Java程序被部署到何處,它只需要與Java平臺交互,而不需要擔心底層的硬件和操作系統。因此,它就能夠運行於任何擁有Java平臺的計算機。
2)Java語言
    Java編程語言主要通過以下方式支持Java的平臺無關性:它的基本數據類型的值域和行爲都是由語言自己定義的。在像C或者C++這樣的語言中,基本整數類型int的值域是由它的佔位寬度決定的,而它的佔位寬度則由目標平臺決定。
    通過確保基本數據類型在所有平臺上的一致性,Java語言本身爲Java程序的平臺無關性提供了強有力的支持。
3)Java class文件
    前一章曾提到,class文件定義了一個特定於Java虛擬機的二進制格式。Java class文件可以在任何平臺上創建,也可以被任何平臺的Java虛擬機裝入並運行。它的格式,包括多字節值的高位優先存放的約定,都有嚴格的定義,並且是與Java虛擬機所在平臺無關的。
4)可伸縮性
    Java支持平臺無關性,一個方面就是它的可伸縮性。Java平臺可以在各種各樣不同類型的(從嵌入式設備到大型主機)計算機上實現。
    儘管Java目前在Web領域和桌面領域都聲名卓著,但它最初卻是被期望用於嵌入式設備和消費電器領域的,而不是桌面計算機。
 
    Java三個基礎API集合,它們表現Java平臺不同的伸縮性:
    企業版(J2EE)
    標準版(J2SE)
    微型版(J2ME)
    在高端,企業版的存在表明了Java平臺在高端服務的可用性。在中端,標準版提供了在瀏覽器中啓動傳統applet的功能和桌面環境下的Java平臺。在低端,微型版通過不同的行業子集,顯示了Java平臺可以向下伸縮,並改變自己以適應完全不同的消費性電器市場和嵌入式系統需求的能力。
 
影響平臺無關性的因素
    Java程序的平臺無關程度依賴於多種因素,其中有些因素不在開發人員的控制範圍之內,但是大多數是由開發人員來控制的。從根本上說,任何Java程序的平臺無關程度都依賴於作者怎樣編寫它。
 
1)Java平臺的部署
    決定Java程序其平臺無關性的最主要因素就是Java平臺在不同的平臺上被部署的程度。只有在擁有Java平臺的計算機或設備上,才能運行Java程序。決定Java程序平臺無關性真正程度的一個重要因素——這個因素一般不是由開發人員控制的——就是已有了可用的Java平臺實現和發佈版本。
2)Java平臺的版本
    Java平臺的部署有一些複雜,因爲並非所有的標準運行時庫在每個Java平臺上都可以用的。Java平臺中保證可用的基本庫集合被稱爲標準API。Sun把Java虛擬機1.2版以及組成標準API的那些class文件稱爲Java 2平臺標準版。這個版本的Java平臺是Java API庫的最小集合,例如可以在桌上型電腦和工作站上使用。
    另外,Sun定義了一些標準運行時庫,它把這些庫作爲標準版的可選項,把它們稱爲標準擴展API。
    在理論上,只要程序僅僅依賴於標準API的運行時庫,那麼程序就應該可以在有Java 2平臺標準版的所有計算機上運行。但在實際上,標準API的新版本要過一段時間才能在任何地方都適用。當程序依賴於標準API最新版本的一些新特性時,有些主機可能不能運行這個程序 ,因爲它們只有比較老的版本。
    作爲一個開發人員,你不可能控制Java平臺版本的發佈週期或者部署進度表,但是你可以選擇自己的程序所依賴的Java平臺版本。
3)本地方法
    除了程序所依賴的Java平臺的版本之外,決定Java程序的平臺無關程度的另一個主要因素就是你是否調用了本地方法。當編寫一個平臺獨立的Java程序時,必須遵守的一條最重要的原則就是:不要直接或間接調用不屬於Java API的本地方法。


 
4)非標準運行時庫
    如果開發者側重於平臺無關性,那麼就必須清楚地知道所使用的那些非標準運行時庫是否調用了本地方法。沒有調用本地方法的非標準庫不會降低程序的平臺無關性。然而如果使用了調用本地方法的運行時庫中,那麼就會產生和直接調用本地方法一樣的結果——使得程序和平臺相關了。
5)對虛擬機的依賴
    在編寫平臺獨立的Java程序時,還必須遵從兩條原則,這兩條原則和Java虛擬機中的某些部分有關,Java虛擬機中的某些部分可以由不同的開發商用不同的方法實現。這兩條原則是:
    a)不要依賴及時終結(finalization)來達到程序的正確性。(finalize())
    b)不要依賴線程的優先級(thread prioritization)來達到程序的正確性。
    這兩條原則可以防止Java虛擬機規範中允許的垃圾收集和線程在不同實現中的變化所帶來的不利影響 。
    爲了保證多線程Java程序的平臺獨立,必須依賴同步(synchronization)而不是優先級來在線程之間協調相互間的動作。
6)對用戶界面的依賴
7)Java平臺實現中的bug
8)測試
    Java程序的平臺無關性並沒有達到只需在一個平臺上測試它們即可的程序。
    在實際情況中,在程序要運行的不同主機和不同Java平臺實現上測試你的Java程序 ,是程序平臺無關性的一個關鍵因素。
 
(轉載請註明來源:http://zhanjia.iteye.com/blog/1841934)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章