Java语言是 解释执行 的语言吗
本篇來自周志明的<<深入理解java虛擬機>>
許多Java虛擬機的執行引擎在執行Java代碼的時候都有解釋執行(通過解釋器執行)和編譯執行(通過即時編譯器產生本地代碼執行)兩種選擇,在本章中,我們先來探討一下在解釋執行時,虛擬機執行引擎是如何工作的。
解釋執行
Java語言經常被人們定位為“解釋執行”的語言,在Java初生的JDK 1.0時代 ,這種定義還算是比較準確的, 但當主流的虛擬機中都包含了即時編譯器后,Class文件中的代碼到底會被解釋執行還是編譯執行,就成了只有虛擬機自己才能準確判斷的事情。再后來 ,Java也發展出了可以直接生成本地代碼的編譯器[如GCJ」(GNU Compiler for the Java )],而C/C++語言也出現了通過解釋器執行的版本(如CINT) ,這時候再籠統地說“解釋執行”,對于整個 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语言是 解释执行 的语言吗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2009年研究生数模竞赛中一道题是跟弹道
- 下一篇: 国外LEAD域名邮箱获取途径