Categories
程式開發

Mono現狀與未來: 從Xamarin到WebAssembly、Blazor及.NET 5


本文要點:

  • Mono項目始於2001年,是首個面向.NET應用程序的多平台、開源框架的項目。
  • Xamarin和Blazor分別代表了微軟在移動和Web應用程序方面的努力,它們都是基於Mono並由Mono提供支持的。
  • .NET 5為用戶提供了兩種運行時選項:高性能的CoreCLR(用於服務器和桌面應用程序)和輕量級的Mono(用於移動設備和WebAssembly)。
  • 儘管Mono已經是.NET的一部分了,但仍有一些開發工作要致力於改善Mono的運行時性能和垃圾回收器。
  • 現在.NET Core可以與Mono並行安裝了,因此可以一起演進語言和運行時。

去年,微軟發布了它的計劃,其中涉及.NET未來以及.NET 5的路線圖。計劃於今年年底發布下一個主要版本,該版本旨在提供一個基於.NET Core、.NET Framework、Xamarin及Mono最佳部分的多平台、開源框架和運行時。

微軟從2014年開始向.NET開源發展,當時微軟宣布.NET Core即將開源。然而,在此之前,.NET就已經有了一個名為Mono的開源計劃。 Mono項目始於2001年,最初它主要致力於為Linux桌面應用程序建立一個.NET開發平台。第一次正式版本是在2003年發布的,此後該項目逐漸演進為在多個平台和操作系統上支持.NET。

Mono是由Xamarin從2011年開始開發的。自從該公司被微軟收購,並在2016年發布.NET Core 1.0以來,Mono和.NET Core一直在並行開發。根據最新發布的版本,InfoQ採訪了Miguel de Icaza(目前他就職於微軟,是Xamarin的聯合創始人,Mono項目的原作者),討論了Mono的現狀及其在.NET生態系統中的未來,以及Xamarin如何適合這種情況。

InfoQ:從技術上講,.NET Core和Mono之間的主要區別是什麼?

Miguel de Icaza:Mono是基於.NET Framework的,.NET Framework是作為Windows一部分發布的.NET大版本。經過多年的發展,Mono和.NET都可以應用在不同的環境中。在.NET領域中,這最終導致了.NET Core 3(這是所有未來工作和創新的基礎)的發布,而.NET Framework是一個長期維護的版本,它將繼續被修復和調整。但不會有任何重大的創新。

在Mono的世界裡,運行時演進為支持我們所謂的“移動配置文件”,它是API的一個精選子集,適用於平衡用戶需求與降低獨立運行時部署的需求。這是Xamarin .NET努力的基礎,也是最近WebAssembly工作的基礎。

使用.NET的不同場景以及使用它們的環境將開發人員必須使用的API集合分割開了。對於開發人員來說,沒有一種簡單的方法可以發佈在所有平台上都可以工作的庫二進製文件。

創建能夠適用於所有不同環境的二進制庫的願望是創建.NET標準的推動力——一個API的通用界面,可以在所有不同版本的.NET上工作,無論是小型設備、移動系統,還是大型服務器。我們在這裡所採取的方法是提出一套在所有平台上都可以平等使用的API。但這仍然意味著我們要維護庫的不同實現。

讓.NET的所有變體都能夠相互操作的方法就是.NET Standard,.NET Standard的每個新版本中都添加了更多的API,所有運行時都能確保這些API是通用的。當今使用最廣泛的API契約是 .NET Standard 2, .NET Framework、.NET Core、Xamarin和Mono都支持該標準。

新的.NET Standard 2.1版本引入了新的創新功能,但它們僅在Mono、.NET Core和Xamarin上可用,這是首個不被長期受支持的.NET Framework所支持的.NET Standard版本。

InfoQ:考慮到.NET Core的最新成果以及.NET 5的路線圖,Mono在當前狀態的.NET生態系統中地位如何?

de Icaza:簡短的版本是,隨著即將到來的.NET 5,用戶將能夠在所有平台上使用相同的API集合,並且可以選擇運行時(CoreCLR或Mono)和編譯系統(靜態編譯、JIT編譯、分層或解釋)來解決其問題的特定需求。

使用.NET 5,我們統一了類庫的實現,同時為用戶提供了兩種運行時選項。在較高的層次上,在CoreCLR中具有一個高吞吐量、高性能的運行時,還具有一個輕量級(但速度沒有那麼快)的Mono運行時。每個運行時都已針對它們最常使用的工作負載進行了調整:CoreCLR用於服務器和桌面應用程序;Mono用於移動和輕量級應用程序,例如WebAssembly。

同樣在.NET 5中,我們將有一個統一的運行時,它可以在我們支持的所有平台上執行C#或F#代碼。在某些平台上,用戶將能夠選擇他們想要使用的運行時,而在其他平台上,將只有一個運行時可以使用。例如,對於Windows上的桌面應用程序,只有CoreCLR運行時適用,而對於iOS,只有Mono運行時可用。

現在,從歷史上看,Mono具有兩種執行和代碼生成引擎。一種是我們稱之為“mini”的代碼生成器,它可以非常快速地生成本地代碼,但是沒有進行很多優化。為了實現更好的優化,Mono過去一直都依賴LLVM優化編譯器。 LLVM以犧牲編譯時間為代價,產生漂亮的、最優的、完善的代碼。

此外,Mono具有兩種操作模式:一種是運行時在執行時動態生成代碼(我們稱之為JIT編譯),另一種是運行時提前編譯代碼(基本上是靜態編譯)。提前(AOT)編譯系統用於不允許動態代碼生成的平台(例如iOS或視頻遊戲機),或者必須提高啟動性能的平台(低端手機上的某些Android應用)。

Mono可以在純JIT、混合AOT/JIT或AOT模式下運行,具體取決於平台的要求或用戶的需求。因此,通常會使用LLVM提前編譯一些核心庫,例如,在保留用戶代碼可以動態編譯(JIT)的情況下,為這些庫生成最佳的代碼。

需要純AOT的系統有一個缺點,那就是.NET的動態功能不可用(例如,動態實例化類型、使用C# dynamic關鍵字、或動態加載代碼等)。因此,我們著手解決這個問題。

去年,我們在Mono中引入了一個新的執行引擎和模式——一個解釋器。事實證明,該解釋器非常有用,這不僅是因為它能夠帶來動態性(以前缺少動態性),允許我們將一個小的運行時部署到WebAssembly,而且還能夠使我們為用戶帶來一些“Hot ”之類的功能,比如熱加載和熱重啟。

一旦我們擁有三個具有不同配置的引擎,就有必要帶來一個分層編譯系統,該系統允許Mono運行時根據代碼的使用方式動態調整要使用的代碼生成引擎。並使用啟動時間、內存使用率和長期性能。這是一個活躍的研究領域,我們也希望能夠在該領域調整參數、學習或向用戶提供解決方案。

.NET 5的好處在於,.NET 5的所有功能都可以在所有平台上使用,用戶無需調整或更改任何內容。開箱即用的體驗已經配置為全面匹配最佳可能的配置。

InfoQ:Xamarin和Blazor有什麼區別?

de Icaza:Xamarin是我的初創公司,專注於幫助.NET開發人員實現移動化。我們使用Xamarin作為一系列產品的品牌,從開發工具到在線服務都使用該品牌。到目前為止,在線服務已被整合到Azure DevOps中了。

Xamarin開發工具包括原生SDK和Xamarin.Forms。原生SDK允許開發人員瞄準Android和iOS,並使用.NET平台中的所有原生功能。 Xamarin.Forms是一個跨平台的UI工具包,它使開發人員可以一次定義其用戶界面,並將相同的代碼映射成目標平台的本機習慣用法。
Blazor是一種通過C#構建交互式Web應用程序的新方法,它將一些最易於使用和最受歡迎的Web開發模式引入到了.NET。

開發人員可以構建Blazor應用程序,並可以選擇邏輯運行的位置,它可以運行在由ASP.NET提供支持的服務器上,也可以完全運行在客戶端上(為此,我們使用WebAssembly在瀏覽器內部運行一個.NET運行時)。值得注意的是,在WebAssembly上支持.NET的工作,當時是由Xamarin的Mono團隊完成的,但是編程模型完全是由Blazor on WebAssembly開發團隊構思出來的。 Mono只是提供了執行它們代碼的方法。

InfoQ:是否可以將Mono與其他微軟的.NET IDE(Visual Studio、VS Code等)一起使用呢?

de Icaza:當然可以。儘管大多數問題都是在展望.NET 5的未來,但是現在,在移動設備、Xamarin上構建支持.NET的應用程序,或構建針對WebAssembly的Blazor應用程序,Mono都是它們的引擎。這些功能在 Visual Studio和Visual Studio Code也是開箱即用的。

除了微軟官方支持的配置之外,Mono(作為一個開源項目)仍然支持“ .NET Framework”兼容模式,並且可以與Mac上的Visual Studio或Linux上的MonoDevelop一起使用,以構建.NET Framework應用程序。這的確是我業餘時間做的一些工作,比如TensorFlowSharp、TorchSharp(PyTorch for .NET的綁定)和gui.cs(一個用戶界面系統,可用於使用.NET構建文本用戶界面)。

InfoQ:還有一些其他與.NET Core相關的框架,比如EF Core、ASP.NET Core等。這些框架是否與Mono兼容呢?

de Icaza:使用.NET 5,它們都是受支持的。在.NET 5之前,像ASP.NET Core之類的東西無法與Mono一起使用,這主要受限於與它相關的工具,而不是受限於運行時。

例如,EF Core是面向移動應用程序用戶最喜歡的工具,它利用了.NET Standard,可以在Mono上開箱即用。

InfoQ:.NET生態系統中,Mono的未來是什麼?

de Icaza:現在,它已經從獨立工作中畢業,逐步發展成為了整個.NET的一部分。現在.NET將會有一個單一發行版,該發行版會針對我們多年來積累的每個平台。我對開源社區多年來的支持工作感到非常自豪,也對我們團隊持續集成這些VM的工作感到自豪。

現在出現了一些引人入勝的發展。例如,就在今天,在使用本地配置運行TechEmpower基準測試時,我看到使用靜態編譯和LLVM的Mono,現在可以與CoreCLR的性能相匹配了。

這對於Mono來說是一個重要的里程碑,因為當我們開始這項工作時,Mono離我們的目標還很遠,甚至不在同一個球場上。但是,我們開始研究是什麼導致了Mono的性能下降,分析並測量,直到我們找到了大多數的罪魁禍首,然後我們才到達這個位置。

Mono歷來都有一個精確的垃圾回收器,該垃圾回收器輕量、高效, 適用於移動設備,但是對於這些擁有許多CPU和大型內存子系統的新計算機而言,它的擴展性卻不佳。因此,我們現在有了一個使用CoreCLR GC的Mono的原型,這是一個針對Mono本身可高度擴展的GC。我希望我們將來能夠為用戶提供GC選項。

除此之外,世界看起來越來越像一個統一的VM,開箱即用地支持C#和F#,這是擺在我們面前最令人興奮的工作。

到目前為止,將我們的語言和運行時一起演進是很困難的,因為演進運行時需要演進世界上每台Windows計算機上附帶的運行時。為了避免回歸共享框架(由許多用戶共享),許多風險緩解流程已經就位,並且這些流程阻止了一體化進程中的大膽變革。

現在 .NET Core可以並行安裝了,並且可以按照用戶需要的頻率進行升級,我們有了千載難逢的機會來共同演進語言和運行時,而且你已經可以看到其中的一些東西了。一些功能,例如接口中的默認方法實現,以及對整個類庫進行改造以使其可為空引用,這是最近的一些開發,但是還有更多的功能有待開發,因此還會有很多機會將被解鎖。

受訪者簡介:

Miguel de Icaza是一位微軟的傑出工程師,專注於移動平台,他團隊的目標是創建令人愉悅的開發人員工具。他與Nat Friedman於2011年共同創立了Xamarin,於1999年共同創立了Ximian。在此之前,Miguel在1997年與人共同創立了GNOME項目,並且自2001年Mono項目創建以來,他一直擔任該項目的負責人,包括在Novell發行的多個Mono版本。 Miguel曾榮獲1999年自由軟件基金會自由軟件獎、1999年MIT年度技術評論創新者獎,並於2000年9月被《時代》雜誌評選為新世紀100名創新者之一。

原文鏈接:

Mono: From Xamarin to WebAssembly, Blazor, and .NET 5 – Q&A with Miguel de Icaza