CLR执行模型
好好学习底层运行机制,从CLR via C# 开始。
CLR的执行模型:

CLR:Common
Language Runtime,是一个可由多种编程语言使用的“运行时”。CLR的核心功能(比如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言(C#,Visual Basic,F#等)使用。
1.将源代码编译成托管模块:
CLR根本不关心开发人员用那一种语言来写源代码,说明我我们写C#代码的时候肯定还经过一定的步骤才能跟CLR,于是就需要相应的面向CLR的、可以编译C#代码的编译器,以便CLR可以识别你写的东西。这个编译器会检查语法和分析源代码,产生的是一个托管模块。

托管模块是一个可以在CLR中执行的PE(Portal Executable)文件。
书中介绍托管模块由PE32或PE32+头、CLR头、元数据、IL(中间语言)代码。看的时候个人觉得理解元数据和IL比较重要。
元数据:包含两种类型的元数据表:一个表描述源代码中定义的类型和成员;另一个表描述源代码引用的类型和成员
。
IL(中间语言)代码:编译器编译源代码时生成的代码。在运行时,CLR将IL编译成本地CPU指令。(IL代码有时称为托管代码,因为CLR要管理它的执行)
2. 将托管代码合并成程序集:
“CLR实际不和模块一起工作。相反,它是和程序集一起工作的。”
前面说到CLR不会识别你的具体语言,需要相应编译器生成相应的托管模块。这会又说实际不和模块一起工作,引入了程序集的概念。文中说程序集是一个抽象的概念,初学者往往难以把握它的精髓。但我看到程序集(assembly)的时候就有一种无比熟悉的感觉,很经常听到这个词,我感觉我离真相又近了一步。
就不再抄书中的概念了,抄个图:

3. 执行程序集的代码:
在第一步,即源代码编译成托管模块的时候提到:元数据总是和包含IL代码的文件关联,由于编译器同时生成元数据和代码,把它们绑定一起,并嵌入最终生成的托管模块,所以元数据和它描述的IL代码永远不会失去同步。
可想而知,当你调用入口方法(Main)的时候,元数据也跟着进来了,它们是一对好基友。

当你调用Console.WriteLine(“Hello”);时,肯定和它的元数据脱不了干系,元数据可是管着着其定义或者引用的数据结构,所以当Main方法引用了一个Console类型时,就导致了CLR分配一个内部结构。在这个内部结构中,Console类型定义的每个方法都有一个对应的记录项。每个记录项都容纳了一个地址,根据此地址即可找到方法的实现(是不是类似C中的指针?),对这个结构进行初始化时,CLR将每个记录项设置(指向)包含在一个函数中(JITCompiler),图例中可以很清楚的获知JITCompiler
函数的作用。
当第二次调用同样的方法时,如Main第二次调用WriteLine。这一次,由于已对WriteLine的代码进行了验证和编译,所以会直接执行内存块中的代码,完全跳过JITCompiler函数。WriteLine方法执行完毕之后,会再次返回Main。所以一个方法只有在首次调用的时候才会造成一些性能损失。以后对该方法的所有调用都以本地代码的形式全速运行,无需重新验证IL并把它编译成本地代码。
JIT编译器(JITCompiler)将本地CPU指令存储到动态内存中。一旦应用程序终止,编译好的代码也会被丢弃。
4. 加载公共语言运行时:
你生成的程序集既可以是一个可执行的应用程序,也可以是一个DLL(其中含有一组由可执行程序使用的类型)。最终由CLR管理这些程序集中代码的执行。
加载公共语言进行时是window的事,我们可以考虑在window的一系列操作之后会初始化CLR,然后加载exe程序集,然后调用其入口方法(Main)。随即,托管的应用程序将启动并运行。
CLR执行模型的更多相关文章
- CLR执行模型与常见的几个概念
CLR执行模型与常见的几个概念 一.CLR执行模型 1.1从代码到程序集 CLR执行的模型是从代码开始,经过编译器生成托管模块,默认情况下可以让多个托管模块和资源生成程序集.下图为其大致过程. 1.2 ...
- 第一章 CLR执行模型
发现看过好几遍还是会忘记,因水平有限理解的不是很到位.欢迎各位大神及时指正. CLR执行模型 1.1编译器将源代码编译成托管模块 托管模块:是标准的windows可移植执行体文件(PE32(32位机器 ...
- 《CLR via C#》读书笔记(1)CLR执行模型
1.1 释义 CLR 公共语音运行时 Common Language Runtime CTS 通用类型系统 Common Type System CTS.CLS是CLR的核心 CLS 通用语言规范 C ...
- CLR执行模型 流程总结(图)
如有错误,还望指出:
- CLR via C# 摘要一:托管程序的执行模型
托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...
- 01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型
.Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数.那么,CLR的执行模型 ...
- CLR 的执行模型(2)
第一章 CLR 的执行模型(2) 本篇内容大纲 Framework 类库(Framework Class Library , FCL) 通用类型系统(Common Type System,CTS) 公 ...
- 第一章 CLR 的执行模型
CLR via C# 读书笔记:第一章 CLR 的执行模型(1) 第Ⅰ部分CLR基础.这部分为三章(第一章:CLR的只想能够模型,第二章:生成.打包.部署和管理应用程序及类型,第三章:共享程序集和强命 ...
- [Clr via C#读书笔记]Cp1CLR执行模型
Cp1CLR执行模型 本章的概念点 CLR=Common Language Runtime 内存管理,程序集加载,安全性,异常处理和线程同步.CLR是基础,支持着面向它的各种语言.各种语言会被对应的编 ...
随机推荐
- hdu 4982 Goffi and Squary Partition
Goffi and Squary Partition Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Subm ...
- 自己做了一个json格式化工具,亲测可以使用
随笔背景:在向后台请求数据之后,我们常常会拿到一串json格式.此时,为了方便查看key-value,程序猿们常常使用一些在线json格式化工具或者是类似于notepadd++这样的工具进行转换.今天 ...
- MVC特性
MVC与ASP.NET MVC基础概念 MVC是Model-View-Controller的缩写. MVC将应用程序划分为3大组件:模型\视图\控制器. MVC不是ASP.NET所特有,它只是一种开发 ...
- WTFPL 开源协议
中文翻译: 你他妈的随便公共许可 版本2, 2004年12月 版权所有(C) 2004 Sam Hocevar <sam@hocevar.net> 每个人都允许复制和散布或修改本授权文件的 ...
- Anciroid的IPC机制-Binder概述
在Linux系统中,是以进程为单位分配和管理资源的.出于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭.但是,在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项 ...
- Quartz.net(调度框架) 使用Mysql作为存储
最近公司的做的项目中涉及到配置任务地址然后按照配置去目标地址提取相关的数据,所以今天上午在Internet上查看有关定时任务(调度任务)的相关信息,筛选半天然后查找到Quartz.net. Quart ...
- STC12C5A60S2笔记4(复位)
1. 基本特性 STC 单片机有5种复位方式: 1) 热启动复位: 1.1)外部RST引脚复位 第一功能复位脚,即管脚9 RST/P4.7,该管脚拉高维持24个时钟周期+10ms后,单片机进入复位状态 ...
- asp.net 验证码session为null的解决方案
最近在做Y集团的订单系统时,登陆页面在测试时发现一个以前没有注意到的问题,登陆页面需要使用验证码,引用了一个生成验证码的aspx页面,在aspx页面中生成session和验证码图片,在登陆页面的后台处 ...
- ThreadStatic应用(Identity补完)
关于Identity Identity自增序列/唯一断标识 起初做这个东西,是在一个内部组件中,用于在高并发的环境下得到一个较短的“相对”不重复标识字符串;(这里说的相对是指一定的数量下不重复) 灵感 ...
- 一个线上运营着3000+人的游戏,因为我不小心一个DROP DATABASE,全没了。 怎么办??跟我HOLD住!!!
前言 今天下午3点,我按照惯例,打开游戏服务器,开新服部署嘛,游戏在腾讯开放平台,简单.闭着眼睛都OK.于是一轮子的复制黏贴拷贝,把服务器加起来,然后启动查看日志. ....突然发现不断的有Excep ...