在使用IDE进行编译的时候,这个过程具体的叫法是,使用编译器面向CLR来生成代码。对于不同的开发语言,使用的的编译器也不一样,但是生成的代码都一样。

  “无论选用哪一个编译器,结果都是一个托管模块。”

  托管模块中的中间语言(MSIL),是编译器编译代码时生成的代码,它是与CPU无关的机器语言。当程序运行时,由CLR将中间代码转换为本地CPU指令。因此,任何编译成MSIL的程序都可以在实现CLR的环境上执行。这是.NET Framework具有可移植性的部分原因。

  为了执行一个IL方法,首先必须把它转换成本地CPU指令。该处理过程如下:当.NET程序执行时,CLR激活JIT编译器,JIT编译器根据程序中各个部分的需要将MSIL转换成本机代码。

  下图展示了一个方法首次调用时发生的事情。

  就在Main方法执行前,CLR会检测出Main的代码引用的所有类型。Main方法引用了一个Console类型,这导致CLR分配给Console一个内部结构。在这个内部数据结构中,Console类型定义的每个方法都有一个对应的记录项。每个记录项都容纳了一个地址,根据此地址即可找到方法的实现。

  在CLR分配给Console一个内部结构的时候,需要对这个结构进行初始化,CLR将每个记录项都设置成一个函数。这个函数是存在于CLR内部的一个未文档化的函数,JITCompiler。

  Main方法首次调用WriteLine时,由于记录项被初始化为JITComplier,JITComplier函数会被调用,调用的结果是,JITComplier将WriteLine方法的IL代码编译成本地CPU指令。然后,本地CPU指令被保存到一个动态分配的内存块中。JITComplier接下来将Console类型定义的WriteLine方法的记录项设置成现在内存块的地址。

  一个方法只有在首次调用时才会即时编译,以后对该方法的所有调用都以本地代码的形式运行,无需重新验证IL并把它编译成本地代码。

  下图展示了第二次调用WriteLine时发布的事情。

  

CLR和JIT的更多相关文章

  1. 用Windbg来看看CLR的JIT是什么时候发生的

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Windbg来看看CLR的JIT是什么时候发生的.

  2. 【转】CLR和JIT的理解、.NET反汇编学习

    CLR:通用语言运行时(Common Language Runtime)的简称,CLR是.NET框架的核心内容之一,可以把它看为一套标准资源,可以呗任何.NET程序使用.它包括:面向对象的编程模型.安 ...

  3. 什么是.NET CLI CLR IL JIT GC,它们是如何工作的

    参考网址: https://cloud.tencent.com/developer/article/1432891 1:什么是.NET? NET 是 Microsoft 的用以创建 XML Web 服 ...

  4. C#中IL, CTS, CLR, CLS, JIT含义

    1. IL/MSIL  (Microsoft Intermediate Language) 微软中间语言 (IL是MSIL的缩写,译为中间语言) 2. CTS  (Common Type System ...

  5. (转)什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?

    转自:http://www.cnblogs.com/haofaner/articles/2288968.html 1:什么是.NET? NET 是 Microsoft 的用以创建 XML Web 服务 ...

  6. CLR、CIL、CTS、CLS、CLI、BCL和FCL,JIT,IL,GC

    如果要想深入学习.NET平台,那么标题中的这些关键字对你来说并不陌生,这些名词构成了.NET庞大的生态系统,为了宏观认识.NET平台,学些.NET架构体系,针对一些常用常用名词的理解是很有必要的,未必 ...

  7. CLR 这些年有啥变化吗?

    引言 首先想给初学者推荐下<CLR via C#>这本好书,做.Net开发的开发者应该都读一下.为避免广告之嫌,所以这里只提供豆瓣书评的链接. CLR 作为.Net 程序跨平台运行的载体, ...

  8. CLR via C# 摘要一:托管程序的执行模型

    托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...

  9. 【CLR via C#】CSC将源代码编译成托管模块

    下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...

随机推荐

  1. android开源项目---项目篇

    本文转载于:http://blog.csdn.net/likebamboo/article/details/19081151 主要介绍那些Android还不错的完整项目,目前包含的项目主要依据是项目有 ...

  2. java多线程:并发包中ConcurrentHashMap和jdk的HashMap的对比

    一:HashMap--->底层存储的是Entry<K,V>[]数组--->Entry<K,V>的结构是一个单向的链表static class Entry<K, ...

  3. Java设计模式之简单工厂设计模式

    简单工厂将业务逻辑部分和界面逻辑部分分离开来,降低了界面逻辑和业务逻辑的耦合度,符合面向对象迪米特法则.下面以一个加法减法运算器为例,各位读者可以自行按照这种设计方式设计出一个小小的运算器. 1.业务 ...

  4. ubuntu下nfs服务器的安装与配置

    nfs服务器的安装和配置 1.安装nfs 服务器,前提是你的系统能连上网. 2.设置/etc/exports配置文件 (1) 进入/etc/exports配置文件 (2) 在最后一行加入红色那行,/h ...

  5. 论文笔记之:Instance-aware Semantic Segmentation via Multi-task Network Cascades

    Instance-aware Semantic Segmentation via Multi-task Network Cascades Jifeng Dai Kaiming He Jian Sun ...

  6. C++运算符重载详解

    1.什么是运算符重载 运算符重载是一种函数重载. 运算符函数的格式:operatorop(argument-list)例如,operator+()重载+运算符.其中的op,必须是有效的C++运算符,如 ...

  7. 经典ASP.NET MVC3.0入门详解

    http://blog.csdn.net/csh624366188/article/details/7064269 :由于本文原在word文档里编写,写本文章时运用了大量截图,直接复制到博客里,没有显 ...

  8. redis模块

    http://www.cnblogs.com/melonjiang/p/5342505.html http://www.django-china.cn/topic/1054/ 1.连接方式 redis ...

  9. 001. 为input type=text 时设置默认值

    1. 前端HTML代码 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Defa ...

  10. call和apply的差别

    Call(thisArg,arg1,arg2,-..) apply(thisArg,[arg1,arg2-.])