編譯器、直譯器、JIT 的差異:比較執行方式
執行原始碼的方式主要有三種。編譯器(預先編譯,AOT)在程式執行前,把整個程式轉換成機器碼。直譯器不產生機器碼檔案,而是一邊執行一邊讀取程式並運作。JIT 編譯器(即時編譯)先以直譯器開始,再於程式執行中,把經常使用的部分編譯成機器碼。許多語言會組合運用這些方式。
| 項目 | 編譯器(AOT) | 直譯器 | JIT 編譯器 |
|---|---|---|---|
| 轉換時機 | 執行前。整個程式變成機器碼 | 執行中。一邊讀取程式,一步一步地執行 | 執行中。把經常使用的程式碼編譯成機器碼 |
| 啟動 | 啟動快(但需要先建置) | 啟動快。不需要建置 | 一開始慢。直到程式碼熱起來(暖機)為止 |
| 執行速度 | 最快,且容易預測 | 最慢。常比編譯後的程式碼慢好幾倍 | 暖機後接近編譯後的速度,利用執行時的資訊,有時還會更快 |
| 可攜性 | 每個平台都需要二進位檔 | 容易移植。只要有直譯器的地方就能執行 | 可攜的位元組碼,加上各平台的執行環境 |
| 錯誤偵測 | 許多錯誤能在編譯時發現 | 有問題的那一行被執行時才會出錯 | 依語言而異 |
| 記憶體使用量 | 執行時的負擔小 | 直譯器本身會常駐於記憶體 | 為了編譯器與已編譯程式碼的快取,需要額外的記憶體 |
| 開發流程 | 編輯、建置、執行 | 編輯後立即執行 | 多半是編輯後執行,或建置成位元組碼 |
| 代表性語言 | C、C++、Rust、Go | 傳統的 Python(CPython)、Ruby、shell 腳本 | Java(HotSpot)、JavaScript(V8)、C#(.NET)、PyPy |
數值為具代表性的大致參考值,會因世代或產品而異。