[Programming] 編譯 vs 直譯

在上計算機概論的程式語言章節時,老師一定都會講到編譯 (Compile) 和直譯 (Interprete) 這兩個術語,其實它們並不難懂,只是有一些行為上的差異而已。

在上計算機概論的程式語言章節時,老師一定都會講到編譯 (Compile) 和直譯 (Interprete) 這兩個術語,其實它們並不難懂,只是有一些行為上的差異而已。

所謂的編譯,是指原始的程式碼 (source code) 會經由編譯器 (compiler) 轉換成目的碼 (object code) 後,再由連結器 (linker) 轉換成可執行的二進位碼,使用編譯器的語言稱為編譯式語言,C 和 C++ 就是編譯式語言的代表作。以及像是 C# , LISP, Pascal, VB, Delphi 等需要編譯器才能轉換成可執行碼 (executable code) 的語言。編譯式語言多半會是靜態語言 (static language),它們擁有事先定義的型別,型別檢查 (type check) 與高效能的執行速度等特性。

 

所謂的直譯,是指原始的程式碼只要經過直譯器 (Interpreter) 即可轉換成可執行碼,由於它們不需要經由編譯器,而是在執行時才會將原始碼直譯成執行碼,所以速度上會比編譯與連結器產生的執行碼要慢,效能會有一部份取決於直譯器的速度,而直譯式語言多半以動態語言 (dynamic language) 為主,具有靈活的型別處理 (鬆散型別),動態生成與程式彈性,但速度會比編譯式的要慢一些,像是 JavaScript, Python, Ruby, PHP, ASP 等等,都是直譯式語言。

使用編譯式語言產生的程式幾乎都是可獨立執行的,因為它們都是由Compiler進行型別/語意等檢查,以及經過連結器的處理,程式碼幾乎可以直接存取系統服務 (system service) 與 APIs,所以執行效率會特別好;直譯式語言則是必須依賴一個執行環境 (execution context),語言可用的功能由這個執行環境提供,例如 JavaScript 只能使用瀏覽器提供的功能,而 PHP 只能使用 php.exe 實作的功能一樣,它們無法獨立執行 (或是看起來像獨立,實際上卻是系統自動在背後建立執行環境,如 HTML Application)。

.NET Framework 本身的語言則是包含兩種成份 (Java 也是),一開始 .NET Framework 內的編譯器 (csc.exe, vbc.exe) 是扮演編譯器的角色,它會將程式編譯成中介碼 (Intermediate Code, Java 則是bytecode),而在執行時,由 CLR (JVM) 進行即時編譯 (JIT Compilation),將中介碼轉換成機器碼 (Machine code),才可以在作業平台上執行,所以 CLR (JVM) 扮演的是直譯器的角色,而其執行環境則是整個作業系統,它亦有編譯式語言的特性,但速度會比純種的編譯式語言 (C/C++) 要慢一些,原因是在 JIT Compilation 在第一次執行時會啟動,以將程式轉成機器碼,而純種的編譯式語言則在編譯連結完成時就已經是機器碼,故不需要 JIT 處理。

編譯器通常也會被廠商利用來做一些特殊功能,例如 .NET 的 var, dynamic, LINQ, anonymous type, Lambda Expression, ... 等等,編譯器魔術 (compiler magic) 會讓開發人員使用該語言撰寫程式時,能簡化程式撰寫的量,以加速程式的開發工作。

 

Reference:

http://en.wikipedia.org/wiki/Interpreter_(computing)
http://en.wikipedia.org/wiki/Compiler