第一部分 CLR基础:第1章 CLR的执行模型
1.1将源代码编译成托管模块
每个面向CLR的编译器生成的都是IL(中间语言)代码,或称为托管代码,因为CLR管理它执行;另外编译器还要在每个托管模块中生成完整的元数据,元数据是一组数据表,一些数据表描述模块中定义的内容,比如类型及其成员。还有一些元数据表描述了托管模块引用的内容,比如导入的类型及其成员。
元数据作用:1.编译后可以解析元数据,才有“智能感知”。2.将对象属性序列化和反序列化。
注:CLR(Common Language Runtime)公共语言运行时 核心功能:内存管理、程序集加载、安全性、异常处理、线程同步
1.2将托管模块合并成程序集
清单是有一个或多个元数据表构成的集合,描述构成程序集的文件。
程序集是一个或多个模块/资源文件的逻辑分组。“程序集”可以将一组文件当作一个实体来对待。
1.3加载公共语言运行时
生成的程序集可以是exe文件或dll文件,最终由CLR管理执行。
1.4执行程序集的代码
可以将IL看作是一种面向对象的机器语言。
执行一个方法:IL -> CPU指令(由CLR的JIT just-in-time即使编译器的来转换)
Main方法执行前,CLR检测出Main代码引用的所有类型,分配一个内部数据结构来管理对所引用类型的访问。上图中内部结构中,Console类型定义的每个方法都有一个对应的记录项,每个记录都容纳了一个地址,根据地址可以找到方法的实现。
对这个结构进行初始化时,CLR将每个记录项都设置成(指向)包含在CLR内部的一个未文档化的函数(JITCompiler)。
Main方法首次调用WriteLine时,JITCompiler函数会被调用。JITCompiler函数负责将一个方法的IL代码编译成本地CPU指令。
JITCompiler
函数被调用时,它知道要调用的是哪个方法,以及具体是什么类型定义了该方法。然后,JITCompiler会在定义(该类型的)程序集的元数据中查找被调
用的方法的IL。接着,JITCompiler验证IL代码,并将IL代码编译成本地CPU指令。本地CPU指令被保存到一个动态分配的内存块中。然
后,JITCompiler返回CLR为类型创建的内部数据结构,找到与被调用的方法对应的那一条记录,修改最初对JITCompiler的引用,让它指
向内存块中的代码。这些代码正是WriteLine方法(获取String参数的那个)的具体实现。这些代码执行完毕并返回时,会返回到Main中的代
码,并像往常一样继续执行。
个人简化理解:CLR
检查方法中引用的类型,分配一个内部数据结构来保存对类型的访问,类型中定义的方法对应一个记录,记录指向CLR内部函数JITCompiler,方法调
用后对应的JITCompiler开始执行,找到程序集元数据中方法的IL,验证IL,转换为CPU指令并保存到动态内存中,将记录修改指向这个内存中的
代码,执行代码,返回,程序继续往下执行...
1.6 Framework类库
.NET Framework中包含了Framework类库(Framework Class Library,FCL),FCL是一组DLL程序集的统称。
1.7通用类型系统
微软制定的正式类型规范:Common Type System,CTS 它描述了类型的定义和行为。
方法签名:是否有返回值,返回值的类型;参数的类型、数量及顺序。
1.8公共语言规范
公共语言规范(Common Language Specification, CLS),任何编译器生成的类型想兼容于其他“符合CLS、面向CLR的语言”所生成的组件,就必须支持这个最小功能集。允许一种语言中使用由另一种语言创建的对象。
第一部分 CLR基础:第1章 CLR的执行模型的更多相关文章
- 第一模块·开发基础-第1章 Python基础语法
Python开发工具课前预习 01 Python全栈开发课程介绍1 02 Python全栈开发课程介绍2 03 Python全栈开发课程介绍3 04 编程语言介绍(一) 05 编程语言介绍(二)机器语 ...
- 第一部分 CLR基础:第3章 共享程序集和强命名程序集
第一部分 CLR基础:第3章 共享程序集和强命名程序集
- 第一章 CLR 的执行模型
CLR via C# 读书笔记:第一章 CLR 的执行模型(1) 第Ⅰ部分CLR基础.这部分为三章(第一章:CLR的只想能够模型,第二章:生成.打包.部署和管理应用程序及类型,第三章:共享程序集和强命 ...
- 第一章 CLR执行模型
发现看过好几遍还是会忘记,因水平有限理解的不是很到位.欢迎各位大神及时指正. CLR执行模型 1.1编译器将源代码编译成托管模块 托管模块:是标准的windows可移植执行体文件(PE32(32位机器 ...
- CLR基础之一---认识CLR [《CLR via C#》读书笔记]
<CLR via C#>读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.Net虚拟机所选用的名称.这 ...
- Windbg CLR基础小测 《第六篇》
首先写一段代码如下: namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Console ...
- 01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型
.Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数.那么,CLR的执行模型 ...
- 第1章 CLR的执行模型
1.1将源代码编译成托管代码模块
- 第22章 CLR寄宿和AppDomain
22.1 CLR寄宿 CLR Hosting(CLR 宿主)的概念:初始启动.Net Application时,Windows进程的执行和初始化跟传统的Win32程序是一样的,执行的还是非托管代码,只 ...
- CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码
CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...
随机推荐
- arm-linux-objcopy
被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换示例: arm-linux-objcopy –O binary –S file.elf file.bin 常用的选项(大写) ...
- SQL Server 2005中的分区表(三):将普通表转换成分区表(转)
在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了. 那么,如何将一个普通表转换成一个分区表 呢?说到底, ...
- eclips中增加对jar包的引用
http://jingyan.baidu.com/article/ca41422fc76c4a1eae99ed9f.html
- SQL查询包含汉字的行
1.查询字段首位为汉字 2.查询字段包含汉字(任意位) SELECT * FROM 表名 WHERE 字段 LIKE '%[吖-座]%' --[吖-座]是中文字符集第一个到最后一个的范围
- Using Redis as Django's session store and cache backend
http://michal.karzynski.pl/blog/2013/07/14/using-redis-as-django-session-store-and-cache-backend/
- 页面设计--Tree目录树
Tree目录树控件属性: 根据数据集合来配置相应的信息 加载模式有自动加载.自定加载 web中显示效果图:
- @InitBinder
类型转换: 请求url: http://localhost:8080/SSHDemo2/stu/pro?s=zk,19 传入参数 s=zk,19 转换为Student public class ...
- Hadoop有关的网站
软件下载: http://archive.apache.org hbase对Hadoop的支持矩阵: https://hbase.apache.org/book.html#configuration
- Java8新特性【转】
地址:http://ifeve.com/java-8-features-tutorial/ 1.简介 毫无疑问,Java 8是自Java 5(2004年)发布以来Java语言最大的一次版本升级,Ja ...
- Memcached、Redis和MongoDB的区别
Memcached和Redis都是内存数据库. Memcached是多线程运行的: Redis单线程是单线程运行的: MongoDB是文档型的非关系型数据库..Net:RavenDB.