Knowledge Point 20180303 對比編譯器、解譯器與Javac編譯原理

來源:互聯網
上載者:User

標籤:程式語言   電腦   htm   才有   c++   工作   cpu   沒有   編譯原理   

編譯器與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的原始碼經過一次編譯後可以直接在電腦上(編譯後的C代碼為針對該電腦平台特有的機器指令,到了另一個平台需要重新編譯)執行,而Java的原始碼需要經過一次編譯產生符合JVM規範的中間碼,然後由JVM解釋執行產生能夠被電腦識別的機器碼,最後由CPU執行.如:

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

Knowledge Point 20180303 對比編譯器、解譯器與Javac編譯原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.