Java語言是" 解釋執行" 的語言嗎

先給結論:

class(字節碼)文件經過JVM編譯成機器碼進行解釋執行(解釋執行)。對於熱點代碼,JIT(JustInTime)編譯器會在運行時將其編譯爲機器碼執行(編譯運行)

所以在JVM默認的mixed模式下JAVA既不完全是解釋運行也不完全是編譯運行。

 

正文:

許多Java虛擬機的執行引擎在執行Java代碼的時候都有解釋執行(通過解釋器執行)和編譯執行(通過即時編譯器產生本地代碼執行)兩種選擇,在本章中,我們先來探討一下在解釋執行時,虛擬機執行引擎是如何工作的。

解釋運行通過解釋器執行,一邊對程序進行翻譯,翻譯成計算機可以執行的指令,一邊交給計算機執行,翻譯一句執行一句。

編譯運行通過即時編譯器產生本地代碼執行。對整個程序先翻譯成計算機可以理解的指令,然後計算機可以直接執行。

解釋執行

Java語言經常被人們定位爲“解釋執行”的語言,在Java初生的JDK 1.0時代 ,這種定義還算是比較準確的, 但當主流的虛擬機中都包含了即時編譯器後,Class文件中的代碼到底會被解釋執行還是編譯執行,就成了只有虛擬機自己才能準確判斷的事情。再後來 ,Java也發展出了可以直接生成本地代碼的編譯器[如GCJ」(GNU Compiler for the Java )] ,這時候再籠統地說“解釋執行”,對於整個 Java語言來說就成了幾乎是沒有意義的概念。

只有確定了談論對象是某種具體的Java實現版本和執行引擎運行模式時,談解釋執行還是編譯執行纔會比較確切。

一、你可以說它是編譯型的。因爲所有的Java代碼都是要編譯的,.java不經過編譯就什麼用都沒有。 
二、你可以說它是解釋型的。因爲java代碼編譯後不能直接運行,它是解釋運行在JVM上的,所以它是解釋運行的,那也就算是解釋的了。 
三、但是,現在的JVM爲了效率,都有一些JIT優化。它又會把.class的二進制代碼編譯爲本地的代碼直接運行,所以,又是編譯的。

不論是解釋還是編譯,也不論是物理機還是虛擬機,對於應用程序,機器都不可能如人那樣閱讀、理解 ,然後就獲得了執行能力。大部分的程序代碼到物理機的目標代碼或虛擬機能執行的指令集之前,都需要經過圖8-4中的各個步驟。如果讀者對編譯原理的相關課程還有印象的話,很容易就會發現圖8-4中下面那條分支,就是傳統編譯原理中程序代碼到目標機器代碼的生成過程,而中間的那條分支,自然就是解釋執行的過程。

如今,基於物理機、Java虛擬機,或者非Java的其他高級語言虛擬機(HLLVM )的語 言 ,大多都會遵循這種基於現代經典編譯原理的思路,在執行前先對程序源碼進行詞法分析和語法分析處理,把源碼轉化爲抽象語法樹( Abstract Syntax Tree,AST)。對於一門具體語言的實現來說,詞法分析、語法分析以至後面的優化器和目標代碼生成器都可以選擇獨立於執行引擎,形成一個完整意義的編譯器去實現,這類代表是C/C++語言。也可以選擇把其中一部分步驟(如生成抽象語法樹之前的步驟)實現爲一個半獨立的編譯器,這類代表是Java 語言。又或者把這些步驟和執行引擎全部集中封裝在一個封閉的黑匣子之中,如大多數的JavaScript執行器。

圖8-4 編譯過程

Java語言中 ,Javac編譯器完成了程序代碼經過詞法分析、語法分析到抽象語法樹,再遍歷語法樹生成線性的字節碼指令流的過程。因爲這一部分動作是在Java虛擬機之外進行的, 而解釋器在虛擬機的內部,所以Java程序的編譯就是半獨立的實現。

 

參考:

Java虛擬機

https://blog.csdn.net/weixin_38338099/article/details/83315820

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