【深入理解CLR】 一 .Net体系结构及CLR在何处

我这人的学习方式是:不管学习什么东西,总要先有个大局观,看全面了,然后再看看自己身处何处,依照所处位置制定计划,然后快速执行,勤记笔记,多多实操。废话不多说,先看看整个大局吧。

对啦,一定要特别注意,我花费一整天的时间学习和写这篇文章的目的就是使你和我一样,能由表及里,由浅入深的理解CLR。本文的行文逻辑一定要注意

  1. 首先看到整个.Net大局,然后找到.Net FrameWork.

  2. 找到.Net FrameWork.后描述然后找到.Net FrameWork.的大局,从中找到CLR

  3. 找到CLR后做简单介绍,作为本系列深入理解CLR的开端

我这么布局的意图是,如果一开始就钻进去CLR里,难免有点儿陷进去的感觉,先从整体把握,理解它在体系中的位置,以及为什么要用,才会慢慢知道CLR的妙用,对于之后的深入学习也会大有裨益

整理思维:树立.Net大局观

第一次接触C#就被它的关系搞乱了,一会儿是.net,一会儿是C#,一会儿又是.net FrameWork,一会儿又是.net Core,到底哪些跨平台,哪些又不跨,CLR是个什么东西,相信很多人也会有这样的疑惑,查阅了很多资料后,我决定在开启CLR的学习之前将学习的一些理解整理出来,树立一个大局观!然后再定位CLR。

什么是.Net

一直以来,我们口口声声的说着.Net,但.Net究竟是什么呢,官方定义如下:.NET是微软的新一代技术平台,为敏捷商务构建互联互通的应用系统,这些系统是基于标准的,联通的,适应变化的,稳定的和高性能的。从技术的角度,一个.NET应用是一个运行于.NET Framework之上的应用程序。(更精确的说,一个.NET应用是一个使用.NET Framework类库来编写,并运行于公共语言运行时Common Language Runtime之上的应用程序。

简而言之,.Net其实就是一个平台,一个供开发者开发的技术平台,在这个平台上,开发者需要遵循平台的语言规范,使用平台提供的工具,然后创造出各种应用程序,从PC端到手机app,再到web,几乎全部涉及。通常意义上.NET其实也就是指.NET Framework。

注意:.Net平台以后也许不仅仅是运行于.NET Framework之上了,它的家族成员从2016年开始加入了.Net Core(虽然官方给的定义是.Net core 是.NET Framework的子集,但大家都习惯性的把它称为新东西,因为它可以跨平台!并且公开了源码**),另外一个就是Xamarin(始创于2011年,专注于移动开发),mono项目的分支,这个会在接下来介绍。

.Net生态系统

我之前是搞java的,java最大的好处就是可以多造轮子,多种语言都可以转化为类文件,每一个类文件又可以在不同操作系统的jvm上翻译成对应的机器码,可以说java就是跨平台的大神!还有一个好处就是,java开源,java的jdk源码公布到社区,大家共同讨论,完善,使得java迅速成为最流行的语言。这两个特点.Net似乎一直没有做到,微软通过以下两个手段来补救:

1,首先.Net从2014年开始似乎才意识到了危机,公开了部分源码,但貌似为时已晚。

2,其次.Net虽然一直主打融合语言,打造统一的平台环境,.NET Framework这一点也做的不错,但.NET一直没能在官方支持下摆脱Windows平台的局限,直到.NET Core出现,开源和跨平台这两个特性第一次同时具备

就我看来,现在整个windows还算是微软的天下,所以希望.Net Core来的不算晚,毕竟咱转了C#啊
这里写图片描述
我们可以看到整个.net的生态系统图是这样布局的,我将对整个生态图逐一的解释下。按我的分类方式来的话,整个生态系统可以分为四大部分,有三大部分基础规范核心,另一个部分就是操作工具

.Net生态系统的核心部分

核心部分是.Net生态的关键,我在这里详细解释下各个部分。
这里写图片描述
从下往上看, 又可以分为三大部分

  • 底层支持平台,包括编译器,运行时及CSharp/FSharp/VB.Net等
  • 标准类库,统一大部分通用的API
  • 应用模型, 适用于不同的操作系统

应用模型

.NET Framework,.NET Core和Mono是runtime,它们还包含用于构建应用程序的库和框架。应用模型暂时包括以上提到的三类,可以看得出来,应用模型的三者各有所长,它们的发展方向微软也给出了规划,

  • .NET Framework将继续在windows世界发力, 重点会在Desktop UI应用方面。可以看出.NET Framework将继续在当前稳健的操作系统上发展,而不会兼顾跨平台

  • .NET Core会在UWP(通用windows平台,在所有win10系统上一处开发,处处使用)及后端应用(Back-End)发力,适应现在Linux服务器满天飞的现状.可以看出.NET Core的使命就是将开源和跨平台发扬光大!

  • Xamarin 会继续在移动平台发力,作为一个快速App的工具,关于这个非官方的儿子,我在后边会说到。

接下来详细了解下这三种应用模型吧,其实纵向来看,每一个应用模型都可以当做一个.Net框架,它包括了从顶层到运行时的一切东西,但为了更加直观点儿,生态系统图把下边两层做了统一解释。

.Net FrameWork

如果纵向的观察,.Net FrameWork的架构图是这样的
这里写图片描述

值得注意的是.NET 并非只有一个.NET FrameWork ,对应于不同的设备和应用场景,它有各种各样的FrameWork,虽然运行环境类似,但整个框架也非常庞大,所以我想这也是为什么微软开始抛弃以pc为核心,打造生态系统的原因吧,也能解释为什么uwp横空出世。下图即是部分FrameWork框架。
这里写图片描述

在数年间微软推出了数个类似 .NET Framework的框架,以用于在不同的设备上运行。每个Framework都有类似的体系但又不完全相同的,这样Framework越来越多,对开发者来说不一样的设备即便功能相同也需要维护多套代码,增加了开发的复杂度。

.Net Core

.NET Core于2016年发布,可用于创建ASP.NET Core和通用Windows平台(UWP)应用程序。支持跨凭条和并发配置,这意味着可以在同一台计算机上运行多个版本的.NET Core,它很小,性能很好。
这里写图片描述

  1. NET Core是一个新版本的.NET,它是一个跨平台,开源和模块化的.NET平台,用于创建运行在任何地方(注意.Net FrameWork似乎只能跨设备,且还不彻底。仅仅基于Windows操作系统)(Windows,Linux和MacOS)的现代Web应用程序,微服务器,库和控制台应用程序。它更多的是为后端应用(back-end)准备的,所以core其实和asp.net core捆绑很紧密. 当然core还可以编写命令行程序, 也就是说我们在linux开发一些工具可以选择C#了.

  2. 当然core还可以开发UWP的应用。这里简单介绍下UWP,UWP即Windows 10 中的Universal Windows Platform简称。即Windows通用应用平台,在Win 10 Mobile/Surface(Windows平板电脑)/PC/Xbox/HoloLens等平台上运行,uwp不同于传统pc上的exe应用也跟只适用于手机端的app有本质区别。它并不是为某一个终端而设计,而是可以在所有windows10设备上运行。有点儿像bootstrap的响应式设计哦。

对了,相对于.Net FrameWork的不彻底跨设备,Core具有完美的跨设备特性。.NET Core是一个开源的模块化的Framework,不管是开发web或移动设备都在同一个Framework(.NET Core)下运行,而且 .NET Core也可在不同的操作系统上运行,包括Windows、linux、MacOS,实现了跨平台跨设备。

这里写图片描述

更棒的是.NET Core 在发布程序时不用事先安装Framework而是通过Nuget下载,这样在初次部署时就不用安装一个复杂而庞大Framework,而是按需下载。总结起来,对比Framework,core更加轻量,开源,跨平台,彻底的跨设备

我一直觉得.Net Core似乎是.Net的未来,将来有机会一定学学,虽然不知道为什么其可以实现跨平台,但感觉和它底层的coreCLR一定脱离不了关系。

Xamarin

说到Xamarin就要说到致力于.Net跨平台的非官方社区的开源项目Mono。Mono是一个致力于开创.NET在Linux上使用的开源工程。它包含了一个C#语言的编译器,一个CLR的运行时,和一组类库,并实现了 ADO NET和ASP NET。能够使得开发人员在Linux用C#开发程序。该项目的目标是创建一系列符合标准ECMA (Ecma-334和Ecma-335)的.Net 工具, 包括C #编译器和共同语言(CL 即 Common Language)执行平台(Platform).与微软的.Net不同, Mono项目不仅可以运行于Windows系统内,还可以运行于Linux, FreeBSD, Unix, Mac OS X和Solaris。

这就是我前文提到过的Mono,而Xamarin就是Mono项目的一个分支,致力于移动应用程序
这里写图片描述

总结来说,这个野儿子将要被core吸收融合,将来成为.Net最喜欢的亲儿子。

标准类库

.NET Standard Library 是一组API规范,它不是用户下载和安装的东西,而是描述API和API做什么的规范。中间这层更像是一个调配者,除了一些公共的类库,它还能告诉你不同的应用模型该使用哪些不同的类库

在dotnet生态系统图的Base Libraries层可以看出, .Net标准库更像一个垫片层(Adaper设计模式),用来调用具体平台相关的实现库, 比如在windows平台就调用.Net Framework 类库, 在Linux上就调用CoreFx类库,而在移动平台则调用Mono类库.

standard和framework/core/xamarin之间的关系
这里写图片描述

底层支持平台

基础设施是指让上面所有的东西可以工作,它包含编译器,语言和运行时组件,如垃圾回收器和即时编译。

语言运行环境:这其中包括C#、VB.NET和F#等耳熟能详的语言都可以在runtime中运行,runtime都需要使用工具和基础设施来编译和运行代码

运行时组件:包括MSBuild、Common Language Runtime(CLR)和CoreCLR等。ok,我终于在整个大局观里找到了所要研究的东西!!! CLR

编译器:暂时将其归类到Tools部分

.Net生态系统的工具部分

Tools部分

我们可以看到在该部分有两个工具,首先就是我们最常用的Visual Studio 一款IDE,也就是编译器下边这个比较特殊,Visual Studio Code 这个简单来说就是一款编辑器怎么理解?

简而言之:vs可以类比为myeclipse,可以跑程序,而vsc可以类比为sublime,notpad++这样的编辑器,但vsc性能更加强大,并且针对.Net系的程序员非常友好。

对了,这里插一句,.Net不能跨平台,编译器也要背一份锅,因为VS长久以来一直是windows专属,近期才有了一些微小的改动,但仍然算不上什么改动。对了,VSC这货跨平台啊,这是vs不能比的,将来本地编辑,然后再Visual Studio Online平台(云平台)上编译和运行,就不需要VS那坑货了,开机吃死内存。希望微软抱着更开发的心态来对待技术和开发者吧,毕竟开源才是未来啊。

类比java

类比于java,我想先就跨平台性讨论一下,众所周知,java具有强大的功能,所有文件(不管是java写的还是C#写的只要符合标准)都将被编译为class文件(中间的类文件),然后可以借助不同操作系统版本的jvm在各个平台上运行,是真正的跨平台!我在我的另一篇博客里详细解释过语言无关性和平台无关性传送门:https://blog.csdn.net/sinat_33087001/article/details/77089203
解释完之后我们开始类比

  1. jdk对应 .net framework sdk (先不讨论.Net Core)—–安装包

  2. jre对应 .net framework——–运行环境

  3. jvm对应clr——-虚拟机(运行时)

  4. java对应C#,JPype对应IronPython等……

那么为什么C#开发的东西不能跨平台呢,更本原因其实不是C#语言的问题,而是.Net Framework的问题。

那么我们首先看下语言无关性(下图拿java举例,来自于我的另一篇博客):
语言无关性:不同的语言通过各自特定的编译器可以统一编译成class文件
这里写图片描述

.Net平台所做的努力就是它真正做到了语言无关性,整个平台集成了CLS,通过公共语言规范,所有家族的语言都会被编译为MSIL中间语言,然后交给CLR去翻译成本地代码。这里是没有问题的,真正出问题出在了类库和工具上。

平台无关性:有了统一的class文件,通过使用针对不同平台开发的jvm虚拟机
这里写图片描述
没有依据不同平台使用相应的CLR,所以如果.NET Framework基础类库不能跨平台,那么所以微软不得不投入大量精力去开发全新的.NET Core Framework(就是现在github上的https://github.com/dotnet/corefx ),一边将.NET Framework中有用的代码搬过来,一边根据跨平台的需求重新实现。

循序渐进:树立.Net FrameWork大局观

.Net FrameWork概述

在了解了.Net的生态系统后,我们发现,最终要研究的CLR其实存在于.Net FrameWork基础设施服务的地方,也就是较为底层的地方,当然.Net Core(CoreCLR)和Xamarin(暂时没有了解过)上也各自有自己的运行时。因为三者虽然是不同的应用模型,但其实CLR实现的功能大同小异,再加上我学习所用的书《CLR via C#》是基于.Net FrameWork4.5版本来实现的,所以我就以.Net FrameWork为CLR实现的大环境来介绍。对.Net FrameWork有了整体理解后,再定位CLR的具体实现。

常见应用概念扫盲

经常看到很多可以应用的东西,但不知道作用是什么,今天来个扫盲。依据上一节的描述,.Net FrameWork可以做很多事情,具体来举举例子:
这里写图片描述

  • 控制台应用程序:类似于你用C语言或java搞个输入输出,实现个算法,在OJ平台上提交题什么的,是最简单的windows程序

  • WCF: Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台

  • WPF:(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面

  • WWF:*Microsoft Windows Workflow Foundation (WWF) 是一个可扩展框架,用于在 Windows 平台上开发工作流解决方案。*

  • Window Forms: Windows窗体程序,例如搞个操作界面出来

  • ASP.Net:用于编写Web应用程序

  • 类库:就是用来写一些接口,类文件之类的,面向对象编程

.Net FrameWork架构形态

上一大节简介了.Net FrameWork .更细节一点儿来说,它包括如下部分:

图片来自https://blog.csdn.net/Gnd15732625435/article/details/50821260

这里写图片描述

整个框架在操作系统之上,繁衍出各种应用,例如Web应用,Windows应用
可以看出,整个框架由两大部分组成,

  • CLR(Common LanguageRuntime),又称公共语言运行时或公共语言运行环境,是.NET系统架构中核心的部分,CLR和Java虚拟机一样是一个运行时环境。

  • .NET Framework类库, FCL(Framework Class Library)和CLR一样,.NET框架类库(.NET Framework class library)是构成.NET框架的另一个实体,它提供数千个类、接口等工具供程序员使用

还有一个就是公共语言规范(Common Language Specification)CLS是一组规则和约束,保证用不同编程语言编写的类型之间的可交互操作性

程序基于.Net FrameWork简单执行过程

图片来自于https://blog.csdn.net/Gnd15732625435/article/details/50821260

这里写图片描述

对于C#而言,可以用下图来形容:
这里写图片描述

终极定位:拉开CLR的序幕

在上一节我终于明白了CLR在整个.Net FrameWork中的地位,可以说其是重中之重,经过一系列的大局定位,到框架定位,终于找到了CLR所处的位置和简单了解了下它的功能。以我一个学过java人的理解就是,CLR对应于java 体系的定位就是java虚拟机JVM。那么基于我对JVM的详细理解,相信学习起来也不算太难。

CLR常用功能

异常处理,内存管理(垃圾回收机制),程序集加载,安全性,线程同步,其中我打算重心放到内存管理和程序集加载。

时间规划

在《CLR via C#》这本书里分为五大部分,其中第一部分是CLR的基础,第二部分是涉及面向对象部分,第三部分是基本的数据类型,第四部分是核心机制,第五部分是线程处理。其中第四和第五部分实整个CLR的核心,前三个部分只是讲CLR如何工作

总共预计时间为60个工作日,2满个工作日进行一章,预计结束在8月份左右。但考虑到技术分享的时间,将在完成基础理解后,完成部分核心机制学习就开始制作技术分享的ppt,之后再持续学习

  • 首先在6月中前推进完基础部分,也就是前三部分

  • 在7月之前挑选部分功能结合JVM完成技术分享ppt。

  • 7月之后持续推进,到8月底前完成本书的学习

要求:每一篇博客质量都要高,理论结合实践,最后用此系列来申请博客专家!

猜你喜欢

转载自blog.csdn.net/sinat_33087001/article/details/80077103
CLR
今日推荐