C# 有多需要aot ?
最近看到.net7的 aot計划之后又去網上看了下相關的文章發現.net C#其實並不需要aot,原因主要有以下幾點:
-
.net生態至20年前誕生以來桌面端就一直沒成功過,在瀕臨死亡之前可以說全靠傍上web生態起死回生的,我們知道.net core 戰略從一點一點扣性能做起的,通過asp.net 做為發力點,挽救了.net 並因此將.net framework拋棄,給.net C#帶來了新生機,而一直失敗一直拖累的一系列技術,什么 webform, wcf,winform,wpf,silverlight,xna wwf(wf),uwp,winfone... 等卻還不死心,變着面目不斷表演就象一個個的小丑十分可惡,這不又折騰出什么maui,blazor這些不倫不類的東西。
-
jit 十分重要,連當下最火的web assembly 都是走的jit路線為什么不直接到可執行文件呢? 原因很簡單,得跨平台呀,跨平台的意思主要是指針對不同設備,os 和指令集而適配的東西,以后物聯網發展起來以后,可以想見只會有更多的平台和設備接入到互聯網的,有那么多不同的設備和平台,如果直接編譯成可執行文件的話就失去了通用性,這是最大的原因,只有象微軟這樣的超大公司才可以做好這塊,才可以做好跨平台,因為平台不同所以有各自不同的指令要求,一般小公司做不了,光靠社區也比較缺乏穩定性和可靠性。沒有jit就意味着你需要把你的源代碼針對不同的平台,不同的版本進行編譯,光這項工作還不把開發者累死?
-
C#是有gc語言,是嚴重的.net依賴也就是庫依賴語言,光從這兩點分析就知道根本就該死了用它去寫桌面程序的心,還想到處分發方便,這是對C#最大的誤用!從C#這兩個特性可知道,C#根本不適合被編譯成非jit的指令集,那樣不僅是難度及大,而且也並不能提升C#的運行速度,最多只是啟動快一點罷了。
-
有jit的好處,就是有runtime 有gc 這樣對服務端長時間運行的程序來說,可以自動管理內存碎片,而這些優點是c,c++所不具備的,所以有文章上說,對於長時間運行的程序來說,隨着時間的增加內存碎片的增長,沒有runtime,jit,gc對內存管理的程序就會變慢,所以這是個優勢。
綜上所述所以我認為,aot 對於C#來說 並不重要,而且並不能因為aot優化后就去除jit, runtime,gc這些特征,C#的長處在於它的服務端跨平台特性。
最后我想給微軟建議與其搞什么blazor不如老老實實想想看能不能搞個最簡wasm 的runtime 不要加那些mvvm的東西 如果這個最簡平台可以尺寸在200k左右我認為還是有市場的,總不至於寫個hello world 就要2m吧 然后 這個200k的 wasm runtime 可以把gc管理交給wasm,畢竟wasm有gc 開啟選項,這樣一來,C#代碼就可以直接給前端寫東西提供給前端用了,但是僅管如此,C#的性能仍然要低於rust,這是因為就算有一個runtime 只有200k,那么它仍然要面臨二次jit,一次是 runtime il => wasm,然后 wasm=> 到機器碼執行,是這樣的嗎?這點我也不清楚,歡迎知道的朋友 指正!