JAVA的編譯器首先把JAVA源檔案編譯為位元組碼。這些位元組碼對於JAVA虛擬機器(JVM)來講就是機器的指令碼。然後,JAVA的解譯器不斷的迴圈取出位元組碼進行解釋並執行。
這樣做的優點是可以實現JAVA語言的跨平台,同時產生的位元組碼也比較緊湊。JAVA的一些優點,如安全性,動態性都得保持;但缺點是省產生的位元組碼沒有經過什麼最佳化,同全部編譯好的本地碼相比,速度比較慢。
b) 及時編譯技術(Just In Time)
及時編譯技術是為瞭解決指令解釋技術效率比較低,速度比較慢的情況下提出的,其結構圖如下所示。
其主要變化是在JAVA程式執行之前,又JIT編譯器把JAVA的位元組碼編譯為機器碼。從而在程式運行時直接執行機器碼,而不用對位元組碼進行解釋。同時對代碼也進行了部分的最佳化。
這樣做的優點是大大提高了JAVA程式的效能。同時,由於編譯的結果並不在程式運行間儲存,因此也節約了儲存空間了載入程式的時間;缺點是由於JIT編譯器對所有的代碼都想最佳化,因此也浪費了很多的時間。
IBM和SUN公司都提供了相關的JIT產品。
c) 適應性最佳化技術(Adaptive Optimization Technology)
同JIT技術相比,適應性最佳化技術並不對所有的位元組碼進行最佳化。它會跟蹤程式啟動並執行成個過程,從而發現需要最佳化的代碼,對代碼進行動態最佳化。對最佳化的代碼,採取80/20的策略。從理論上講,程式啟動並執行時間越長,代碼就越最佳化。其結構圖如下:
其優點是適應性最佳化技術充分利用了程式執行時的資訊,發行程式的效能瓶頸,從而提高程式的效能;其缺點是在進行最佳化時可能會選擇不當,發而降低了程式的效能。
其主要產品又IBM,SUN的HotSpot.
d) 動態最佳化,提前編譯為機器碼的技術(Dynamic Optimization,Ahead Of Time)
動態最佳化技術充分利用了JAVA源碼編譯,位元組碼編譯,動態編譯和靜態編譯的技術。其輸入時JAVA的原碼或位元組碼,而輸出是經過高度最佳化的可執行代碼和個來動態庫的混合(Window中是DLL檔案,UNIX中是共用庫.a .so檔案)。其結構如下: