1. 程式人生 > >Interpreter(直譯器)與complier(編譯器)的區別

Interpreter(直譯器)與complier(編譯器)的區別

首先需要說明的是,我們通常寫程式碼用的語言(彙編除外)對於機器來說都是高階語言(high-level language),但由於機器並不能直接理解高階語言,所以我們的程式碼若是想被執行還需要經過中間的翻譯步驟,這個翻譯要麼是“解釋”,要麼是“編譯”,也因此,我們平時寫程式碼的語言主要分為兩類:

解釋型語言:R,Python,Java等

編譯型語言:C, C++, Pascal等

 

一. Compiler(編譯器)

其實我覺得最能體會直譯器與編譯器的區別就是在除錯/執行程式碼的時候,

作為計算機專業的學生,大學要學的第一門語言是C,我記得當時我們普遍用Dev-C++ (輕量級易啟動易安裝),

當時每次寫完程式碼後,可以單獨選擇 編譯(compile) 再選 執行(run),或者 編譯且執行,但是無論如何,是需要有這麼一個編譯的過程的

如果在命令列中用GCC來編譯C檔案的話,大概對編譯過程有更深的體會,

在寫好一個hello world的c檔案後,需要用gcc來執行:

 $ gcc -Wall -hello.c -o hello 

這個過程中,gcc將原始的hello.c檔案編譯成機器可以理解的程式碼並且存為hello檔案,之後再執行:

 $ ./hello 

這一步驟將可以被機器理解的hello檔案送到記憶體中由CPU開始執行,之後就可以得到執行結果。

以上是想強調,complier需要先把不可被機器理解的High-level language(例如C或者C++)翻譯成可被機器理解的語言(一般是二進位制’0‘和’1‘),並存入新的目標檔案中(例如上面例子中的hello檔案),之後我們真正執行的物件也是hello檔案

 

二.Interpreter(直譯器)

如果有在Pycharm除錯經驗的同學大概會發現,一個有bug的檔案是可以被除錯的,直到遇到bug,報錯,自動退出除錯過程。

這也對應了Interpreter最明顯的特徵:一行一行讀取原始碼後,解釋,立即執行

相比於編譯型語言來說,解釋型語言由於不要翻譯成目標檔案,因此佔據空間較少,但由於逐行解釋的翻譯方式,也因此降低了整體的執行效率。

 

以上。