java語言的跨平臺性
高階語言的執行機制
計算機高階語言按程式的執行方式可以分為編譯型語言和解釋型語言
編譯型語言是指使用專門的編譯器,針對特定的平臺(作業系統)將某種高階語言原始碼一次性“翻譯”成可被該平臺硬體執行的機器碼,幷包裝成該平臺所能識別的可執行性程式的格式,這個轉換過程稱為編譯。編譯生成的可執行檔案可以脫離開發環境,在特定的平臺上獨立執行。
因為編譯型語言是一次性地編譯成機器碼,所以可以脫離開發環境獨立執行,而且通常執行效率比較高;但因為編譯型語言程式被編譯成特定的機器碼,因此編譯生成的可執行性程式通常無法移植到其他平臺上執行;如果需要移植,則必須將程式碼複製到特定平臺上,針對特定平臺進行修改。
現有的C、C++、FORTRAN、Pascal等高階語言都屬於編譯型語言。
解釋型語言是指使用專門的直譯器對原始碼逐行解釋成特定平臺的機器碼並立即執行的語言。解釋型語言通常不會進行整體型的編譯和連線處理,解釋型語言相當於把編譯型語言中的編譯和解釋過程混合到一起同時完成。
可以認為:每次執行解釋型語言的程式都需要進行一次編譯,因此解釋型語言的程式執行效率通常較低,而且不能脫離直譯器獨立執行。但解釋型語言有一個優勢:跨平臺比較容易,只需提供特定平臺的直譯器即可,每個特定平臺上的直譯器負責將原始碼解釋成特定平臺的機器指令即可。解釋型語言可以方便地實現源程式級的移植,但這是以犧牲程式執行效率為代價的。
現有的Ruby、Python等語言都屬於解釋型語言。
java語言的執行機制和JVM
java語言比較特殊,既是解釋型語言又是編譯型語言。
由java語言編寫程式需要經過編譯步驟,但這個步驟並不會生成特定平臺的機器碼,而是生成一種與平臺無關的位元組碼(.class檔案)。這種位元組碼檔案不是可執行的,必須使用java直譯器來解釋執行。因此,java語言既不是純粹的編譯型語言,又不是純粹的解釋型語言。
java語言負責解釋執行位元組碼檔案的是java虛擬機器,即JVM,JVM是可執行.class檔案的虛擬計算機。所有平臺的JVM向直譯器提供相同的程式設計介面,而編譯器只需要面向虛擬機器,生成虛擬機器能理解的程式碼,然後由虛擬機器來解釋執行。
java語言的這種特殊性,實現了java語言的跨平臺型