首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/po1Eiy9vERsOUtHEyxtg
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券