標籤:

如何評價微軟推出的 .NET Native?

cf. Announcing .NET Native Preview

預覽版只支持商店程序,之後擴展到桌面和伺服器


放個傳送門:如何看待 .NET Native,真能達到 C++ 的性能、C# 的生產效率嗎? - RednaxelaFX 的回答


感謝 @韓學森 指出,微軟之前在WP8上已經支持雲編譯了。那是基於Ngen.exe (Native Image Generator)的。這樣的話,可以把.NET Native看成Ngen二代。

我覺得這是個好事,也是趨勢所在。微軟有動力,也有能力把這個事做好。

技術上,.NET Native純粹是個優化。以ART的經驗看,初期可能會有某些應用的兼容性問題,以後就應該只有好處了。

商業上,.NET Native的靜態鏈接,讓微軟可以進一步拉攏應用開發者,給他們提供大量方便易用的開發框架,而不用擔心普通用戶的機器上裝滿了各式各樣的框架,影響體驗了。

Java的出現,讓人們知道了,現在的計算機足夠快,損失一點運行效率,換取開發效率,是有意義的。於是微軟出了.NET,Android也是基於Java的。

iOS的經驗,又告訴我們,編譯到機器碼可以省電,可以提高流暢度,是有意義的。特別是對移動平台,.NET和Java如果用即時編譯,即耗時間又占內存,不能提供足夠好的用戶體驗。於是,微軟先做了Ngen雲編譯又出了這個.NET Native來回應,安卓平台也在4.4版加入了ART。

主要廠商在這方面還是有共識的,大家殊途同歸。

.NET的預編譯Ahead Of Time Compilation/AOT,在開源的Mono里實現了挺長時間了,但是沒有太多關注。

這次微軟的.NET Native有兩個亮點,看起來還是很有希望的推開的。

一個是雲編譯。也就是開發者提交的是虛擬機代碼,用戶直接下載自己的設備可用的機器碼。不像Mono要手動編譯,這對用戶和開發者來說,都很方便。

同樣的策略,微軟之前在WP8上基於Ngen實施過,看起來效果不錯。.NET Native會把它擴大到了所有AppStore應用,讓更多人享受到這個改進。

另一個是,因為速度、空間的限制都不存在了,雲編譯器可以比即時編譯JIT,比ART的安裝時編譯,做更多更好的優化。微軟的Visual C++做了這麼多年,應該有足夠的技術儲備。

NGEN做的是程序和動態庫分別預編譯,運行時綁定。.NET Native的進步在於,編譯時可以把單個框架再拆開,只有用到的部分才靜態鏈接,其他部分就不要了。Microsoft .NET Native FAQ里說,程序編譯出來的大小和NGEN生成的差不多。

因為內存里放的只有框架的一部分,不用整個框架全部載入,佔用的內存比甚至動態鏈接的還少。個人覺得,對WP、Surface這樣內存受限的移動平台來說,這挺好的。

而且把用庫連進來,可以做更多全局優化,比如鏈接時優化Link Time Optimization / LTO了。早期的C/C++編譯器,生成的目標文件、庫文件之間不能做優化處理,後來很多編譯器做了LTO。把小函數調用inline嵌入進來,再做各種窺孔分析局部優化。

看來.NET也要有這種優化了,這對所有平台,不管是伺服器、桌面還是移動系統,都有加速效果。

(考慮到開發者調試的需要,而且企業內的應用程序也不方便雲編譯,.NET Native將來應該也會支持本地編譯,就像Ngen被包含在.NET Framework4.5里一樣)

不僅如此,.NET的版本管理一直都不那麼好。理論上,各個版本應該是向後兼容的,你只要使用最新的版本就可以了。但事實上,版本間的兼容性不能100%保證。為了保證兼容性,安裝新版本.NET的時候,微軟也不會像其他軟體那樣覆蓋舊的版本,而是把所有以前的版本都留著。

如果你運氣好,卸載掉老版本沒有問題,所有的應用都還可以用。但是,誰也不能100%保證。最好的建議就是,都留著,雖然它們占著一些磁碟空間,就讓它們占著吧……

這也限制了微軟,他們發行新版框架的速度不能太快,也不能把太多的功能加到框架里去。普通用戶不會喜歡三天兩頭裝一個龐大的新版框架,只是因為有一兩個應用可能會用到其中某一個功能。

.NET Native的靜態鏈接,能解決這個問題。你下載的執行文件,就包含了所有要用到的功能,不需要另外安裝別的框架支持了。

微軟能給開發者提供更多的支持,更多的開發框架了,也沒有太多向後兼容的壓力了。

挺好的。


  • 再也不需要為了兼容XP而捨棄高版本的.NET Framework了

  • 再也不需要因為.NET Framework安裝包太大而被迫使用低版本的(系統自帶的).NET Framework了
  • 再也不需要為.NET Framework版本間莫名其妙的問題而惱火了(舉個栗子,.NET Framework 4.5.1理論上是直接可以替代.NET Framework 4.0的,但我們的程序在有些機器的4.5.1就是不能跑,卸掉4.5.1並重裝4.0就可以了)
  • 程序的啟動速度會大幅加快,尤其是第一次啟動
  • 程序的運行時性能有望小幅提高——很多涉及到密集的內存分配和數據計算的地方,估計Native並不能幫上多大忙,還是要手動unsafe優化
  • 可以在Managed模式下開發和調試,繼續享受飛一般的編譯速度;Native模式下發布
  • 混淆器可以丟掉了
  • 由於天生的限制,泛型特化估計還是需要在運行時進行,這一點和Mono的AoT一致
  • System.Reflection.Emit該如何工作?所以程序還是要內建一個JIT引擎嗎?


GCJ不是出來好久了么,也沒見多少人感興趣的說……


我覺得以後每個程序都自己靜態鏈接一個WPF也不是一件特別令人開心的事情


性能提高了不少,但目前僅限於Windows Store應用,繼續觀望,期待能走得更遠。


C++時代的謝幕


這是微軟的技術改革的重要一步

這一步要改革整個.NET,確保其在微軟技術體系中的領導地位

此次出.NET Native,這主要是出於性能考慮

當然,出了.NET Native,C#桌面應用也算是原生應用了,這不需要.NET framework,這無疑了提高了C#地位啊,M#都不用了


比價c,c++,java這些語言還是c#用起來最爽.就是平台和框架限制的有點不舒服.這要是放開了.c#的第二春就要來了.大家拭目以待啊.


那些混淆軟體都要消亡了


.net native是微軟華而不實的產品,剛出來眾人歡呼,結果還是很失望的。


Obviously, .NET Native targets only for Windows Store apps, not WPF.

Microsoft"s strategy has already shifted to UWP.

People who wants WPF in Native, just forget about it.


大將無能,累死三軍。現在換將了而已。


沒有現在的統一Windows商店做基礎,根本不太可能直接推廣native這種分機型的優化模式吧。


如果是真的,windows下C/C++搞上層GUI應用的大概要悲劇了吧。

This preview release of .NET Native offers you the performance of C++ with the productivity of C#. .NET Native enables the best of both worlds!


為什麼MS你早不搞,現在才來,等出來也沒啥意義了。沒.Net Runtime 的機器也就是XP,那時XP已經不在了。


AOT是老貨罷了……大家別太激動,真心沒啥…


推薦閱讀:

如何評價 JetBrains 將要推出的跨平台 C# IDE: Rider?
C#的Delegate 為什麼沒在其他主流語言中普及?
請問wpf在設計界面時,是使用blend可視化設計,還是直接編寫xaml代碼呢?
如何看待 .NET Native,真能達到 C++ 的性能、C# 的生產效率嗎?
.Net core現在可以做什麼?未來發展有前景嗎?

TAG:NET | C | C# | NETNative |