1. 程式人生 > >Java與c/c++執行時的不同

Java與c/c++執行時的不同

Java編譯原理

1、Java編譯過程與c/c++編譯過程不同

Java編譯程式將java源程式編譯成jvm可執行程式碼--java位元組碼.

c/c++編譯過程:

當C編譯器編譯生成一個物件的程式碼時,該程式碼是為在某一特定硬體平臺執行而生成的。因此在編譯過程中,編譯程式通過查表將所有對符號的引用轉換為特定的記憶體偏移量,以保證程式執行。

Java編譯過程:

Java編譯器卻不將對變數和方法的引用編譯為數值引用,也不確定程式執行過程中的記憶體佈局,而是將些符號引用資訊保留在位元組碼中,由直譯器在執行過程中創立記憶體佈局,然後再通過查表來確定一個方法所在的地址,這樣就有效地保證了java的可移植性和安全性。

2、jvm工作原理

執行jvm字元碼的工作是由直譯器來完成的。解釋執行過程分三步進行:程式碼的裝入、程式碼的校驗、和程式碼的執行。

裝入程式碼的工作由“類裝載器classloader”完成。類裝載器負責裝入執行一個程式需要的所有程式碼,這也包括程式程式碼中的類所繼承的類和被調

用的類。當類裝載器裝入一個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本臺計算機的所有類都在同一地址空間中,而所有從外部引進的類,都有一個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的執行效率,同時又保證它們與從外部引進的類不會相互影響。

當裝入了執行程式需要的所有類後,直譯器便可確定整個可執行程式的記憶體佈局。直譯器為符號引用與特定的地址空間建立對應關係及查詢表。通過在這一階段確定程式碼的內佈局,java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了程式碼的非法訪問。

隨後,被裝入的程式碼由位元組碼校驗器進行檢查。校驗器可以發現運算元棧益處、非法資料型別轉化等多種錯誤。通過校驗後,程式碼便開始執行了。

java位元組碼的執行有兩種方式:

1)即時編譯方式:直譯器先將位元組編譯成機器碼,然後再執行該機器碼。

2)解釋執行方式:直譯器通過每次解釋並執行一小段程式碼來完成java位元組碼程式的所有操作。