1. 編譯型語言
對於類似 C++ 這樣的編譯型語言,程式碼會事先被編譯成機器指令(可執行檔案),然後再一股腦兒交給 CPU 來執行
在執行時,CPU 面對是已經編譯好的機器指令,直接逐條執行即可,執行效率比較高
但因為每種型別的 CPU(比如 Intel、ARM 等)支援的 CPU 指令集不同,並且程式還有可能呼叫作業系統提供的 API
所以,編譯之後的可執行檔案只能在特定的作業系統和機器上執行,換一種作業系統或機器,編譯之後的可執行檔案就無法執行了
2. 解釋型語言
對於類似 Python 這樣的解釋型語言,程式碼並不會被事先編譯成機器指令
而是在執行的過程中,由 Python 虛擬機器(也叫做直譯器)逐條取出程式中的程式碼,編譯成機器指令,交由 CPU 執行
完成之後,再取出下一條程式碼,重複上述的編譯、執行過程
這種一邊編譯一邊執行的過程,叫做解釋執行
解釋型語言相對於編譯型語言,執行速度會慢一些
因為程式是在執行的過程中一邊編譯一邊執行的,所以,程式整體的執行時間包含了程式編譯的時間
不過,使用解釋性語言編寫的程式碼,可移植性更好
程式在執行的過程中,虛擬機器可以根據當前所在機器的 CPU 型別和作業系統型別,翻譯成不同的 CPU 指令
這樣,同一份程式碼就可以執行在不同型別的機器和不同型別的作業系統上,這就是常聽到的 "一次編寫,到處執行"
3. 混合型語言
Java 語言比較特殊,它屬於混合型語言,既包含編譯執行也包含解釋執行
Java 編譯器會先將程式碼(.java檔案)編譯成位元組碼(.class檔案)而非機器碼
位元組碼算是 Java 程式碼的一種中間狀態,其跟平臺無關,但又可以快速地被翻譯成機器碼
編譯之後的位元組碼在執行時,仍然是解釋執行的,也就是逐行讀出位元組碼,然後翻譯成機器碼,再交給 CPU 執行
只不過,從位元組碼到機器碼的翻譯過程,比從高階語言到機器碼的翻譯過程,耗時要少
這樣既保證了 Java 程式碼的可移植性(同一份程式碼可以執行在不同的 CPU 和作業系統上),又避免瞭解釋執行效率低的問題
實際上,在解釋執行時,也存在編譯執行
Java 虛擬機器會將熱點位元組碼(反覆多次執行的程式碼,類似快取中的熱點資料)編譯成機器碼快取起來,以供反覆執行
這樣就避免了熱點位元組碼反覆編譯,進一步節省了解釋執行的時間
這就是著名的 JIT 編譯(Just In Time Compile,即時編譯)
參考資料:
程式碼是如何被執行的 - lidongdongdong~ - 部落格園 (cnblogs.com)