重拾Java(三)

06-9-16:
Java虛擬機:
就是講Java既是編譯型的也是解釋型的語言.Java的運行時解釋器用來執行編譯過了的Java字節碼.這個運行時系統象執行了所有的正常的活動的真實的CPU一樣,但是它時安全的,虛擬的.它執行一個基於指令集,象操作系統一樣管理內存.它創建和操作元數據類型,加載和激活代碼塊的引用.最重要的是,它都是嚴格的依照開放的規範來做所有的這些事情,這些規範能夠別任何想要產生任何兼容虛擬機的人所實現.虛擬機與語言定義提供了一個完全的規範.Java說明了所有的元數據類型的大小和數學特性,而沒有把他們留在直到平臺的實現.

Java解釋器相對較輕較小.能夠被任何一種特殊的平臺想要的形式實現.這個解釋器能夠作爲一個分離的應用程序運行,或者被嵌入到其他的軟件中,比如瀏覽器.這就意味着Java的代碼是可移植的.同樣的Java應用程序字節碼能夠運行在任何提供Java虛擬環境的平臺上.

Java代碼的基本單位是類.編譯好的Java類是一個統一格式的二進制,包含了Java字節碼和其他的類信息.類能夠離散的保存,保存在文件中,或者本地保存或者保存在一個網絡的服務器中.類能夠動態的被定位和加載在運行時.

除了特殊平臺的運行時系統,Java有許多的包含依靠結構的方法的基礎類.這些本地方法,作爲Java虛擬機和真實世界的網關.他們用本地的編譯好了的語言實現,提供了底層次的訪問,比如網絡,窗口系統和宿主文件系統.大多數的Java是由Java自身引導編寫的,包括Java的編譯器,Web瀏覽器組件和複雜的GUI庫.

在歷史上,解釋器被認爲非常的慢,但是Java不是一個傳統的解釋型語言.除了把源代碼搞成可以移植的字節碼,Java也被小心的設計,以便運行時系統能夠更進一步優化他們的性能通過編譯字節碼到本地機器碼.這叫做JIT或者是動態編譯.有了JIT,Java代碼能夠運行得與本地代碼相同得快,而且保持他的可移植性和安全性.

在語言性能的比較上,這可能會引起混淆.僅僅有一個本質上的性能缺陷,就是編譯好了的Java代碼要經歷安全和虛擬機數組越界檢查.其他的任何的東西都被優化成爲本地代碼,就像靜態編譯的語言一樣.除此之外,Java包括更多的結構化的信息,提供更多的空間來優化.這些都是以時間作爲代價的.

傳統的JIT編譯器優化代碼需要時間.所以JIT能夠產生體面的結果,但是可能陷入一個重要的執行時間.爲了解決這個問題,Sun的編譯技術,叫做HotSpot,使用了一個技巧叫做adaptive compilation.如果你看一下真正花去時間的是什麼,就能證明是一邊一邊的執行相關一小部分代碼.雖然這一部分代碼只是整個程序的一小部分,但是他的行爲決定了整個程序的性能.Adaptive compilation也允許Java運行時新的優化,因此,在相同的情況下,要求Java的代碼運行得要比C/C++快.

爲了充分得利用這個,HotSpot作爲了一個正常的Java字節碼解釋器,但是不同的是,他用來衡量代碼哪部分代碼是被重複的執行的.一旦他知道哪部分代碼是影響性能的,HotSpot就把這段代碼搞成本地代碼.既然這些代碼僅僅是一小部分,這些時間也就能夠承受得起.事實上,Sun的默認的JVM能夠運行爲兩種模式,客戶端和服務器端.
當然這些有用的信息也可以以共享的,只讀的類的形式永久性的保存下來,以減少啓動的時間和運行負擔.

Java與其他語言的比較:
很簡單的比較了流行語言,腳本語言與Java的區別.

安全的設計:
講了最吸引人的Java安全性是使得新型的動態移植軟件成爲可能.Java提供了許多層保護,從缺陷代碼到惡意行爲比如病毒和木馬.

簡單,簡單,簡單...:Java不允許編程定義操作符重載(+-).Java沒有源代碼預處理器(#define).Java使用定義好了的包結構來管理類文件.這兒也沒有必要有頭文件(.h);Java支持單繼承類,但是允許多繼承接口.(在C++中沒有接口的概念,只有抽象類-帶有純虛函數的類;C#中有接口的概念,但是平時,我用接口很少,所以對於接口的好處我並沒有深刻的體會到,包括上次面試的時候,被考官問起這個問題,我也是書面上的回答他.今天有時間查查書,看到了在C++中,實現重載必須要有虛函數的支持.)

類型安全和方法綁定:通常語言是被分成靜態和動態,即變量的信息是編譯時被知道還是運行時知道的.嚴格的靜態語言比如c/c++,他們的數據類型是在編譯的時候就明確了.這樣在運行前,編譯器就知道許多的錯誤.但是靜態語言靈活性差,他們不支持高層次的建構list和collections.他們也不可能支持動態導入新的數據類型.

另外一個屬性是綁定方法.靜態語言在編譯時綁定方法的定義,除非coder另外指明.而Java提供了C++和Smalltalk的好處;他是靜態類型的,late-binding語言.每個Java的對象有一個定義良好的類型,並且在編譯時就確定了.然而,Java也是一個完全的運行時類型.Java運行時系統保持跟蹤所有的對象,決定他們的類型和關係.不象C/C++,類型轉換也是在運行時檢查的.

增加的開發:Java攜帶了數據類型和方法簽名信息在源代碼和編譯好的字節碼中.這就意味着Java類能夠被增加開發.你的自身的Java源代碼能夠和你的編譯器沒有見過的其他源碼一樣被安全的編譯.換句話說,你能夠編寫新的引用二進制類文件的代碼,而不會丟失類型安全.

Java不會陷入基類丟失問題.在C++中,一個基類的實現可以被有效的凍結,因爲他有許多的父類;改變基類可能需要重新編譯所有的父類.這對於類庫的開發就是個很大的問題(同樣這個問題對於遊戲開放也是個很大的問題,因爲一個遊戲的代碼也是非常的龐大,再加上龐大的遊戲引擎,通常一個遊戲的編譯都需要一個小時,如果每個類還要編譯,那麼對於遊戲的調試都是十分不方便的)Java通過動態的定位類中的域,來避免這個問題.只要一個類保持一個源結構的有效的形式.

動態內存管理:Java去除了指針,增加了對象垃圾收集和高層次的數組.

錯誤處理:Java的根本是網絡設備和嵌入式系統.對於這些應用.擁有健壯的和智能的錯誤管理.Java有一個強大的異常處理機制.異常提供了一個更加自然和優雅的方式來處理錯誤.允許你把正常代碼和出錯代碼分開處理.

當一個異常發生時,程序流就到了預先設計好的catcher代碼塊中(突然想起,開發中的一個問題,就是我們通常把異常捕捉放在調用函數的地方,還是放在函數裏面,這個問題我一直沒有找到一個很好的解決方案),

線程:現在的程序需要高度的並行性.Java內建了對線程的支持.併發是漂亮的,大多數情況下,線程需要異步.而Java支持基於monitor和condition的異步模型,一種訪問資源的鎖和解鎖系統.異步,指明瞭方法和代碼塊的安全和序列化訪問.在線程間同樣也有簡單的,原始的方法明確wait和signal.Java5.0引入了高層次的併發包.這個包提供了強大的工具,專注於多線程編程通用的模式,比如線程池,任務協調和高級鎖定.

可伸縮性:類趨於更小,模塊組件化,他們能夠被物理上的分離,動態檢索,壓縮存儲,甚至是不同的分佈式方案的高速緩存.在類層次上,Java提供了包,一個結構化的層次,把類按功能分組成爲一個單元.
(下面翻譯一段網上使用包的好處:你和你的coder能夠很容易的決定哪些類和接口是相關的;你和你的coder能夠知道在哪裏可以找到提供某種相關函數的類和接口;一個包中的類名不會與另一個包中的類發生衝突;) 

發佈了22 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章