.NET Framework(二)
在上一篇的随笔中,我们在理论层面上大致说明了.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(二)的更多相关文章
- Django Rest Framework(二)
•基于Django 先创建一个django项目,在项目中创建一些表,用来测试rest framework的各种组件 models.py class UserInfo(models.Model): &q ...
- Entity Framework二、 模型优先 ,ObjectContext类
https://www.cnblogs.com/ejiyuan/archive/2009/05/27/1490786.html 1.ObjectContext 封装.NET Framework和数据库 ...
- C# Winform 脱离 Framework (二)
第一个Method: //启动应用程序 VOID RunApplication(LPTSTR lpFilename, LPTSTR args) { //WinExec(lpFilename, SW_S ...
- Play framework(二)
Play 2.0 的完整演示过程记录 http://www.oschina.net/translate/playframework-20-live-coding-script todolist代码
- Entity Framework (二) 查询
待完善-------------------------------------- ----------- base 关键字用于从派生类中访问基类的成员: 调用基类上已被其他方法重写的方法. 指定创建 ...
- 框架应用:Spring framework (二) - AOP技术
基础概念 线程中的方法栈 java程序虚拟机启动时会载入程序码,虚拟机会为每一条正在运行的线程生成一个方法调用栈,线程以方法运行为执行单位. AOP概念以及目标 AOP是面向切面编程,其实就是在不修改 ...
- Entity Framework 二
本篇主要介绍:创建了实体数据模型,生成了那些文件以及其代表意义 创建实体数据模型 上一篇的最后,我们创建了数据库,现在我们利用数据库来生成我们的实体数据模型,这种形式我们称为数据库优先,后面会介绍代码 ...
- entity framework 新手入门篇(1)-建立模型
entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下 ...
- 使用iOS-QR-Code-Encoder 生成二维码
一:所需类库 iOS-QR-Code-Encoder 官网主页:https://github.com/moqod/iOS-QR-Code-Encoder 导入:QuartzCore.framework ...
- 制作通用framework的几点注意
一.创建framework,调成静态的framework . 二.匹配bitcode 三.增加-ObjC 在BuildSettting ->Linking->Other Linker Fl ...
随机推荐
- 乐视手机1S正式发售,乐视商城官网抽风遭网友吐槽
乐视手机1S正式发售,乐视商城官网抽风遭网友吐槽 10月27日,乐视召开的新品发布会上正式推出千元金属新机乐1s,售价1099元.今天11月3日上午10:00,乐1s在乐视商城.京东商城首发开卖,现货 ...
- 在Eclipse中格式化Android代码
我们用Eclipse做Android开发的时候,可以导入Google提供的profile文件,这样每次"Ctrl+Shift+F"的时候,IDE就能够按照官方的规范来进行代码格式化 ...
- 《A First Course in Probability》-chaper5-连续型随机变量-随机变量函数的期望
在关于离散型随机变量函数的期望的讨论中,我们很容易就得到了如下的等式: 那么推广到连续型随机变量,是否也存在类似的规律呢? 即对于连续型随机变量函数的期望,有: 这里给出一个局部的证明过程,完整的证明 ...
- OpenSource
SugarCRM 客户关系管理系统(CRM).SugarCRM开源版是一款完全开放源代码的商业开源软件 OPENFILER 基于浏览器的免费网络存储管理实用程序,可以在单一框架中提供基于文件的网络连接 ...
- 用js判断一个复选框是否被选中
<html> <head> <title> 复选框全选.全不选.反选.必选一个 </title> ...
- c#语言基础编程-转义符
C#转义字符: 引言 为了在程序中能够控制字符的输出以及区分开双引号和单引号(双引号和单引号在程序中标示里面的内容为字符串和字符),所以用一种特殊的字符常量:是·以反斜线"\"开头 ...
- 2的32次方 分类: C#小技巧 2014-08-05 18:18 406人阅读 评论(0) 收藏
版权声明:本文为博主原创文章,未经博主允许不得转载.
- Hadoop最基本的wordcount(统计词频)
package com.uniclick.dapa.dstest; import java.io.IOException; import java.net.URI; import org.apache ...
- 从注冊流程 分析怎样安全退出多个Activity 多种方式(附DEMO)
前言 因为一个同学问到我怎样依照一个流程走好之后回到首页.我曾经看到过4个解决方式,后来发现有做个记录和总结的必要,就写了这篇博文. (之前看小强也写过一篇,这里通过自身的分析完整的总结一下下面6种方 ...
- grep:Binary file (standard input) matches
grep "key" xxx.log时输出 Binary file xxx.log matches 百度了一下:grep觉得这是二进制文件.解决方式:grep -a. grep - ...