1,相關概念
1)編譯方式:
編譯方式把源程序的執行過程嚴格地分成兩大步:編譯和運行。
①把源程序全部翻譯成目標代碼
②運行目標代碼,獲取執行結果。
2)解釋方式:
源程序輸入到計算機後,解釋程序將程序逐句翻譯,翻譯一句執行一句邊翻譯邊執行,不產生目標程序。
解釋方式是按照遠程序中語句的動態順序,直接地逐句進行分析解釋,並立即執行。
解釋的過程:在程序執行時開始翻譯代碼爲二進制,翻譯一句執行一句。
3)JIT和AOT編譯技術比較:
①JIT(Just-In-Time)即時編譯技術,動態編譯。
根據代碼結構肯能提高或降低java程序執行速度。
i>缺點:
由於JIT對每條字節碼都進行編譯,造成了編譯過程負擔過重(編譯器必須與應用程序共享CPU)。爲了避免這種情況,當前的JIT只對最頻繁執行的字節碼(熱方法)進行編譯,如循環等。可通過java.lang.Compiler.disable();關閉。
ii>優點:
運行時進行本地代碼編譯而不是在程序運行前編譯(C、C++是這種),保證了可移植性。
②AOT:靜態編譯。
在程序執行前生成 Java 方法的本地代碼,以便在程序運行時直接使用本地代碼。
i>缺點:
犧牲了平臺無關性和代碼質量,因爲它們不能利用程序的動態行爲,也不具有關於加載的類或類層次結構的信息。
ii>優點:
避免 JIT 編譯器的運行時性能消耗或內存消耗,或者避免解釋程序的早期性能開銷。極大提高java代碼性能。
具體參照:http://blog.csdn.net/hsuxu/article/details/9320699
4)靜態代碼塊和動態代碼塊:
靜態代碼塊 :JVM加載類的時候會加載執行,並且只執行一次。
非靜態代碼塊:在new對象的時候執行,每次new的時候都會執行一次。
5)java語言的編譯方式:
.class不是機器語言,是經過編碼的8位字節二進制流,描述了java類種每個方法所執行的操作。因爲沒有直接編譯成機器語言,所以稱爲半編譯型。①編譯:
用javac命令,源文件source code(.java)編譯成字節碼bytecode(.class)。
注:
a) .java文件是一個編譯單元,每個編譯單元最多隻有一個public標記的類,其它的類都是爲這個public類起支撐作用的。
b)在編譯的時候,根據這個.java文件中類的數量不同,產生幾個.class文件,這個與C++中一個編譯單元產生一個.object文件不同。
c)如果兩個.java文件都包含一個相同的類如Test,那麼這兩個java文件編譯後,只能產生一個Test.class,誰後編譯屬於誰。
d)一個有效的程序就是一系列的class文件,它們可以封裝和壓縮到一個jar文件。
②運行(3種可能):
有的時候,三種方式同時使用。至少i>和ii>是同時使用的,iii>需要程序員手工指定。
i>由JVM逐條解釋執行。
因爲代碼編譯後不能直接運行,它是解釋運行再JVM上,所以是半解釋型。不同平臺下JVM虛擬機的細節實現是不同的,所以才能適應不同的平臺。
ii>部分代碼可能由JIT翻譯爲目標機器指令直接執行;
以method爲翻譯單位,還會保存起來,第二次執行就不用翻譯了。
現在的JVM爲了效率,有一些JIT優化。JIT編譯啓用時,JVM讀入.class文件解釋後,將其發給JIT編譯器。JIT編譯器直接將bytecode編譯爲本機機器代碼。所以是編譯型,沒有必要糾結它是編譯型還是解釋型。
iii>RTSJ。繼JAVAC之後執行AOT二次編譯,生成靜態的目標平臺代碼。(典型的是:IBM WebSphere Real Time)
RTSJ(Real time specification for java):實時規範。
3,其他語言
解釋性語言:HTML、XML、Javascript、C#
編譯性語言:C/C++、Pascal/Object Pascal(Delphi)
本文轉自:http://blog.csdn.net/sunshinetan/article/details/52938111