【Java學習】java語言的執行模式--半編譯和半解釋型

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,其他語言

  解釋性語言:HTMLXMLJavascript、C#

  編譯性語言:C/C++、Pascal/Object Pascal(Delphi)


本文轉自:http://blog.csdn.net/sunshinetan/article/details/52938111

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章