編譯器、解釋器和虛擬機有什麼區別和聯繫?大體原理是什麼?

小弟自學編程,沒有辦法求助老師,只能上知乎問。C有編譯器,Python有解釋器,Java有虛擬機,但這三個在原理上有區別和聯繫呢?尤其是從代碼到底層機器運行的過程。


編譯器:把代碼從這種語言改成哪種語言

(現代)解釋器:編譯器和虛擬機寫在一起

虛擬機:通常指的是運行指令那樣的低級語言


編譯器:字幕組

解釋器:同聲傳譯

虛擬機:念字幕


正在看R大 @RednaxelaFX 推薦的《兩周自製腳本語言》,第一章很好的回答你這個問題

解釋器

解釋器根據程序中的演算法執行運算。簡單來講,它是一種用於執行程序的軟體。如果執行的程序有虛擬機器語言或類似於機器語言的程序設計語言寫成,這個軟體也能稱為虛擬機。

虛擬機

編譯器能將某種語言攜程的程序轉換為另一種語言的程序。通常它會將原程序轉換為機器語言程序。編譯器轉換程序的行為稱為編譯,轉換前的程序稱為源代碼或源程序。如果編譯器沒有把源代碼直接轉換為機器語言,一般稱為源代碼轉換器或源碼轉換器(source code translator)。

有些語言混用解釋器與編譯器。通常,Java首先會通過編譯器把源代碼轉換為Java二進位代碼,並將這種虛擬的機器語言保存在文件中。之後,Java虛擬機的計時器將執行這段代碼。

傳統的狹義的編譯器將會以文件形式保存轉換後的程序。因此,只要原程序沒有變更,編譯器就僅需執行一次,執行時間也會縮短。然而,一些編譯器並不保存轉換後的程序文件。這種編譯器常見於解釋器內部。

大多數Java虛擬機為了提高性能,會在執行過程中通過編譯器將一部分Java二進位代碼轉換為機器語言使用。執行過程中進行的機器語言轉換稱為動態編譯JIT編譯。轉換後得到的機器語言程序將被載入內存,由硬體只系那個,無需使用解釋器。

編譯器的用途多樣。如上所述,它能夠直接在解釋器內部執行。此外,編譯器的作用也不局限於將源程序轉換為機器語言。例如,Ruby語言的解釋器內部會通過編譯器來執行預處理工作,將源程序轉換為類似Java二進位的虛擬機器語言程序。解釋器真正執行的是這種經過編譯的語言。這種設計提高了執行性能。(你看看看這個回答 https://www.zhihu.com/question/39593194/answer/82321371)

還有現在知乎上好好答題的不多了,建議谷歌 compiler and interpreter,一大把答案


編譯器,把程序原代碼翻譯成二進位代碼輸出,運行時,程序的內容直接交給計算機運行。

解釋器,把程序內容轉換成解釋器所提供的功能去執行對應的CPU程序代碼。

jvm 虛擬機,這個比較特殊,其實他就是解釋器,但是他的解釋器工作模式卻是儘可能模擬成類似二進位程序的工作方式。

另外 python 也有虛擬機這種技術。


@vczh

這個得問輪子哥


推薦閱讀:

編譯器處理轉義符?
Android上ARM本地庫是如何運行在其他CPU架構上的?
Linux/Unix中查看一個C/C++大工程中所有函數的調用順序,有哪些方法?
編譯器的自舉原理是什麼?
從哪裡可以得到包含了Python3所支持的所有語法的測試用例?

TAG:Python | Java虛擬機JVM | 編譯原理 | CC | 計算機語言 |