Python編譯與直譯探討

記得大一上計算機概論的時候,老師說過程式語言分成編譯式程式語言,以及直譯式程式語言,所謂直譯式程式語言就是一行一行這樣讀一行執行一行的程式語言。當時我就很納悶,阿程式語言不都是一行一行從上到下執行下去的嗎? 所以直譯式到底是在做什麼。

大三開始學python時,老師也提到說python是直譯式語言,又一次聽到這個不知所云的詞以及那不知所云的解釋,當下決心要好好的了解,於是就去請教了老師,結果居然得到了「google上面有很多資料可以看」的這種答覆,當下心理OS外加草尼瑪奔騰「啊我就是看了不懂才問你啊…,叫我自己查,那要你何用(?」,一怒之下決心要把這件事給搞懂,於是就有了這篇文章。

編譯式語言 vs. 直譯式語言

首先來看看到底什麼是編譯式語言,什麼又是直譯式語言,其實概念沒有那麼複雜。

  • 編譯式語言: 編譯這個字其實很簡單,從一個語言轉換到另一個語言就是編譯。而所謂編譯式語言指的是,這個程式語言需要先從高階程式語言轉換成機器語言之後才能執行。例如C會先轉換成機器語言,然後才能執行、而Java會先轉換成bytecode(.class檔),然後才能在JVM虛擬機中執行。

  • 直譯式語言: 所謂的直譯,就是這個直接執行高階程式語言,中間無須經過編譯的過程。例如python會直接執行python程式碼,不須先轉換成其他語言之後才能執行、JavaScript也是,瀏覽器會直接直行JavaScript

Python是編譯還是直譯

但是如果對Python有一定了解,就會知道Python其實跟Java的運作方式很像,會先將程式碼編譯成bytecode之後,再將bytecode給虛擬機執行。

那為何大家會說Python是直譯式語言,但卻說Java是編譯式語言?

這是因為Java有明顯的編譯動作出現,Java的程式碼在運作前,一定要先經過編譯成.class檔案的動作,然後才能執行。 但是Python編譯成bytecode檔案的這個動作是不明確的,使用的人不會明確的感受到Python有將程式碼編譯成bytecode的動作。另一個因素是,Python有提供互動式模式,而Java跟C都沒有,所以Python會看起來更像式直譯式語言。

這個世界總是很複雜,很多事都不是非黑即白,程式語言也是一樣,Python既有編譯也有直譯,所以你要界定它到底是哪一個其實是很難的,只能說它比較像哪一個。

參考: Is Python interpreted or compiled? Yes.