第一章
2020-10-29 17:37:01 1 举报
AI智能生成
《CLR via c#》第一章笔记
作者其他创作
大纲/内容
IL和验证
IL
特点
基于栈
无类型
验证
编译本机指令时候检查高级IL代码,确定代码所做一切都是安全的
本机代码生成器NGen
作用
提高应用程序的启动速度
减小应用程序的工作集
通过内存映射来共享代码,避免了每个进程都需要单独拷贝
然而
没有知识产权的保护
NGen生成的文件可能失去同步
较差的执行性能
Framework类库
通用类型系统CTS
基本成员
事件
属性
方法
字段
所有的基类System.object
比较两个示例相等
获取示例哈希
查询一个实例的真正类型
执行实例的浅(按位)拷贝
获取实例对象当前状态的字符串表示
公共语言规范CLS
IL可以使用CLR/CTS的全部功能,但CLS是定义了所有语言都必须支持的最小功能子集
定义了类型的每个成员要么是字段要么是方法
与非托管代码的互操作性
托管代码能调用DLL中的非托管函数
托管代码可以使用现有COM组件
非托管代码可以使用托管类型
托管模块
各自源代码和编译器的结果(中间语言和元数据)
组成
PE32/32+头
CLR头
元数据
描述源代码中定义的类型和成员
描述源代码引用的类型和成员
IL代码
运行时,CLR将IL编译为本机CPU指令
细节
元数据用途
避免了对头库文件的需求
智能感知
CLR的代码验证过程使用元数据保证代码执行类型安全的操作
允许将对象的字段序列化然后发送再反序列化重建对象状态
允许垃圾回收器跟踪对象生存期,知道对象类型和引用了什么
程序集
特点
重用,安全性和版本控制的最小单位,clr的世界中,其相当于“组件”
一个或多个模块/资源文件的逻辑分组
“有清单的托管模块”
组成
清单:描述程序集中的文件集
托管模块+资源文件
加载CLR
执行程序集的代码
JIT(just in time)
console.writeLine为例子,首先找到有console这个类型的程序集,然后通过元数据找到其writeLine这个方法的IL
每个方法有个记录项为jitCompiler函数,第一次初始化,先分配内存块并把IL编译成本机CPU指令,然后令对应方法的jitCompiler指向这个内存块,然后执行内存块的指令并返回。然后当后面第二次调用时候,因为该方法的jitCompiler已经指向了一个编译好的本机CPU指令的内存块,所以就可以直接执行内存块的指令,无需再编译,整个过程只在第一次调用有开销。
指令编译时被分配的内存块是动态分配的,因此一旦退出程序,编译好的指令也会丢失
aot(ahead-of-time)
工作集
是指在进程的所有内存中,已映射的物理内存的那一部分
0 条评论
下一页