CLR Via C# 第一章(CLR的执行模型)——读书笔记

CLR(common language runtime) 公共语言运行时 是一种可由多个编程语言使用的"运行时"

CLR的核心功能(内存管理,程序集加载,安全性,异常处理和线程同步)可由面向CLR的所有语言使用


CLR执行模型

1.将源代码编译成托管模块

在使用对应编译器对一种支持CLR的语言进行编译时,结果都是托管模块(managed model)(包括中间语言(IL)以及元数据(描述模块中定义或引用了什么类型或变量))


2.将托管模块合并成程序集

程序集是一个或多个模块和资源文件的逻辑性分组,具有自描述特性。


3.加载公共语言运行时

以各种配置加载程序集


4.执行程序集代码

为了执行程序集中的托管模块中的方法,必须把IL转换成本机CPU指令,这是JIT(Just In Time)编译器的职责。

如 Console.WriteLine方法执行

首先,先获得方法的类型Console

CLR分配一个内部数据结构,其中记录了Console类型的方法入口,根据入口的地址可以找到方法的实现方式,当这个结构初始化时,CLR将每个记录(方法)的入口地址指向CLR内部的一个函数(JITComplier)

JITComplier函数具体执行

a.在负责实现类型Console的程序集的元数据中查找被调用的方法WriteLine

b.获取该方法IL+验证IL代码

c.分配内存块

d.将IL编译成本机CPU指令,存储在c的内存块中

e.修改那个内部数据结构表中对JITComplier函数的引用转为指向该内存块(含刚才的CPU指令)


注1:在程序第二次执行WriteLine方法时则直接跳过JITComplier函数,直接执行内存块的代码。


注2:

IL验证——为了检查代码安全

核实参数个数,类型,返回值等。

托管模块中的元数据包含的所有方法的类型,信息,可供验证


不安全代码

不安全的代码允许直接操作内存地址,并可操作地址处的字节,在非托管代码操作或者高效率算法时需要用到

  

unsafe
           {
                int[] array = new int[5];
                for (int i = 0; i < array.Length; i++)
                {
                    array[i] = i;
                }
                fixed (int* p = array)
                {
                    for (int i = 0; i < array.Length; i++)
                    {
                        Console.WriteLine(p[i]);
                    }
                }
            }
unsafe标志不安全代码段

fixed使得p固定指向array

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值