一.高級語言的運行機制
在計算機上執行一個高級語言程序一般要分兩步,第一步,用一個編譯程序將高級語言程序翻譯成機器語言程序;第二步,運行所得的機器語言程序求得計算結果。
計算機高級語言按程序的執行方式分為兩種:編譯型和解釋型。
1.編譯型語言
編譯型語言是指使用專門的編譯器,針對特定平臺將某種高級語言源代碼一次性編譯成可被平臺硬件執行的機器碼,并包裝成該平臺所能識別的可執行性程序的格式,這個過程稱為編譯(Compile)。編譯生成的可執行性程序可以脫離開發環境,在特定的平臺上運行。有些程序編譯結束后,還可能需要對其它編譯好的目標代碼進行鏈接,組裝兩個以上的目標代碼模塊生成最終的可執行性程序。
編譯型語言一次性地編譯成機器碼,所以可以脫離開發環境獨立運行而且通常運行效率較高;因為編譯型語言的程序被編譯成特定平臺上的機器碼,因此編譯生成的可執行性程序通常不能移植到其他平臺上運行。典型的編譯型程序語言有C、C++等。
2.解釋型語言
解釋型語言是指使用專門的解釋器對源程序逐行解釋成特定平臺的機器碼并立即執行的語言。解釋型語言通常不會進行整體的編譯鏈接處理,解釋型語言相當于把編譯型語言中的編譯和解釋過程混合到一起同時完成。
解釋型語言每次執行程序都要進行一次編譯,因此解釋型語言的程序運行效率通常比較低,而且不能脫離解釋器獨立運行。但解釋型語言跨平臺比較容易,只需提供解釋器即可,每個特定平臺上的解釋器負責將源程序解釋成特定平臺上的機器指令即可。這種跨平臺的優勢是以犧牲程序的運行效率為代價的。典型的解釋型語言有Ruby、Python等。
二.Java程序的運行機制
Java程序的運行必須經過兩個步驟:先編譯、后解釋。編譯(使用javac命令)步驟并不會生成特定平臺的機器代碼,而是生成一種與平臺無關的字節碼(*.class文件)。這個生成的字節碼不是可執行性的,必須使用Java解釋器來解釋執行(使用java命令)。因此可以認為Java語言既是編譯型語言,也是解釋型語言。Java程序運行的步驟如下圖所示。
三.Java實現跨平臺的JVM
JVM(Java Virtual Machine)是Java虛擬機,JVM負責解釋執行字節碼文件。使用Java編譯器編譯生成的與平臺無關的字節碼文件,這些字節碼文件不面向任何具體的平臺,只面向JVM。不同平臺上的JVM都是不同的,但它們都提供了相同的接口,只要為不同平臺實現了相應的虛擬機,編譯后的Java字節碼就可以在該平臺上運行。JVM像是一個中間轉換器,將生成的字節碼文件在虛擬機中運行,而虛擬機則在不同平臺上運行,從而實現Java程序的跨平臺。
用類比的方式來理解JVM。兩支不同的筆,要將同一個筆帽套在這兩支不同的筆上,只有為這兩支筆分別提供一個轉換器,這個轉換器向上的接口相同,用于適應同一個筆帽;向下的接口不同,用于適應兩支不同的筆。這個類比中,可以近似的將兩支筆認為是兩個不同操作系統的平臺,將筆帽近似的看做Java字節碼程序,將轉換器看作JVM。所有平臺上的JVM向上提供給Java字節碼程序的接口完全相同,向下適應不同平臺的接口也不相同。