【Java核心技術】Java平臺的理解
巨集觀角度:
跟c/c++最大的不同點在於,c/c++程式設計是面向作業系統的,需要開發者極大地關心不同作業系統之間的差異性;而Java平臺通過虛擬機器遮蔽了作業系統的底層細節,使得開發者無需過多地關心不同作業系統之間的差異性。
通過增加一個間接的中間層來進行”解耦“是計算機領域非常常用的一種”藝術手法“,虛擬機器是這樣,作業系統是這樣,HTTP也是這樣。
Java平臺已經形成了一個生態系統,在這個生態系統中,有著諸多的研究領域和應用領域:
1. 虛擬機器、編譯技術的研究(例如:GC優化、JIT、AOT等):對效率的追求是人類的另一個天性之一
2. Java語言本身的優化
3. 大資料處理
4. Java併發程式設計
5. 客戶端開發(例如:Android平臺)
6. ......
微觀角度:
Java平臺中有兩大核心:
1. Java語言本身、JDK中所提供的核心類庫和相關工具
2. Java虛擬機器以及其他包含的GC
1. Java語言本身、JDK中所提供的核心類庫和相關工具
從事Java平臺的開發,掌握Java語言、核心類庫以及相關工具是必須的,我覺得這是基礎中的基礎。
>> 對語言本身的瞭解,需要開發者非常熟悉語言的語法結構;而Java又是一種面對物件的語言,這又需要開發者深入瞭解面對物件的設計理念;
>> Java核心類庫包含集合類、執行緒相關類、IO、NIO、J.U.C併發包等;
>> JDK提供的工具包含:基本的編譯工具、虛擬機器效能檢測相關工具等。
2. Java虛擬機器
Java語言具有跨平臺的特性,也正是因為虛擬機器的存在。Java原始檔被編譯成位元組碼,被虛擬機器載入後執行。這裡隱含的意思有兩層:
1)大部分情況下,程式設計者只需要關心Java語言本身,而無需特意關心底層細節。包括對記憶體的分配和回收,也全權交給了GC。
2)對於虛擬機器而言,只要是符合規範的位元組碼,它們都能被載入執行,當然,能正常執行的程式光滿足這點是不行的,程式本身需要保證在執行時不出現異常。所以,Scala、Kotlin、Jython等語言也可以跑在虛擬機器上。
圍繞虛擬機器的效率問題展開,將涉及到一些優化技術,例如:JIT、AOT。因為如果虛擬機器載入位元組碼後,完全進行解釋執行,這勢必會影響執行效率。所以,對於這個執行環節,虛擬機器會進行一些優化處理,例如JIT技術,會將某些執行特別頻繁的程式碼編譯成機器碼。而AOT技術,是在執行前,通過工具直接將位元組碼轉換為機器碼。
“一次編譯、到處執行”說的是Java語言跨平臺的特性,Java的跨平臺特性與Java虛擬機器的存在密不可分,可在不同的環境中執行。比如說Windows平臺和Linux平臺都有相應的JDK,安裝好JDK後也就有了Java語言的執行環境。其實Java語言本身與其他的程式語言沒有特別大的差異,並不是說Java語言可以跨平臺,而是在不同的平臺都有可以讓Java語言執行的環境而已,所以才有了Java一次編譯,到處執行這樣的效果。
嚴格的講,跨平臺的語言不止Java一種,但Java是較為成熟的一種。“一次編譯,到處執行”這種效果跟編譯器有關。程式語言的處理需要編譯器和直譯器。Java虛擬機器和DOS類似,相當於一個供程式執行的平臺。
程式從原始碼到執行的三個階段:編碼——編譯——執行——除錯。Java在編譯階段則體現了跨平臺的特點。編譯過程大概是這樣的:首先是將Java原始碼轉化成.CLASS檔案位元組碼,這是第一次編譯。.class檔案就是可以到處執行的檔案。然後Java位元組碼會被轉化為目標機器程式碼,這是是由JVM來執行的,即Java的第二次編譯。
“到處執行”的關鍵和前提就是JVM。因為在第二次編譯中JVM起著關鍵作用。在可以執行Java虛擬機器的地方都內含著一個JVM作業系統。從而使JAVA提供了各種不同平臺上的虛擬機制,因此實現了“到處執行”的效果。需要強調的一點是,java並不是編譯機制,而是解釋機制。Java位元組碼的設計充分考慮了JIT這一即時編譯方式,可以將位元組碼直接轉化成高效能的本地機器碼,這同樣是虛擬機器的一個構成部分。