1. 程式人生 > >Question20180104 對比編譯器、解釋器與Javac編譯原理

Question20180104 對比編譯器、解釋器與Javac編譯原理

即時編譯 inf ali pro 友好 pre 目標 缺點 java、

編譯器與Javac編譯原理

  在前文我們知道了Java是一種編譯語言和解釋語言,它的源代碼經過編譯器Javac編譯為能夠被JVM識別的二進制語言,然後JVM將其解釋為能夠被平臺識別的機器語言。那麽什麽是編譯器呢?編譯器的作用是什麽呢?Javac又是如何進行工作的?下面我們一一來認識了解。

1 編譯器(Compiler )

  簡單講,編譯器就是將“一種語言(通常為高級語言)”翻譯為“另一種語言(通常為低級語言)”的程序。一個現代編譯器的主要工作流程:源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 目標代碼 (object code) → 鏈接器 (Linker) → 可執行程序 (executables)

  高級計算機語言便於人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。源代碼一般為高級語言 (High-level language), 如Pascal、C、C++、Java、漢語編程等或匯編語言,而目標則是機器語言的目標代碼(Object code),有時也稱作機器代碼(Machine code)。

  對於C#、VB等高級語言而言,此時編譯器完成的功能是把源碼(SourceCode)編譯成通用中間語言(MSIL/CIL)的字節碼(ByteCode)。最後運行的時候通過通用語言運行庫的轉換,編程最終可以被CPU直接計算的機器碼(NativeCode)。

  簡單來說,編譯器就是將“一種語言(通常為高級語言)”翻譯為“另一種語言(通常為低級語言)”的程序,編譯器的作用就是就是將便於人理解的語言規範轉化為機器容易理解的語言規範;

2 解釋器

  解釋器(英語:Interpreter),又譯為直譯器,是一種電腦程序,能夠把高級編程語言一行一行直接轉譯運行。解釋器不會一次把整個程序轉譯出來,只像一位“中間人”,每次運行程序時都要先轉成另一種語言再作運行,因此解釋器的程序運行速度比較緩慢。它每轉譯一行程序敘述就立刻運行,然後再轉譯下一行,再運行,如此不停地進行下去。

3 解釋器和編譯器的對比

  解釋器是一條一條的解釋執行源語言。比如php,postscritp,javascript就是典型的解釋性語言。  

  編譯器是把源代碼整個編譯成目標代碼,執行時不在需要編譯器,直接在支持目標代碼的平臺上運行,這樣執行效率比解釋執行快很多。比如C語言代碼被編譯成二進制代碼(exe程序),在windows平臺上執行。

  解釋器比編譯器的效率高(詳見http://www.cnblogs.com/sword03/archive/2010/06/27/1766147.html)

4 Javac編譯原理

  我們知道程序語言都有自己的規範,這個規範詳細描述了語言有哪些語法和詞匯,Java作為一個高級開發語言也不例外,它也有自己的語言規範,Java虛擬機也有自己的虛擬機規範,Java虛擬機規範和Java語言規範不是一回事,他們都有自己的詞法和語法解析規則,而且它們的解析規則也是不同的。那麽如何才能讓Java的語法規則適應Java虛擬機的語法規則呢?這個任務就由Javac編譯器來完成。它的作用就是將Java語言規範轉化為Java虛擬機語言規範,完成翻譯工作。

4.1 Javac是什麽

  Javac是一種編譯器,能將一種語言規範轉化為另一種語言規範。通常編譯器都是將便於人理解的語言規範轉化為機器容易理解的語言規範,如C、C++或者匯編語言都是將源碼直接編譯成目標機器碼,這個目標機器碼是CPU直接執行的指令集合。這些指令集合也就是底層的一種語言規範,機器能夠直接識別這種語言規範,但是人不可能直接去寫目標機器碼。雖然這種機器碼執行起來非常高效,但是對人太不友好了,開發這個代碼的成本往往高於省下的機器的執行成本,所以才有了編譯器的出現,有了編譯器才有可能出現了這麽多的高級編程語言。

  從某種意義上來說,有了編譯器才有了程序語言的繁榮,因為編譯器是人類和機器溝通的一個紐帶。

5 Java你就是比C慢

  我們知道Java是由C發展而來的,Java即是一種編譯型語言,又是一種解釋型語言,而C呢是一種編譯型語言,C的源代碼經過一次編譯後可以直接別計算機執行,而Java的源代碼需要經過一次編譯生成符合JVM規範的中間碼,然後由JVM解釋執行生成能夠被計算機識別的機器碼,最後由CPU執行.如下圖:

技術分享圖片

這樣很明顯就能看出來Java在運行上的確沒有C那麽直接,那麽迅速,針對這個缺點,JVM有了一個選項,可以將執行頻率高的字節碼序列翻譯成機器碼,這一過程叫做即時編譯,大大提供了執行效率.

Question20180104 對比編譯器、解釋器與Javac編譯原理