在上一篇的随笔中,我们在理论层面上大致说明了.NET Framework的工作机制,内容的确比较晦涩难懂,但是还是希望大家有时候可以看看。我个人觉得,编程不是一味的敲代码,当自己遇到瓶颈的时候,可以多看下书,多归纳总结下,或许会有意想不到的收获。自从学习了.NET Framework的机制以后,结合相关视频的讲解(黑马程序员_.NET入学辅导班公开课视频[第01季]),对.NET Framework有了一定的了解。下面用通俗易懂的方式进行阐述,可能有所偏颇或是不准确,仅为个人理解,但只是为了方便理解和让初学者有一定的概念。希望各位将错误指出,有则改之无则加勉。

  开始介绍之前,我们还是看下之前微软官方公布的那张.NET Framework环境说明图,如下:

  

  开发者编程的目的就是为了操作 操作系统/硬件,让操作系统/硬件完成特定的操作,方法很多各种各样(通过不同的编程语言不同方式),其中微软给开发者提供一个方法体系。因此,如果你想用通过微软提供的方法去完成相关操作的话,就必须通过.NET这个平台来进行管理,.NET就是方法的相关规则和约束,无规矩不成方圆嘛。编程语言 Visual Basic、C#、Visual C++、JScript 或许多第三方编译器(如 Eiffel、Perl 或 COBOL 编译器)在平台中就充当使用者的角色,但是平台不仅只有使用者,最重要的是其中的管理者吧。

  CLR(公共语言运行时)就是.NET平台的管理员,管理语言的运行,管理代码的性能甚至内存等一系列与运行有关的内容。也就是说,在.NET里面CLR最大,你想在.NET进行任何操作都必须向CLR申请,它会指导你如何进行下一步,按部就班,事实上CLR基本上都会帮你完成所有的操作。

  CLR身为管理者,统筹全局,当然不可能事必躬亲,它还有2个得力助手,JIT和GC,这是为了让使用者(编程语言)在.NET里拥有更高安全性,易用性和高效性。

  

  在介绍得力助手号之前,我们需要了解,NET里的通行证— —IL/MSIL(Intermediate Language/Microsoft  Intermediate Language)中间语言/微软中间语言,因为.NET的使用者(编程语言)很多,五花八门,所有为了方便管理,他们最后都会由各自对应的编译器编译成.NET里面的同一身份IL,一组可以有效地转换为本机代码且独立于 CPU 的指令。

  当你摇身变成IL时,就可以拜托JIT编译成本机代码,然后和操作系统/硬件一起去做你一直想做却又做不到的事情 。至此,你应该了解 JIT即时编译器(Just-In-Time)的主要职责了吧,它就是将这个IL代码,根据当前的硬件和软件环境,进行运行的编译,并缓存代码。

  (1)至于如何根据当前的硬件和软件环境进行优化,这里可以说一些简单的例子。JIT会根据本机的硬件环境生成对应的代码,当然,也并非行代码都生成。因为JIT会根据代码的与运行情况,根据系统的环境对变异结果做优化,例如:

  

for(int i=;i<;i++)
{ }

这段代码并没有实际作用和意义,只是在浪费CPU的资源,就会忽略编译。

  (2)如果代码中有很多次调用这个方法,那么CLR在JIT编译这个代码第一次以后,就会将已经编译好的缓存起来。下一次要使用的时候,不去编译了,直接从缓存中取出编译好的代码执行即可。

  例如:

  如当WriteLine首次被调用时,JIT将它编译成本机代码,当WriteLine再次被调用时,就不再进行编译而是直接执行内存块里面的代码。

  GC 垃圾回收器(Garbage Collection),它在CLR心目中的具有举重轻重的地址。它往往将不用的或是不常用的代码直接删除掉(在计算机中内存是有限,程序的运行不断消耗内存,CLR会将不用的部分自动删除),如果再要使用,重新创建,整理内存(GC删除对象以后,在内存中会出现很多内存碎片,直接影响代码的性能,GC会将内存进行整理),使得内存连续。它不会定时定量的进行回收,也就是说往往是在神不知鬼不觉,或是当它在它认识需要进行整理时才会进行回收。正因为它默默地辛勤劳动提升了使用者(编程代码)在.NET中的性能和效率。

  你们也许会好奇,难道CLR里面就只有2个助手(JIR和GC)而已,显然这是不可能的。在CLR中还有其他一些帮手。

CLI 通用语言基础结构(Common Language Infrastructure,CLI)是CLR的一个子集,也就是.NET中最终对编译成MSIL代码的应用程序的运行环境进行管理的那一部分。CLI是.Net和CLR的灵魂,CLI为IL代码提供运行的环境,你可以将使用任何语言编写的代码通过其特定的编译器转换为MSIL代码之后运行其上,甚至还可以自己写MSIL代码在CLI上面运行。

CTS 通用类型系统 (common type system) 一种确定公共语言运行库如何定义、使用和管理类型的规范。CLR通过CTS(通用类型系统),实现严格的类型和代码验证,来增强代码鲁棒性。

CLS 公用语言规范(Common Language Specification)和CTS通用类型系统一起确保语言的互操作性。CLS是一个最低标准集,保证C#组件与其他语言组件间的互操作性,所有面向.NET的编译器都必须支持它。

CIL通用中间语言(Common Intermediate Language)也就是我们之前所说的IL/MIIL。

BCL 基础类库(Base Class Library)包含的类对许多程序有帮助,为开发者提供丰富的类。

.NET Framework(二)的更多相关文章

  1. Django Rest Framework(二)

    •基于Django 先创建一个django项目,在项目中创建一些表,用来测试rest framework的各种组件 models.py class UserInfo(models.Model): &q ...

  2. Entity Framework二、 模型优先 ,ObjectContext类

    https://www.cnblogs.com/ejiyuan/archive/2009/05/27/1490786.html 1.ObjectContext 封装.NET Framework和数据库 ...

  3. C# Winform 脱离 Framework (二)

    第一个Method: //启动应用程序 VOID RunApplication(LPTSTR lpFilename, LPTSTR args) { //WinExec(lpFilename, SW_S ...

  4. Play framework(二)

    Play 2.0 的完整演示过程记录 http://www.oschina.net/translate/playframework-20-live-coding-script todolist代码

  5. Entity Framework (二) 查询

    待完善-------------------------------------- ----------- base 关键字用于从派生类中访问基类的成员: 调用基类上已被其他方法重写的方法. 指定创建 ...

  6. 框架应用:Spring framework (二) - AOP技术

    基础概念 线程中的方法栈 java程序虚拟机启动时会载入程序码,虚拟机会为每一条正在运行的线程生成一个方法调用栈,线程以方法运行为执行单位. AOP概念以及目标 AOP是面向切面编程,其实就是在不修改 ...

  7. Entity Framework 二

    本篇主要介绍:创建了实体数据模型,生成了那些文件以及其代表意义 创建实体数据模型 上一篇的最后,我们创建了数据库,现在我们利用数据库来生成我们的实体数据模型,这种形式我们称为数据库优先,后面会介绍代码 ...

  8. entity framework 新手入门篇(1)-建立模型

    entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下 ...

  9. 使用iOS-QR-Code-Encoder 生成二维码

    一:所需类库 iOS-QR-Code-Encoder 官网主页:https://github.com/moqod/iOS-QR-Code-Encoder 导入:QuartzCore.framework ...

  10. 制作通用framework的几点注意

    一.创建framework,调成静态的framework . 二.匹配bitcode 三.增加-ObjC 在BuildSettting ->Linking->Other Linker Fl ...

随机推荐

  1. poj 1847 Tram【spfa最短路】

    Tram Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12005   Accepted: 4365 Description ...

  2. HDU 4414 Finding crosses (DFS + BFS)

    题意:在N*N的图中,找出孤立存在的十字架的个数.十字架要求为正十字,孤立表示组成十字架的‘#的周围的一格再无’#‘. dfs找出在中心的‘#’(周围四格也为‘#'),则缩小了搜索范围,再bfs找出是 ...

  3. Please check if the Publishing Tools on the server (System/PublishingTools) are started.

    ArcMap或ArcCatalog中双击连接到Server即可,该工具即自动可启动

  4. first blog编程之美-----计算1的个数

    根据以下总结写出以下程序,总结来源于网上 感想:得硬着头皮找规律 #include   int count1(int n) {         int i=1;         int count=0 ...

  5. 【设计模式 - 12】之代理模式(Proxy)

    1      模式简介 1.1    定义 为其他对象提供一种代理以控制对这个对象的访问.代理对象起到中介作用,可以去掉功能服务或增加额外服务. 1.2    常见的代理模式 1)        远程 ...

  6. Present ViewController Modally

    一.主要用途 弹出模态ViewController是IOS变成中很有用的一个技术,UIKit提供的一些专门用于模态显示的ViewController,如UIImagePickerController等 ...

  7. 用 Qt 中的 QDomDocument类 处理 XML 文件(上)

      我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取. 根据常用的操作,我简单的把对XM ...

  8. PhalGo-介绍

    PhalGo-介绍 phalgo是一个Go语言的一体化开发框架,主要用于API开发应为使用ECHO框架作为http服务web程序一样可以使用,牛顿曾经说过"如果我比别人看得远,那是因为我站在 ...

  9. 10.26 noip模拟试题

    enc[问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则:a->b, b- ...

  10. TypeScript笔记[5]泛型+Dictionary 转

    TypeScript笔记[5]泛型   在C++.C#.Java等主流编程语言中,一般对泛型编程提供了支持.合理利用泛型,可以提高开发效率.提升代码质量. 例如在C++编程语言中,常常利用下面的结构表 ...