码迷,mamicode.com
首页 > 其他好文 > 详细

01 CLR 的执行模型

时间:2015-02-13 16:06:23      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

 

 

1.先将不同语言的代码生成托管模块。

如图,每个语言有自己对应的编译器。 和普通编译器不同,这个编译器是生成IL代码,不是直接的机器码。

 

编译也就是我们平时生成的过程。 f5

 

c# 调用 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe (我是这个版本,不同版本路径不同) 来编译。

也就是说。其实如果你不VS做开发, 可以只安装 .net Framework,写好代码之后通过它来编译

技术分享

无视那个警告. 这就编译好了。

他可以是一个 DLL,可以是EXE。 

不过都需要CLR才能执行.

具体 CSC详细的参数可以看这里

 

生成有对应的选项

技术分享

x86 能在 windows32位版本上运行

x64 能在 windows64位版本上运行

Any CPU 都兼容

生成时 PE32 或 PE32+头 , 执行的时候 Windows 会检查这个头,来判断程序需要32位地址还是64位地址

 

 

编译生成的玩意儿有

技术分享

CLR 就根据这些信息来生成机器码,分配内存 等等。

 

2. 执行程序集

 程序生成运行时。

技术分享

CLR 会检测 生成的程序集的所有类型,然后分配内部数据结构,管理引用类型。

数据结构都有地址,对这个结构初始化的时候,会调用 JITCompiler。

JITCompiler 会验证 IL代码,并编译成CPU指令。 然后保存到内存块儿中。

返回内部结构,修改引用。

 

以上步骤指挥在第一个步骤,只会在第一次执行的时候执行。 以后都直接调用内存里已经编译好的。

JITCompiler  生成的代码会根据硬件来生成特殊指令优化性能。

 

当有一些大型程序启动慢的时候。你就需要用到 ngen.exe

他就跳过了动态编译这一步,直接编译成机器码。 提高了这部分的性能。

不过也无法享受,动态编译后带来的性能提升。

使用时候需要斟酌。

 

 

这流程,在其他操作系统下就可以随意执行IL代码 实现跨平台。 MONO 就是这样来的

 

 

 

 

 

 

 

 

01 CLR 的执行模型

标签:

原文地址:http://www.cnblogs.com/HeyTommy/p/4288596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!