认识 .Net 2015

Beth Massi - Microsoft

去年的BUILD大会后,我发表了Exciting Times for .NET并且自那时起,我有幸与.Net团队更近距离的工作,其中的工作内容包括运行时,框架,语言以及编译器方面。尽管在过去的一年中,我所关注的大部分集中在内部团队,例如帮助我们领域的雇员开内部讨论会。我也帮助.NET Foundation 起步并且学习了很多关于开源社区和我们.NET Foundation projects 的东西。噢,对了,我也结婚了。J 对我来说这是一个过渡期。更大程度上的从团队的 ”传教士” 到团队的 ”促进者” 或者 ”承接者”。 我非常喜欢 Alex Hillman 的术语:小丑

我们正临近下一次Build大会, 对于我们目前已经取得的进展我感到十分的兴奋,尤其围绕.Net平台本身,以及项目开源的方法。 大量关于.Net的创新正在进行,所以我想我得要写一篇高级的”指导”风格的博客来帮助人们理解主要的部分、在什么地方,用何种方式去使用它们。换句话说,这应该是学习.Net 2015的一个好的开始,至少这是我所希望的。

.NET 2015 – 鸟 瞰 图

这是“.Net 2015” 伞状图的主要组成部分。

值得注意的是,.NET Core有三个关键研究领域影响了主要组件的开发。

1. .Net 创新 – 带着这个平台前进并且创新。我们使每一层都更现代化,

包括语言、编译器、基本类库、app模型、运行时和工具。

2. 开源 – 带领我们的工程师在这些开源社团的帮助和支持下,促进并建立一个响亮的.Net生态系统。

3. 跨平台- 扩展.Net到Mac和Linux平台。 因为我们的客户在不断增加的环境下操作并使用它。

.Net 2015 的 主要组件

框架和运行时

.Net Framework是一个托管的执行环境,它为运行在其上的应用程序提供了多样的服务。它由两个主要的组件组成:公共语言运行时(CLR),一个执行引擎,用来控制运行应用程序;和.Net框架类库,它提供了一个开发人员可以从他们自己的应用程序调用的可测试并可重复使用的代码库。
.NET Framework 4.6建立在 4.5.2之上并且包含了新的API, 对事件追踪的改善和多个bug的修复。这是我们今天已知最全的.Net Framework的下个版本。.Net Framework 4.6 将会被包含在Windows 10中,并且也会在之前版本的windows更新中推送(Vista及以上版本)。
参见: .NET Framework 2015 Preview

.NET Core 5是一个通用的模块化框架,可以在多种应用程序模型和平台下使用,是可用的开源框架,可以被模块化以及本地化地(并行)部署,并且将会被微软的Windows,Linux和 Mac XOS所支持。它是一个包含了新JIT编译器,.NET垃圾回收,本地互操作和许多其他.NET运行时组件的基础类库(corefx)和运行时(coreclr)的重构集。现如今,.Net Core建立并运行在Windows上,我们在接下来的几个月为Linux和Mac特定平台组件添加实现方法。参见: Introducing .NET CoreCoreCLR is now Open Source.

如果你只点击了这里的一个链接,确保它是Introducing .NET Core。Immo 研究了大量的细节来解释为什么我们需要它和它是如何适应的。

编译器

.Net的编译器平台 (“Roslyn”) 提供了开源的,带有丰富的代码分析API的C#和VB编译器。它使相同API建立代码分析工具成为可能,并且这已被应用Visual Studio中。Roslyn产生平台独立的中间语言(IL),并用于构建.Net 2015,包括框架和核心。在发布的时候,整个的.Net 框架将会用Roslyn来编译。在Roslyn中,包括主要语言,像C#和VB的创新,参见 : Roslyn on GitHub . 也有发生在F#语言和编译器上的创新。参见 : F# on GitHub .

“RyuJIT” 是一个针对x64位版本.Net的新的默认实时(JIT)编译器。这个实时(JIT)编译器在运行时第一次执行接受中间语言并且为特定的机器架构编译它。它被用于桌面和基于服务的方案,RyuJIT是对于之前64位实时编译器的彻底改造,主要体现在启动时间上的减少。它也包括支持SIMD(单独的指令,多样的数据), SIMD允许在一系列的值上执行并行的数学操作。这为那些依赖于向量操作的确定类型的应用程序提供了一个巨大的加速功能。

参见: The next-generation JIT compiler for .NET

.NET Native 编译C#为本地机器代码就像执行C++一样,所以开发人员可以持续从.NET Framework本地代码性能的生产效率和熟悉程度中获益。典型以.Net为基础的应用程序被编译为中间语言(IL),在运行时,实时(JIT)编译器将这些中间语言翻译为本地代码。相反, .NET Native是一个预编译器,它将应用程序直接编译为本地代码并且包含一个最小的CLR运行时。当主流的Windows应用商店程序用.Net Native编译时,启动速度会提升60%并且少占用15%至20%的内存空间。通用的Windows应用程序将会在.Net Native上运行(ARM, x86, x64)。

参见: The next-generation JIT compiler for .NET

应用程序模型

应用程序模型扩展了.NET Framework 4.6 和 .NET Core 5的通用类库。Windows Forms, WPF, ASP.NET Web Forms, MVC 5 等。你今天所熟悉的应用程序模型是.NET Framework 4.6的一部分,并且带有很多新的特点。也从这些语言的创新,Roslyn编译器和RyuJIT中获益。.Net 4.6栈中还有很多特点即将发生。参见: ASP.NET Overview – What about Web Forms? , The Roadmap for WPF .NET Framework 2015 Preview

另外,还有一些应用程序模型被设计来运行在最优化的.Net 5Core 上。

ASP.NET 5 是一个瘦身版的.Net应用程序模型,它被用来构建现代版的web应用程序。它自下而上的建立,并且为云端或者内部部署的应用程序提供了一个优化的开发框架。它由最小开销的模块组件组成。所以当你构建你的解决方案时,你可以保留它的灵活性。ASP.NET 5运行在.NET Framework 4.6 或者.NET Core 5的顶层。ASP.NET 5使用Mono runtime 来运行在Linux和Mac上。一旦.NET Core支持Linux和Mac,ASP.NET5也会针对这些平台移植到.Net Core上。参见: ASP.NET 5 OverviewIntroducing ASP.NET 5

Universal Windows apps 是一类允许你在Windows Phone ,Windows apps (8.1+)和部署在Windows应用商店的程序之间共享代码的应用程序模型。Universal Windows apps将会运行在.NET Native上,它将编译成中间语言(IL)到本地机器代码并且包含一个最小的CLR运行时。参见 : Building universal Windows apps for all Windows devicesGetting Started with .NET Native

再谈什么是.NET Core?

.NET Core 5是一个通用的模块化框架,可以在多种应用程序模型和平台下使用,因为它包含了基础类库(corefx)和运行时(coreclr)的重构集。.NET Core的基类库(BCL)的API对于不同的应用程序设计模型是完全相同的。这些API并不是仅仅看起来像--它们分享同样的实现。这些API/程序集最主要的是被更多的模块所代理,并且被独立的建立。

本地应用程序(端到端应用程序)的部署也是.NET Core 的一个关键特征。你选择你所需要的包一起部署到你的应用程序上。组件包通过NuGet变得可用。这意味着你的应用程序独立的运行,并不会被计算机内的整个.NET Framework所影响。你不必为你的应用程序被未知的拷贝部署而担忧。

.NET Core 同时也被Microsoft的Windows系统,Linux系统和Mac OSX系统所支持。.NET Core目前建立并运行在Windows系统上,但是我们正在为Linux和Mac系统添加特定平台组件的实施方案。并且它是完全开源的。这对于建立.NET 跨平台和创建一个更强大的生态系统是非常重要的。

从代码到运行应用程序 – .NET Core开发

我认为在学习技术时,去思考一个思维上的“关于事物是如何一起工作的模型”总是有帮助的。这里是我的一些用.NET Core开发应用程序的简化观点,它们来自于应用程序部署和执行的编码/构建/调试周期。部署和执行依赖于你所使用构建应用程序的模型。

你编写代码时采用你所需要的应用程序模型和来自BCL非常模块化的部分引用。Roslyn作为编译器使你的代码和产品平台独立于中间语言(IL)。在编译器的编译过程之外,有一个非常丰富的API集被用来分析你代码中的各种排序。如果你正在使用Visual Studio,它包含非常多新的IDE功能,利用这些API能给你带来非常富有成效的编码体验。

如果你建立一个通用的Windows应用程序,.Net Native 工具链负责剩下的事。你的应用程序的引用被构建到一个本地的映像中,部署在本地时采用一个最小的运行时。如果你构建一个ASP.NET 5的应用程序,引用和核心CLR将和你的本地应用程序一起部署到服务器上。 JIT编译发生在开始使用RyuJIT时。

此外,ASP.NET 5允许你在你的代码里做一些改变,保存这些改变,并且当刷新浏览器时,不用显式地重新编译你的工程。Visual Studio使用Roslyn来使得动态编译成为可能。你仍然有整个编译过的框架的结构和能力。但是开发体检感觉起来更像是一种解释语言。

注意:如果你正在把整个 .Net Framework 4.6作为目标,你将仍然享受这些语言的创新和Roslyn编译器所带来的乐趣。应用程序的开发并不会改变它们今天是如何实现的。它仍然依赖于安装了整个 .Net Framework的机器,但是JIT编译发生在新的优化的编译器RyuJIT上。

目前什么开源了?

.Net 2015的许多部分现在都开源了,并且被.Net Foundation 所管理。我们正在和这些项目的团队一起积极的解决开源问题。

你可以在GitHubhttps://dotnet.github.io/上看到所有建立在.Net 基础上的应用程序的Repo和活动。

这里有几个不错的地方可以用来开始了解它们。查看readme和指南中的细节。

值得注意的是整个.Net Framework也开源了,这意味着,这个.Net Framework已经完全发布在OSI授权下,但是你可以在https://referencesource.microsoft.com/里找到所有的源代码。

开源中的工程

对于Microsoft来说开源软件并不陌生,但是这对于.Net运行时和库来说这却是全新的。对于一个长达15年之久的工程来讲这是一件十分重要的事情,如此多的人已经在它的框架下工作了很长时间,而且不仅仅代码移动,所有的工程过程都开放了。这需要花费时间。这就是为什么团队都是以一个小的基础类库开始的,沿着学习的过程,发布的也越来越多。那些最佳实践的学习过程遍及整个团队。目前衷心的拥护和贡献使我们变得谦逊。

你也许会为自己考虑“今天我没有足够的时间去建立我自己的应用程序,更别说如何去写CLR的代码!”够了,我们一起走!你选择如何参与你想做的呢。你不需要通过写代码从而成为一个贡献者。填写一个问题提出一个建议回答一个问题。或者仅仅闲逛和看看这个活动

你也许会想“我不想丢掉我过去已经适应的简单特性或者支持!”不要着急!我们仍旧专注于之前那样级别的质量和服务。简单设想下,现在我们所做的一切是使我们的工程开放。我们以前在内部所做的建立高质量软件的每一件事仍然存在,它们现在仅仅是公开了。

我对这些团队里的新文化和.NET的未来确实感到兴奋和激动。

阅读愉快!

[2015/2/26更新] -我应该已经提到,dotNetConf 2015即将来临,你可以从中学到很多。3月18号和19号将现场直播一个来自沟通和产品团队发言人的公开活动。