歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java程序運行機制

高級語言的運行機制

計算機高級語言按程序的執行方式可以分為編譯型和解釋型兩種。

編譯型語言是指使用專門的編譯器,針對特定平台,也就是操作系統將某種高級語言源代碼一次性翻譯成可被該平台硬件執行的機器碼,並包裝成該平台所能識別的可執行性程序

的格式,這個轉換過程稱為編譯,編譯生成的可執行性程序可以脫離開發環境,在特定的平台上獨立運行。

有些程序編譯結束後,還可能需要對其他編譯好的目標代碼進行連接,即組裝兩個以上的目標代碼模板生成最終的可執行性程序,通過這種方式實現低層次的代碼復用。

因為編譯型語言是一次性的編譯成機器碼,所以可以脫離開發環境獨立運行,而且通常運行效率較高,但是因為編譯型語言的程序被編譯成特定平台上的機器碼,因此編譯生成的

可執行性程序通常無法移植到其他平台上運行,如果需要移植,則必須將源代碼復制到特定的平台上,針對特定平台進行修改,至少也需要采用特定平台上的編譯器重新編譯。

現在的C,C++,Object-C,Pascal等高級語言都屬於編譯型語言。

解釋型語言是指使用專門的解釋器對源程序逐行解釋成特定平台的機器碼並立即執行的語言。

解釋型語言通常不會進行整體性的編譯和連接處理,解釋型語言相當於把編譯型語言中的編譯和解釋過程混合到一起同時完成。

可以這麼認為:每次執行解釋型語言的程序都需要進行一次編譯,因此解釋型語言的程序運行效率通常較低,而且不能脫離解釋器獨立運行。

但解釋器語言有一個優勢,跨平台比較容易,只需要提供特定平台的解釋器即可,每個特定平台上的解釋器負責將源程序解釋成特定平台的機器碼指令即可。解釋型語言可以方便的實現源程序級的一致,但這是以犧牲程序執行效率為代碼的。

現在的JavaScript,ruby,Python,等語言都屬於解釋型語言。

Java程序的運行機制和JVM

Java語言比較特殊,由Java語言編寫的程序需要經過編譯步驟,但這個編譯步驟並不會生成特定的平台的機器碼,而是生成一種與平台無關的字節碼,也就是*.class文件。

當然,這種字節碼不是可執行的,必須使用Java解釋器來解釋執行。

可以這麼認為,Java語言既是編譯型語言,也是解釋型語言,或者說,Java語言既不是純粹的編譯型語言,也不是純粹的解釋型語言。

Java程序的執行過程必須經過先編譯,後解釋這2個步驟。

Java源文件->使用Javac編譯->編譯生成*.class文件->使用Java解釋執行前面的字節碼文件->解釋成特定平台的機器碼。

Java語言裡面負責解釋執行字節碼文件的是Java虛擬機,即JVM,Java virtual machine。JVM是可運行Java字節碼文件的虛擬計算機。所有平台上的JVM向編譯器提供相同的編程接口,而編譯器只需要面向虛擬機,生成虛擬機能理解的代碼,然後由虛擬機來解釋執行。在一些虛擬機的實現中,還會將虛擬機代碼轉換成特定系統的機器碼執行,從而提高執行效率。

當使用Java編譯器編譯Java程序時,生成的是與平台無關的字節碼,這些字節碼不面向任何具體平台,只面向JVM。

不同平台上JVM都是不同的,但他們都提供了相同的接口。JVM是Java程序跨平台的關鍵部分,只要為不同平台實現了相應的虛擬機,編譯後的Java字節碼就可以在該平台上運行。顯然,相同的字節碼程序需要在不同的平台上運行,這幾乎是不可能的,只有通過中間的轉換器才可以實現,JVM就是這個轉化器。

JVM是一個抽象的計算機,和實際的計算機一樣,它具有指令集並使用不同的存取區域。它負責執行指令,還要管理數據,內存和寄存器。

Oracle公司制定的Java虛擬機規范在技術上規定了JVM的統一標准,具體定義了JVM的如下細節:

指令集+寄存器+類文件的格式+棧+垃圾回收堆+存儲區。

Oracle公司制定這些規范的目的是為了提供統一的標准,最終實現Java程序的平台無關性。

Copyright © Linux教程網 All Rights Reserved