在上一篇的随笔中,我们在理论层面上大致说明了.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. OpenStack网络的前世今生

    声明: 本文转自OpenStack中国社区,原文链接:http://www.openstack.cn/p353.html,作者Joshua,转载请注明. 在OpenStack世界中,网络组件最初叫no ...

  2. Just a Hook

      Just a Hook 题目大意:原来有N个铜棍, 一个人有种能力可以把一个区间的棍变成铜,银或者金的,价值分别是1,2,3, 最后求出总价值,没啥好说的,赤裸裸的线段树: Time Limit ...

  3. Unity3D开发类似保龄球游戏

    先学习一些基本的脚本实现: 1.动态创建物体.默认位置是(0,0)位置 GameObject goNew = GameObject.CreatePrimitive(PrimitiveType.Cube ...

  4. c#调用钩子

    1 概述 在c++中有钩子程序,但是在C#还没有对其进行封装,所以需要自己根据实际情况调用钩子.钩子在我的理解下是,通过初始化钩子与系统中消息映射建立某种关系,当点击鼠标或者键盘,就会通过钩子中的回调 ...

  5. winform datagridview如何获取索引 分类: DataGridView 2014-04-11 13:42 216人阅读 评论(0) 收藏

    datagridview.CurrentCell.RowIndex;            是当前活动的单元格的行的索引 datagridview.SelectedRows  ;           ...

  6. Java处理文件小例子--获取全国所有城市的坐标

    需求:前端展示数据,全国城市的坐标

  7. PHP+IIS7+PHPMangerForIIS搭建开发环境

    准备工作 1.安装IIS 2.安装php 3.安装phpmanager 准备工作做好后,开始搭建环境 1.在Internet信息服务管理器下找到PHPManager 2.点击Register new ...

  8. WCF 项目应用连载[2] - 创建Lig日志系统

    WCF 项目应用连载[1] - 索引 - 轻量级的Log系统 - Lig Sample -序 现在我们创建一个Lig工程 - Litelog 2.1 创建Lig服务 _________________ ...

  9. Linux 搭建SVN server

    一. SVN 简单介绍 Subversion(SVN) 是一个开源的版本号控制系統, 也就是说 Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库 (repository ...

  10. 实用技巧:简单而有用的nohup命令介绍(转)

    简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站 ...