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最明顯的特徵:一行一行讀取原始碼後,解釋,立即執行
相比於編譯型語言來說,解釋型語言由於不要翻譯成目標檔案,因此佔據空間較少,但由於逐行解釋的翻譯方式,也因此降低了整體的執行效率。
以上。