Dot-Net
為什麼不是到處都有 JIT(及時)編譯器?
我最近了解到 JIT 編譯器用於將平台無關程式碼編譯為本機程式碼。JVM 和 .net 執行時環境使用它,以獲得更好的性能並顯著減少編譯時間。我的問題是,為什麼不將直接編譯為本機程式碼的普通編譯器(如 c 編譯器)也製作為 JIT?如果使用 JIT 編譯器,是否有使用限製或規範?
現代 javascript 實現也執行 JIT,一些 PHP、Python 和 Ruby 實現(至少)也是如此。不過,JIT 的訣竅在於它們是一個相對較新的開發,使它們工作的部分原因是您依賴於最終使用者機器上的某種類型的框架或執行時,它能夠做出正確的該機器和應用程序實例的優化。
對於想要接近電腦“裸機”的語言,依賴那個額外的抽象層並不總是有意義的。
JIT 有優點也有缺點。如果您將軟體部署到許多不同的 PC 上,JIT 會非常有用,因為 JIT 編譯器可以檢測如何針對每個特定平台優化程式碼。
問題在於,JIT 增加了在軟體可以首先執行之前必須採取的另一個步驟:首先必須將其編譯為 IL,然後再編譯為機器程式碼,這意味著額外的性能成本。然而,這種從 IL 到機器程式碼的轉換只需要在軟體第一次執行時完成,因此每次後續呼叫都會快得多。
所以基本上(根據經驗)你可以說:如果軟體是一個長期執行的過程,那麼使用 JIT 通常會很好,如果軟體的生命週期很短,最好使用本機程式碼。