掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

.NET未来路在何方?

文章来自公众号:聊聊架构

.NET生态系统在过去的一年中发生了很多变化,特别是在Xamari、UWP、.NET Core、.NET native、F#和开源等几个方面发展非常迅速。如果你只是关注技术细节,那可能你根本无法理解微软的战略意图,也肯定对.NET的未来一脸茫然。因为现在.NET在每个方面都有新的动作:跨平台、云、移动、Web应用和通用应用。开发人员必须知道这一切会造成什么样的变化,对行业和生态将会有什么样的影响。

为了了解.NET的发展,InfoQ采访了Microsoft .NET团队首席项目经理Richard Lander、Microsoft .NET团队项目经理Phillip Carter、GitHub工程总监Phil Haack、Microsoft杰出工程师Miguel de Icaza。

.NET的挑战以及未来

Richard Lander:通过观察目前广泛支持.NET的设备和操作系统,还有最近的.NET Core,你就可以展望到.NET的未来。你可以使用.NET构建任何类型的应用程序,包括移动、Web、桌面以及IoT。有趣的是,.NET在很小一组开发平台上,但可以在许多平台上运行,具有很高的生产力和不断发展的语言、工具和企业支持。总之,这就是我们对NET的观点。

选择开源.NET Core对.NET产生了巨大的影响。我们看到大量的开源开发者参与到.NET Core和相关项目中来,.NET相关活动在GitHub也快速上升。许多企业对.NET的重大兴趣和认真参与也让我们感到非常惊讶。一些大的公司也加入了.NET基金会,比如说Samsung和Google。我们很高兴能看到其他很多企业表态:“.NET对我们的业务非常重要,我们需要更多参与到其中”。我们将会继续开放和协作,采取更多方式来提升.NET。

2016年,Visual Studio for Mac的推出是很大的惊喜。它包括Xamarin和ASP.NET Core的工具。Visual Studio for Mac这款产品也表明了Microsoft的态度,就是我们正在认真促进跨平台开发。我们还有Windows、Mac和Linux平台的免费工具可以选择,因此想要开始使用.NET非常简单。

遇到的挑战是想要让人们意识到.NET不仅仅只是属于Windows平台下的,它已然变为了你下一个项目可以使用的值得信赖的跨平台开发选择。我们在过去几年内做了一些巨大的改变,比如获取Xamarin,开源.NET Core并搭建跨平台工具支持。我们还有很多工作要做,才能让人们对产品产生兴趣,这是前进的关键点。

Philip Carter:对于.NET来说,现在最大的焦点莫过于.NET Standard Library 2.0和尽可能多使用容器技术(例如Docker)的经验。.NET Standard Library 2.0成就了绝大多数跨平台.NET APIs,并为开发人员刨根知底他们所编写的代码提供了一种简单的方法。如果你依赖的唯一.NET APIs来自.NET Standard Library,那可以确保在.NET运行时你的代码能够在任何地方运行,而你不需要付出额外的工作。同理NuGet包也是一样的,如果你的系统依赖于.NET Standard Library,它可以在任何其他地方运行。从代码共享的角度来看这是非常重要的,甚至它对于长期的灵活性也非常重要。需要目标Linux?你所有使用.NET Standard Library的代码都在那里运行。我们也非常重视容器,希望你能非常容易地将代码部署到容器,因此我们正在构建工具来实现这一点。

对于.NET语言,我们正在努力为我们的语言创造开箱即用的工具。在即将发布的Visual Studio中我们提供了一些具有生产力的功能,在未来我们也会构建更多的工具。在语言功能方面,C#和Visual Basic将着重于继续添加F#中已有的函数式编程功能,比如基于表达式的模式匹配和记录以及可区分联合类型。不可空性也是我们感兴趣的一个重大领域。F#可能更关注于更好的IDE工具,它已经具备了前面提到的这些功能,但是缺乏与C#和Visual Basic一样的质量工具体验。总之,会有更多功能来辅助函数式编程,并为每种语言创建更好的工具。

面临的最大挑战在于发布上述提到的有质量保证、可支持的软件需要耗费的大量工作。

Phil Haack:C#正朝着一个伟大的方向发展。目前其设计在GitHub上开放,社区可以跟进并为其发展做出贡献。它添加了很多灵感来源于函数式编程的功能,这让写代码变得更加愉悦。F#仍然是奇妙的函数式语言,它为C#很多功能激发了灵感,但似乎很难跻身主流语言行列。

.NET正在努力成长为跨平台开发的强劲选择,但在保持相对性和增长方面仍然面临着挑战。虽然C#开发人员非常紧缺,但在学校、bootcamps和code academies中教C#的比例与Node和JavaScript相比少了太多。虽然.NET生态系统很强大且在不断增长,但它还是非常依赖于Microsoft。很少有大的公司为其OSS项目做出贡献。NPM包数远多于NuGet。扩大独立的社区非常重要。

另一挑战是现在Web的通用语言是JavaScript。因此,在成为跨平台语言方面,Node和JavaScript有着巨大的吸引力,而C#比较少见于构建Web应用程序。这也就解释了Electron这样的平台的吸引力,它可以让你把你已经拥有的许多Web开发技能带入到本地应用程序开发中来。因此C#和F#还需要做一些努力来超过其他的语言(JS在前,C#在后)。

Miguel de Icaza:.NET延续了它在第一次推出时就确定的一个传统。它是一款不断根据开发人员需求发展的框架,它一直拥有强大的互操作性并努力在实现生产力的同时确保性能。

今天,.NET几乎可以在所有可用的平台上使用:从服务器、台式机到移动设备、游戏机、虚拟现实、增强现实环境、手表,甚至是像Raspberri-Pi等类似的小型嵌入式系统。

整个框架以一种最开放的方式开源了代码,这也增加了成为未来Unix系统的核心组件到业界制造的新型秘密设备的可能。

实现生产力并确保性能对我来说非常重要,因为我从2000年开始使用.NET,那时候计算机只有现如今计算机的一小部分功能,但是.NET已经提供了高性能运行,可以帮助开发人员创造出健壮的软件。这是通过保证安全的编程环境,通过设计避免常见的编程错误实现的。

这种实现已经被证明非常有用。我们需要随身携带便携式电脑,尤其是对于游戏开发人员来说,便携的电脑非常重要。开发人员仍然希望在小部分时间内,在没有高端计算机等设备的情况下创造出健壮的软件。

至于挑战,这部分非常有趣,我想分享关于一开始概要中提到的框架的发展历程的例子。

就像我所说的,.NET的一个文化优势是根据市场的需求不断调整框架。从需要在本地完成的任务(比如运行环境优化)到分布式级(更高级的框架)。

在过去的几年中,我们不得不缩小框架来适应性能不足的设备,我们创造了智能链接器,将更智能的代码生成并创造映射到新的硬件的APIs上。

这种趋势一直持续了下去。举个例子,过去一年的重点任务就是完善.NET,支持开发高性能服务器和客户端代码的新型用户。这需要引入新的类型、原语和堆栈中的编译器优化。另一方面,现在.NET的开发人员可以使用Microsoft创造的技术(Orleans、ServiceFabric)或是社区创造的技术(MBrace)来创建分布式系统。

在互操作性领域我们一直在各个方面开展工作。我们正在努力让.NET程序员可以更简单地利用其他框架和语言写的代码,简化了在其他语言中使用.NET代码(我们已经支持第一类C、C++、Java和Objective-C),并简化了利用Azure AutoRest等工具与其他服务进行网络通信的过程。

新一代编译器 Roslyn

Richard Lander:.NET运行环境存放语言(比如C#/ F# / VB .NET)和Roslyn,将其模型(大多是垃圾收集和类型安全的内存)展示给开发人员。所以,缺少的是C++(其他同行忽略不计)。.NET运行环境团队用C++编写,Roslyn就可以存在,你就可以使用C#。他们真的非常宽容!

csc.exe(原来Roslyn C#编译器)也是用C++编写的,所以同样的情况也适用于那里。

事实证明,编写平台原生组件的开发人员更喜欢C#。第一次这么听说是吗?他们正在积极地寻求用C#完成更多工作,并将更多的代码库转换为C#。这是过度简化,但你可以将Roslyn仅仅认为是用C#重写csc.exe的一个项目。同时,用C#重写运行环境组件也同样重要。由于有引导问题,用C#重写运行环境组件需要付出很多努力,但它是值得的。

C#代码库和C++相比有很多优势,原因如下:

  • 它大大增加了可以参与到代码库贡献中来的开发人员的基数。

  • 我们有非常优秀的C#工具,可以让开发变得更为高效。

  • 可以直接让.NET库运行在其他芯片和操作系统上。这对于在像Raspberry Pi上开发.NET Core这样的代码库是很好的。

  • 更容易了解安全问题。

因此在我看来,最主要的事情就是将现有的C++代码库转移到C#上。它使我们变得更加高效,让更多.NET开发人员可以更方便地了解和操作基础平台。

Philip Carter:Roslyn对我们发展.NET非常关键,它帮助我们Microsoft构建更好的工具,并为开发人员提供了一个新的平台在语义上深入理解其代码库,以构建新的一组工具。

从语言开发者的角度来看,Roslyn的直接好处之一是现代化的架构,可以添加新的语言功能,比以前C#和Visual Basic的编译器更为容易。Roslyn还推出了Roslyn Workspaces,这是一个跨平台编辑器抽象层。现在用于Visual Studio和Visual Studio Code(通过OmniSharp),可以更轻松地利用各种语言服务。此外,F# 4.1将成为第一个使用Roslyn Workspaces和自己的语言服务的F#版本,改进了大量IDE工具并引入了新的功能。我们可以将F#视为市场上唯一一款有高质量、一流的IDE工具的函数式编程语言,它一定有助于.NET的发展。Roslyn Workspaces可以帮助我们为所有.NET语言提供更好的语言特性。

Roslyn Analyzers通过提供一组APIs,让你为C#和VB代码库构建一组自定义工具,促进.NET的发展。第一个改进是让人们可以更容易地构建强大的静态分析工具,但是你可以进一步使用像语义diff工具或其他需要了解你代码语义结构的东西。先于Roslyn出现,但是它实际上只适用于常使用静态分析工具的人。有了Roslyn Analyzers之后,这方面的开发现在由任何.NET开发人员完成。

Phil Haack:在Roslyn之前,实现代码分析器的想法仅限于少数深入了解深奥原理的人。它的出现可以大众化地提升编译器,也为参与语言设计的人们铺平了道路。一方面提出了新的语言功能,另一方面也可以让其他人尝试它,并听取他们的想法。

Miguel de Icaza:Roslyn帮助统一了我们所有支持的平台上的C#使用体验:Visual Studio、VSCode和Xamarin Studio,还有新的开发技术,可以轻松地编写活动代码,并在iPad上使用Xamarin Workbooks或是Continuous尝试活动代码。

关于工具,开发人员不得不依靠未成熟创建的语言或是黑客。在C#世界中不必再这样做,因为我们现在有了新的方法,开发人员可以完全掌握C#程序,操纵它并用完全相同的方式探索其语言世界。

F#较为独立,它结合了.NET世界和函数式编程。这是一种总能引领潮流并非常适用于数据处理的语言。在这个对于机器学习兴趣异常高涨的时候,F#正是解决问题的良方。

如何更好使用.NET平台?

Richard Lander:2017年我们的主要目标是减少你需要跟上的事情的数量。最初,我们的设计是希望.NET Core与其他的.NET平台能有显著的不同。后来,我们就推翻了这些决定,在Visual Studio 2017版本中让.NET Core与其他的.NET更为相似,在该版本中你会发现.NET Core和.NET Framework以及Xamarin一样,转为使用msbuild构建引擎。这样的改变能帮助.NET mobile和Web项目协同工作的体验变得更加简单。

我们还标准化了所有.NET平台都有的最小APIs集,称之为“.NET Standard”。我们将在2017年推出.NET Standard 2.0,并提供它的各种实现。这是我们曾定义且发布过的最大一组常用APIs。它比最大的Portable Class Library profile还要大两倍。一旦.NET Standard 2.0在所有.NET平台实现,很多事情会变得更容易。许多人都期待它的发布,这是改变游戏规则的标准。

Philip Carter:这个问题问得很好,特别是在我们这么多年以来搭建了这么多东西的情况下。这是我喜欢的框架方式:

.NET是跨平台的开发栈。它有一个标准库,称为.NET Standard Library,其中包含了大量的APIs。这个标准库由各种.NET运行环境实现:.NET Framework、.NET Core和Xamarin-flavored Mono。

.NET Framework就是现有的开发人员一直使用的.NET Framework。它实现了.NET Standard Library,就是说任何仅依赖于.NET Standard Library的代码都可以在.NET Framework上运行。它包含了其他Windows专用的APIs,比如说用于Windows桌面开发的APIs如Windows Forms和WPF。.NET Framework针对构建Windows桌面应用程序进行了优化。

.NET Core是针对服务器工作负载优化的新的跨平台运行环境。它实现了.NET Standard Library,就是说任何使用.NET Standard Library的代码都可以在.NET Core上运行。该运行环境适合新的Web开发栈ASP.NET Core使用。它是现代的、高效的并为处理大规模的服务器和云工作负载设计的。

Xamarin-flavored Mono是Xamarin应用程序的运行环境。它实现了.NET Standard Library,就是说任何仅依赖于.NET Standard Library的代码都可以在Xamarin应用程序上运行。它包含了其他iOS、Android、Xamarin.Forms和Xamarin.Mac使用的APIs。它针对在iOS和Android上构建移动应用程序进行了优化。

此外,从即将发布的Visual Studio版本开始,运行环境中的工具和语言都将变得很常见。当你创建任何类型的.NET项目时,你将使用新的,但是已经由.NET开发人员使用过多年的兼容的项目系统。MSBuild用于构建项目,这就是说现有的构建系统可以用于任何新的代码,任何.NETStandard或.NET Core代码可以与现有的.NET Framework代码一起使用。所有.NET语言在每个运行环境中都会用相同的方式编译和运行。

什么应该用于你的新项目呢?这取决于你的需求。Windows桌面应用程序?请使用.NET Framework,就像你之前一直做的一样。服务器或Web应用程序?请使用ASP.NET Core,运行在.NET Core上。移动应用程序?请使用Xamarin。类库和NuGet包?请使用.NET StandardLibrary。使用标准库对于在你的所有应用程序中共享代码非常重要。

要想跟上的最好方法就是阅读官方的.NET文档。官方的.NET博客也有很多有关这些问题的帖子,但请注意,以前的帖子并不能准确描述最新的.NET发展。

Phil Haack:我倾向于比较保守。对于我的业务依赖的生产项目,我将使用经过试验的、真正的官方.NET平台。但对于我的下一个项目,我一定会使用.NET Core,它没有十多年向后兼容性的需求。

Miguel de Icaza:多亏有.NET Standard,特别是我们在.NET Standard 2.0中交付的APIs,开发人员不需要太多地考虑哪个运行环境来运行他们的应用程序。跟上.NET的人可能有兴趣了解我们为某些特定用例优化的运行环境(例如说,为移动应用和游戏优化的Mono),但是在极大多数程度上,开发人员只需要知道,无论他们有什么需求,我们都已经为他们满足了。

当谈论到选择运行环境的问题,选择方式应该是这样的:

  • .NET Framework是以Windows为中心的框架,为Windows开发人员提供最好的服务。如果你正在搭建Windows为中心的应用程序,请你选择它。

  • .NET Core是云优化引擎,它是跨平台的。它使用相同的高性能JIT编译器,但在所有支持的操作系统(Windows、Linux、macOS)上运行代码。它没有特定的Windows APIs,因为这有悖于跨平台的目标。

  • Mono是用于移动应用和Apple平台(Android、iOS、watchOS、tvOS)的运行环境,用于游戏控制器和Unix桌面应用程序。

喜欢其他语言的什么特性

Richard Lander:我喜欢JavaScript(以及其他类似JavaScript的语言)的一点是,你可以直接在文件中开始写代码,即使是一行代码也可以运行。没有什么复杂的流程,也没有具体的概念要(提前)学习,这很有价值。有一些C#脚本解决方案也是这样的,但它们没有很好地集成。我们的一些语言功能也在朝这个方向努力,但还没有做得这么好。我想如果能有个单行C#文件,作为"Hello World" Web API,那就太棒了。

作为处理运行环境的人,我想把问题再次引回运行环境上。比如说我喜欢JavaScript和PHP,因为它们可以从源代码快速读取并执行。我也喜欢Go,因为它生成可执行的本地单个文件。.NET是极少数的可以同时做到这两点的平台之一。我想看到我们为.NET开发人员提供这两种选项,它们在真实场景中非常实用,特别是对于云编程来说这两个选项都很有帮助。

Philip Carter:我们最喜欢C#和Visual Basic的功能之一就是不可空性。其中最大的,经常造成“十亿美元损失的错误”的问题就是空。如果没有在代码库中检查是否为空,那么每个.NET开发人员都要努力寻找错误。可以将类型标记为非空就解决了问题,把空的问题从运行时问题转换为编译时问题。然而,要实现这一点是很大的挑战,因为目前C#和Visual Basic的代码库没有不可空性。因此,这种功能可能需要选择性加入,并且不能破坏现有代码。这在F#中实际上不算很大的问题,因为空性和不可空性已经是这个语言的功能了。然而,当与其他.NET类型互操作时,F#开发人员还要关注空的问题。我们对选择性加入不可空性非常感兴趣。

我们感兴趣的另一组语言功能是能够实现更好的即时多态性,即协议/特性和类型种类。它们可以帮助你扩展现有类型的功能,尤其是更灵活的类型种类,可以帮助你定义某种行为,而无需将其“固定”到某种特定类型上。像任意类型的层次结构的语义等价比现在更为简单。虽然协议/特性和类型种类并不在我们的路线图中,但它们确实非常有趣,并帮助解决了你能碰到的有关.NET语言的一些细微问题。

Miguel de Icaza:我不负责这些语言的发展,但是作为一个用户,我也希望C#和F#能包含这些功能。

对于F#我的要求很简单:从个人来说,我非常依赖于它原来写循环的方式。我希望在循环中支持break和continue。我知道这个要求有点奇怪,但这就是我最想要的功能:-)

对于C#,我希望它能结合更多F#好的想法,特别希望能引入F#中的不可空性。

开源的意义

Richard Lander:.NET的开源调整从2008年发布ASP.NET MVC源代码就开始了,然后开源了Web API和SignalR,到2015年开源完整的.NET Core。到现在为止,超过50%.NET Core的更改来自社区,C# repos的数量每天也在GitHub上增长。和过去相比发生了翻天覆地的变化,并为未来绘制了锦绣的蓝图。

作为开源的维护者,我们在努力做着伟大的工作。我们在几个方面进行了突破:欢迎新加入的人,提供详细的repo文档和指导,设置PRs的高门槛,培养社区领导人并帮助运行项目。我们满足了社区的一些期望,并与社区进行对话,协商他们期望能与众不同的功能。从总体上来说,我觉得社区对于过去几年中.NET Core和其他相关开源项目的发展情况是满意的(在很多情况下是相当满意的)。

.NET生态系统积极健康的开源平台项目是非常有利的,它鼓励更多的人参与到更多的开源项目中来。实际上,它创造的价值是你多年以前难以定论的,但你现在可以非常确定地说.NET是一个开源的生态系统。来自社区、小型企业、大型企业和公众的反馈非常积极。

Philip Carter:我认为向开源的转变给.NET社区带来了巨大的好处。现在.NET社区仍然热衷于开源,也可能会因为突然的过渡而产生波动,但人们已经看到了其中的价值和贡献。即使是在不常与开源开发相关的文档中,我们也看到了全社区参与进来做出的贡献,我们有近100名非Microsoft的贡献者。一名社区成员甚至评审了Microsoft员工在我们自己的存储库中做出的pull请求!我个人感觉.NET社区已经具备了贡献于其开发堆栈的能力,这个发现让我非常激动。当然,这只是开始。当我们在Visual Studio for .NET Standard和.NET Core(这也是开源的)中发布质量工具的时候,期待会有更多.NET开发者能关注进来,并为.NET做出贡献。

Phil Haack:我可能算的不对,但这个活动已经进行了超过一年了。只是在过去一年中达到了最高峰。社区应该也注意到Microsoft想真正加入到开源社区的坚定决心,可能还需要一段时间才能达到目标。毕竟,MS对开源的排斥远远超过一年,但我认为现在的态势是积极的。.NET社区正在以一种前所未有的方式积极参与到.NET未来的建设中。所有新的.NET Core的开发和语言的设计都是在公共的GitHub上完成的,并接受大家的贡献,很高兴能看到这种态势。社区的人们参与度越来越高,而不仅仅是做一名配角进行客串表演。

Miguel de Icaza:这让开源.NET社区和使用.NET的人都感到非常激动。开源框架的好处在于框架是完全开放的,你就可以看到从性能,到内存使用,到提高精确度,到可扩展性等等方面对代码库的贡献。这是一种全面展示的良性循环,因为我们共同建设并培养.NET社区。

tsDDDnp7Pewvx6XHs0ND (1).png

原文来自:聊聊架构

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 营运车判定查询

    输入车牌号码或车架号,判定是否属于营运车辆。

    输入车牌号码或车架号,判定是否属于营运车辆。

  • 名下车辆数量查询

    根据身份证号码/统一社会信用代码查询名下车辆数量。

    根据身份证号码/统一社会信用代码查询名下车辆数量。

  • 车辆理赔情况查询

    根据身份证号码/社会统一信用代码/车架号/车牌号,查询车辆是否有理赔情况。

    根据身份证号码/社会统一信用代码/车架号/车牌号,查询车辆是否有理赔情况。

  • 车辆过户次数查询

    根据身份证号码/社会统一信用代码/车牌号/车架号,查询车辆的过户次数信息。

    根据身份证号码/社会统一信用代码/车牌号/车架号,查询车辆的过户次数信息。

  • 风险人员分值

    根据姓名和身份证查询风险人员分值。

    根据姓名和身份证查询风险人员分值。

0512-88869195
数 据 驱 动 未 来
Data Drives The Future