CLR和JIT
在使用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的更多相关文章
- 用Windbg来看看CLR的JIT是什么时候发生的
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Windbg来看看CLR的JIT是什么时候发生的.
- 【转】CLR和JIT的理解、.NET反汇编学习
CLR:通用语言运行时(Common Language Runtime)的简称,CLR是.NET框架的核心内容之一,可以把它看为一套标准资源,可以呗任何.NET程序使用.它包括:面向对象的编程模型.安 ...
- 什么是.NET CLI CLR IL JIT GC,它们是如何工作的
参考网址: https://cloud.tencent.com/developer/article/1432891 1:什么是.NET? NET 是 Microsoft 的用以创建 XML Web 服 ...
- C#中IL, CTS, CLR, CLS, JIT含义
1. IL/MSIL (Microsoft Intermediate Language) 微软中间语言 (IL是MSIL的缩写,译为中间语言) 2. CTS (Common Type System ...
- (转)什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?
转自:http://www.cnblogs.com/haofaner/articles/2288968.html 1:什么是.NET? NET 是 Microsoft 的用以创建 XML Web 服务 ...
- CLR、CIL、CTS、CLS、CLI、BCL和FCL,JIT,IL,GC
如果要想深入学习.NET平台,那么标题中的这些关键字对你来说并不陌生,这些名词构成了.NET庞大的生态系统,为了宏观认识.NET平台,学些.NET架构体系,针对一些常用常用名词的理解是很有必要的,未必 ...
- CLR 这些年有啥变化吗?
引言 首先想给初学者推荐下<CLR via C#>这本好书,做.Net开发的开发者应该都读一下.为避免广告之嫌,所以这里只提供豆瓣书评的链接. CLR 作为.Net 程序跨平台运行的载体, ...
- CLR via C# 摘要一:托管程序的执行模型
托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...
- 【CLR via C#】CSC将源代码编译成托管模块
下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...
随机推荐
- VPS搭建VPN(pptpd)
环境:Ubuntu Server 12.04 下载FQ程序 wget http://cdxf.yun.ftn.qq.com/ftn_handler/40ad8a2875adf1f7b5193f54a5 ...
- 配置Apache将自己的电脑做服务器使局域网内的电脑访问自己的主机
很多的朋友都想把自己的电脑打造为服务器使别人能够访问.比如说你自己写了一网站,只能自己通过localhost访问或127.0.0.1访问.但是怎么让别人的电脑也能访问呢?来看看自己写的网站.现在我来讲 ...
- 黑马程序员——JAVA基础之JDK1.5新特性高级for循环和可变参数
------- android培训.java培训.期待与您交流! ---------- 高级for循环 格式: for(数据类型 变量名 : 被遍历的集合(Collection)或者数组) { ...
- google和ebay微服务经验
摘自:http://www.infoq.com/cn/articles/ecosystems-of-microservices 多元化(polyglot)微服务是终极游戏 大规模系统和多元化微服务最终 ...
- UIview 学习与自定义--ios
UIView *view1=[[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)]; view1.backgroundColor=[UI ...
- Unity3d 适配机型
1,为了是更多机型能够安装你的游戏,Unity3d Device Filter设置:ARMv6 with VFP: 2,华为C8600,一运行强制停止: 参考网址:http://forum.unity ...
- hibernate反向工程 (eclipse和myeclipse)(转)
hibernate反向工程 (eclipse和myeclipse) 如何提取数据库的模式信息,想通过hibernate的反向工具尝试下. 一.myeclipse下hibernate反向工程: 1.选择 ...
- wikioi1012 最大公约数和最小公倍数问题(2001年NOIP全国联赛普及组)
题目描述 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整 ...
- Jquery获得下拉框的值
转自:http://blog.csdn.net/jing_xin/article/details/8007794 获取Select : 获取select 选中的 text : $("#ddl ...
- Format可能存在的坑
import java.text.MessageFormat; public class TestFormat { public static void main(String[] args) { / ...