NET 6.0引入了Crossgen工具的後續版本Crossgen2,這個工具提供了程式提前(AOT)編譯的能力。
什麼是CrossGen?
我們日常開發時使用C#編譯器CSC編譯一個.NET程式集,程式集包含MSIL程式碼(中間語言程式碼)。當應用程式執行時,目標環境的本地JIT編譯器將MSIL程式碼轉換為本機程式碼,然後CPU才能執行它們。
但是這種JIT編譯到導致應用程式啟動很慢,因為JIT編譯器必須花時間翻譯程式碼。
為了實現更快地啟動應用程式,CoreCLR包含了一個名為CrossGen的工具,它可以將MSIL程式碼預編譯成本機程式碼。
其實最早可以追溯到.NET ngen技術,Ngen.exe (Native Image Generator)
然後,.NET 6設計引入Crossgen2有兩大目標:
- 提高crossgen開發的效率
- 並實現crossgen目前無法實現的一系列功能。
這種轉換有點類似於本機程式碼csc.exe升級演進為基於Roslyn的託管程式碼編譯器。這種過程。
Crossgen2是用C#編寫的,但是它沒有像Roslyn那樣公開一個功能全面的API,可以程式設計靈活使用。
接下來簡單瞭解一下關於Crossgen2的幾個主要問題:
一、Crossgen2的用途是什麼,什麼時候應該使用它
Crossgen 是一個為程式碼提供提前 (AOT) 編譯的工具,從而減少了執行時對 JIT的效能消耗。
釋出應用程式時,Crossgen 對所有程式集執行 JIT,並將 JIT 程式碼儲存在一個額外的部分中,該部分可以在執行時快速獲取。
Crossgen 應該用在快速啟動的應用場景中。
二、Crossgen2跨平臺編譯原理是什麼?
Crossgen2支援跨作業系統和體系結構的交叉編譯能力。未來使用一臺構建伺服器就可以為所有目標環境生成本機程式碼Native Code,直接執行,提升第一次訪問的效能和速度。
內部實現上,在Arm64上,Crossgen2可以使用編譯為Arm64的x64 RyuJIT生成x64程式碼。類似的方式還有x64架構下生產x64程式碼。Crossgen2載入為該配置構建的RyuJIT。
三、用 C# 編寫 Crossgen 的主要優點和缺點是什麼
用 C# 編寫,可以訪問一組豐富的 .NET API 以及使用託管語言提供的記憶體安全保證。
使用 C# 的一個缺點是同時在許多小型程式集上使用 Crossgen2 時會增加處理時間,因為多次啟動執行時會產生開銷。幸運的是可以通過在自身上執行 Crossgen2 來緩解大部分問題!
四、Crossgen2的設計過程
Crossgen2 也不是簡單的託管重寫。該架構使用圖表來驅動分析和編譯。這允許掃描器、優化器、分析器處理、分析、表示正在編譯的程式集。這個專案已經進行了 2 年——Crossgen2 編譯器的起源始於 2016 年左右的一個研究專案。
展望未來,crossgen2 將給我們提供更多選擇,為平臺和程式碼做出更高效能的選擇。讓我們持續關注。
周國慶
2022/3/28