官术网_书友最值得收藏!

2.5 Java的運行機制

知識點講解:

Java是一種特殊的高級語言,不但具有解釋型語言的特征,也具有編譯型語言的特征。我們需要首先編譯Java程序,然后解釋運行Java程序。在2.2節中,我們通過一段Java程序了解了編譯并運行Java程序的基本方法。但我們只是從表面了解了編譯和運行Java程序的流程,為了加深讀者對Java的理解,本節將從根本上講解Java程序的運行機制。

2.5.1 編譯型/解釋型語言的運行機制

高級語言有兩種執行程序的方式,分別是編譯型和解釋型。

1.編譯型語言

編譯型語言會使用專門的編譯器,針對特定平臺(操作系統)將某種高級語言的源代碼一次性“翻譯”成可被該平臺硬件執行的機器碼(包括機器指令和操作數),并包裝成該平臺所能識別的可執行程序的格式,這個轉換過程稱為編譯(Compile)。編譯完之后會生成一個可以脫離開發環境的可執行程序,它可以在很多特定的平臺上獨立運行。

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

因為編譯型語言是一次性編譯成機器碼,所以可以脫離開發環境獨立運行,而且通常運行效率較高。但因為編譯型語言的程序被編譯成特定平臺上的機器碼,所以編譯生成的可執行程序通常無法移植到其他平臺上運行。如果需要移植,則必須將源代碼復制到特定平臺上,針對特定平臺進行修改,至少需要采用特定平臺上的編譯器重新編譯。現有的C和C++等高級語言都屬于編譯型語言。

2.解釋型語言

解釋型語言會使用專門的解釋器將該語言的源程序逐行解釋成特定平臺的機器碼并立即執行,解釋型語言通常不會進行整體性的編譯和鏈接處理,解釋型語言相當于把編譯型語言中的編譯和解釋過程混合到一起同時完成。可以認為:每次執行解釋型語言的程序都需要進行一次編譯,因此解釋型語言的程序運行效率通常較低,而且不能脫離解釋器獨立運行。但解釋型語言有一個優勢—跨平臺比較容易,只需要提供特定平臺的解釋器,每個特定平臺上的解釋器負責將源程序解釋成特定平臺的機器指令。解釋型語言可以方便地實現源程序級的移植,但這是以犧牲程序執行效率為代價的。現有的Ruby、Python等語言都屬于解釋型語言。

2.5.2 Java程序則要先編譯、后運行

Java語言比較特殊,由Java編寫的程序必須經歷編譯步驟,但這個編譯步驟并不會生成特定平臺的機器碼,而是生成一種與平臺無關的字節碼(也就是*.class文件,例如2.2.2節中的first.class和2.3.4節中的First.class都是編譯后的字節碼文件)。當然,這種字節碼必須使用Java解釋器來解釋執行。正因為如此,我們可以認為Java既是一種編譯型語言,也是一種解釋型語言。

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

主站蜘蛛池模板: 赫章县| 大渡口区| 宁强县| 江永县| 祁阳县| 民县| 连江县| 闻喜县| 玉林市| 霸州市| 昭通市| 玛曲县| 汤阴县| 三原县| 南宫市| 芒康县| 基隆市| 盱眙县| 樟树市| 霍山县| 江油市| 遂昌县| 建昌县| 大丰市| 六枝特区| 洛阳市| 许昌市| 乳源| 名山县| 孙吴县| 鄄城县| 南漳县| 阆中市| 康乐县| 女性| 穆棱市| 龙里县| 修武县| 万宁市| 金昌市| 定兴县|