.NET 的 Native AOT 現在是什麼樣的?

张善友發表於2024-09-15


今天要寫的這篇文章源自昨天在朋友圈發的文章《UWP 透過 .NET 9 和Native AOT 的支援實現 UWP 應用的現代化》[1],一位小夥伴的對話讓我想全面梳理下Native AOT的現在的進展。

image

.NET 9 的 Native AOT(Ahead-of-Time Compilation)是微軟在.NET 9版本中重點發展的一項技術,旨在提升應用程式的效能。Native AOT 技術可以將.NET 程式碼預先編譯為原生代碼,從而實現更快的啟動時間和更高的執行效率。

在.NET 9中,微軟已經將Native AOT作為提升效能的關鍵點之一[2]。此外,微軟還宣佈了對通用Windows平臺(UWP)的初步支援,允許開發者使用.NET 9和Native AOT技術來現代化改造現有的UWP應用。這一舉措為UWP開發者提供了一條升級路徑,使他們能夠利用最新的.NET和Native AOT技術來改進其應用程式。 .NET 9的Native AOT不僅限於UWP平臺,它還支援老舊的Windows 7和XP環境,這標誌著AOT技術在相容性方面的突破。然而,對於Android平臺的Native AOT支援,目前尚未完成,尤其是JNI(Java Native Interface)支援,這被認為是一個較大的功能需求,還有WPF/Winform 的Native AOT支援也需要在.NET 10 才能夠完成。

.NET 的Native AOT技術透過在編譯階段對程式碼進行最佳化,使得生成的可執行檔案更小且啟動速度更快。這一突破性功能不僅實現了對老舊Windows 7和Windows XP環境的支援,還為效能要求高且依賴舊版系統的開發者提供了新的可能性。具體來說,.NET 9版本中,為了確保向下相容性,X86架構下的AOT(Ahead-of-Time)編譯器的支援擴充套件,.NET 9採用了精心設計的編譯策略,確保了對Win7及XP API的相容性,使程式碼能夠無縫執行,允許開發人員將應用程式在編譯階段就最佳化為能夠在老舊的Windows系統上執行。LoongArch架構和Risc-V架構下的AOT 編譯器支援,社群也在繼續完善之中。

在.NET 9中,對Native AOT(按需編譯)支援和JNI(Java Native Interface)的支援有以下具體進展:

  • 在.NET 9中,引入了兩個新的屬性,允許開發者設計功能開關。這些功能開關可以在.NET庫(以及你自己)中使用來切換某些功能區域。如果一個功能不被支援,在裁剪或使用Native AOT進行編譯時,將移除那些不受支援且不必要的功能,從而減小應用程式的大小。
  • 在.NET MAUI的測試中,透過呼叫JNI來獲取Java陣列元素的效能比使用string.Split和新的Span方法更差。這表明開發者正在考慮如何在未來版本中最佳化這一過程。
  • .NET 9在Android平臺上對Native AOT的支援主要體現在透過新屬性實現的功能開關,以及透過Native AOT減少應用大小的能力。

對於開發者而言,學習和採用.NET 9的Native AOT技術需要具備以下前置知識或技能:

  1. 對.NET平臺的理解:首先,開發者需要對.NET平臺有基本的瞭解,包括其架構、執行時環境以及如何在不同平臺上部署應用。這有助於理解Native AOT技術如何與現有.NET生態系統整合。

  2. 熟悉C#或F#程式語言:由於.NET 9支援透過C#或F#進行開發,因此掌握這些程式語言是必要的。此外,瞭解這些語言的高階特性將有助於更有效地利用Native AOT帶來的效能優勢。

  3. 瞭解編譯器原理:Native AOT(Native Application Optimized Translation)是一種預編譯技術,它允許開發者直接生成機器碼而不是依賴JIT(即時編譯)。因此,對編譯器的工作原理有一定的瞭解可以幫助開發者更好地理解和使用Native AOT技術[3]。

  4. 效能最佳化經驗:由於Native AOT旨在提供可預測的效能並減少資源消耗,因此具備一定的效能最佳化經驗是有益的。這包括對記憶體管理、程式碼最佳化等方面的深入瞭解。

  5. 雲原生和微服務架構知識:雖然不是必須的,但瞭解雲原生應用和微服務架構的相關知識可以增強開發者在使用.NET 9時構建高效、可擴充套件的應用的能力。這是因為.NET 9特別強調了在這些架構中的效能表現,參見.NET 9 RC1釋出[4]。

相關連結:

  • [1]UWP 透過 .NET 9 和Native AOT 的支援實現 UWP 應用的現代化:https://mp.weixin.qq.com/s/lCgDOeaTuwmGagZWZG2AmQ
  • [2]在.NET 9中,微軟已經將Native AOT作為提升效能的關鍵點之一: https://www.cnblogs.com/shanyou/p/18015105
  • [3]Native AOT技術指南: https://www.cnblogs.com/hez2010/p/17999838/guidance-for-dotnet-nativeaot
  • [4].NET 9 RC1釋出: https://mp.weixin.qq.com/s/WabCosc39FlI3Wrylf7CbQ

相關文章