編譯式 vs 直譯式執行
要讓電腦執行你用人類友善語言寫的程式,基本上有兩種方式。第一種是事先把整個東西翻成機器自己的語言,再去跑那個成果——就像把一本書一次翻好再印出來。第二種是在執行時逐行翻譯並照做——就像一位現場口譯員站在你旁邊,當場把每句話譯成另一種語言。第一種是編譯式;第二種是直譯式。
在編譯式執行中,一個叫做編譯器的程式讀你的原始碼,事先產生一個獨立的機器碼檔案。你直接執行那個檔案;執行期不再需要原始碼,而 CPU 原生地執行那些機器指令,通常很快。在直譯式執行中,一個叫做直譯器的程式讀你的原始碼,每次執行都逐步地實現它的意義——沒有獨立的機器碼檔案,而且直譯器每次都得在場。這通常較慢,但更有彈性,也更容易在任何有直譯器的地方跑起來。
為何重要——以及誠實的細微之處:這道分野是真實的,卻不是乾淨的二選一。同一種語言可以兩者皆是,而多數現代系統把界線弄模糊了。Java 和 C# 編譯成一種中介位元組碼,再由一台虛擬機去直譯,或在執行時即時(JIT)編譯成機器碼。CPython 直譯位元組碼;許多 JavaScript 引擎先直譯,再把熱點程式碼 JIT 編譯。有用的結論是它捕捉到的取捨:編譯,是拿事先的翻譯時間換取快速、但重新建構後才可攜的執行;直譯,是拿執行速度換取彈性與即時性。而本領域的語言 C,是徹底的編譯式。
用 C,你執行一次 gcc hello.c -o hello,之後可以跑 ./hello 很多次——編譯器事先做完了翻譯。用 Python,你執行 python hello.py,而直譯器每一次都重新讀取、重新執行那份原始碼。
編譯一次、執行那個成品;或者每次執行都重新直譯原始碼。
「編譯式」與「直譯式」描述的是一種實作選擇,不是語言天生的性質——存在 C 的直譯器,也有 Python 的編譯器。說「Python 是直譯式的」只是它常見實作的簡稱,並非定律。