關於.NET 6.0 Crossgen2的一些研究

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