Ahead-of-time compilation
在計算機科學中,提前編譯(AOT編譯)是編譯更高級編程語言(如C或C ++)或中間代碼(如Java字節碼或.NET Framework通用中間語言(CIL)代碼),轉換為本機(系統相關的)機器代碼,以便生成的二進制文件可以本機執行的行為。
AOT生成機器優化的代碼,就像標准的本機編譯器一樣。不同之處在於AOT將現有虛擬機(VM)的字節碼轉換為機器代碼。
減少運行時開銷
一些具有托管代碼運行時的編程語言可以編譯為中間代碼,使用即時(JIT)編譯。在中間代碼執行時,這簡要地將中間代碼編譯為本機運行的機器代碼,這可能會降低應用程序的性能。提前(AOT)編譯通過在執行之前而不是在執行期間發生而消除了對該步驟的需要。
在有限的情況下,可以提前將動態類型語言編譯為本機機器代碼或其他靜態VM字節碼。例如,Erlang語言的高性能Erlang項目(HiPE)AOT編譯器可以做到這一點,因為先進的靜態類型重建技術和類型推測。
在大多數具有完全AOT編譯的程序和庫的情況下,可以刪除運行時環境的有用部分,從而節省磁盤空間,內存,電池壽命和啟動時間(無JIT預熱階段)等。因此,它可用於嵌入式或移動設備。
性能權衡
AOT編譯器可以執行復雜和高級的代碼優化,在大多數情況下,JITing將被認為成本太高。相反,AOT通常無法在JIT中執行某些優化,如運行時配置文件引導優化(PGO),偽常量傳播或間接虛擬函數內聯。
此外,JIT編譯器可以通過對代碼進行假設來推測性地優化熱代碼。如果推測假設后來證明是錯誤的,則可以對生成的代碼進行去優化。這種操作會降低運行軟件的性能,直到通過自適應優化再次優化代碼。AOT編譯器無法做出這樣的假設,需要在編譯時盡可能多地推斷出信息。它需要求助於不太專業的代碼,因為它無法知道哪種類型將通過方法。些問題可以通過配置文件引導的優化來緩解。但即使在這種情況下,生成的代碼也不能像JIT編譯器那樣動態地適應不斷變化的運行時配置文件。