java編譯過程

Java編譯原理
一、Java編譯過程與c/c++編譯過程不一樣
Java編譯程序將java源程序編譯成jvm可執行代碼--java字節碼.

Java在編譯過程當中通常會按照如下過程進行:
(1)JDK根據編譯參數encoding肯定源代碼字符集.若是不指定該參數,系統會根據操做系統的file.encoding參數來獲取操做系統編碼格式,國內的windows一般都是GBK.
(2)JDK根據上面的字符集信息,將源文件編譯成JAVA內部的unicode模式,並將編譯後的內容保存到內存中.
(3)JDK將內存保存無缺的內存信息寫入.class文件,生成最後的二進制文件.

   不少人會發現本身在IDE中配置了源文件字符集爲UTF-8(與操做系統默認字符集不一樣)後,再直接運行javac就會出現錯誤,這就是由於不加 encoding參數的編譯過程當中會默認使用系統的字符集的。在windows中默認爲GBK。IDE中進行編譯時,IDE會在編譯參數中增長該參數.

  若是你使用ant來進行編譯活動,那麼請你確認你的源代碼的字符集,而後再相應的ant編譯任務中,增長encoding參數
這就意味着, 若是你以前的項目採用的是系統默認的字符集(GBK)來編輯你的源代碼,那麼若是你改用UTF-8,這就意味你須要從新修改ant腳本,從新打包你的產品。


c/c++編譯過程:
當C編譯器編譯生成一個對象的代碼時,該代碼是爲在某一特定硬件平臺運行而生成的。所以在編譯過程當中,編譯程序經過查表將全部對符號的引用轉換爲特定的內存偏移量,以保證程序運行。

Java編譯過程:
Java編譯器卻不將對變量和方法的引用編譯爲數值引用,也不肯定程序執行過程當中的內存佈局,而是將些符號引用信息保留在字節碼中,由解釋器在運行過程當中創立內存佈局,而後再經過查表來肯定一個方法所在的地址,這樣就有效地保證了java的可移植性和安全性。

二、jvm工做原理
運行jvm字符碼的工做是由解釋器來完成的。解釋執行過程分三步進行:代碼的裝入、代碼的校驗、和代碼的執行。

裝入代碼的工做由「類裝載器classloader」完成。類裝載器負責裝入運行一個程序須要的全部代碼,這也包括程序代碼中的類所繼承的類和被調

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

當裝入了運行程序須要的全部類後,解釋器即可肯定整個可執行程序的內存佈局。解釋器爲符號引用與特定的地址空間創建對應關係及查詢表。經過在這一階段肯定代碼的內佈局,java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼的非法訪問。

隨後,被裝入的代碼由字節碼校驗器進行檢查。校驗器能夠發現操做數棧溢出、非法數據類型轉化等多種錯誤。經過校驗後,代碼便開始執行了。 java字節碼的執行有兩種方式: 1)即時編譯方式:解釋器先將字節編譯成機器碼,而後再執行該機器碼。 2)解釋執行方式:解釋器經過每次解釋並執行一小段代碼來完成java字節碼程序的全部操做。
相關文章
相關標籤/搜索