最近在看重温NET的经典书籍《CLR in C#》跟几年前读的时候感觉完全不同,于是打算写博客记录一下这次的读书笔记。
CLR:公共语言运行时,是一个可以被多个编程语言使用的运行库。CLR并不关心开发人员用什么语言来编写的,只要编译器是面向CLR的就可以了。假设我们用C#编写代码,C#编译器检查语法和分析源代码,最终结果会生产一个托管模板。托管模块就是一个是一个标准的32位的PE32文件。
IL:每个面向CLR编译器生产的丢是IL(中间语言)代码还有完成的元数据,元数据总是与IL代码文件关联的,元文件总是嵌入在dll/exe文件中,并嵌入在最终的托管模块中,所以IL代码与元数据永远不会不同步。
一般编译器会默认将生成的托管模块生成一个程序集,CLR直接打交道的是程序集(assembly),程序集包含一个或多个托管模块,以及资源文件,还有清单的数据块逻辑组合
JIT:及时编译,当程序运行时要执行一个方法,首先必须要将IL代码转换为CPU指令,这是通过JIT将CLR代码转换成CPU指令。
1. 当程序第一次运行时,会调用JITCompiler函数,它可以知道调用了那些方法,以及定义该方法的类。
2. 然后JITCompiler会在定义该类型的程序集的元数据中查找被调用方法的IL代码
3.分配内存块
4. JITCompiler验证IL代码并将代码转换成本地CPU指令。将指令保存在第3步分配的内存中
5. JITCompiler将被调用方法地址改为第2步的内存地址
6. 跳转到上述代码块上执行代码
再次调用该方法?
在一个程序中,我们经常反复调用同一个方法,当再次调用该方法时就不需要重复进行验证了,可以直接调用内存块中已有的本地代码,完全跳过JITCompile函数的验证和编译过程。所以同一方法只有在第一次调用时会产生一些性能损失,后续调用就可以全速进行了。
因为CLS(公共语言规范)存在,允许我们在一种语言中使用另一种语言。
CLI是.NET公共语言基础结构,CLI和.NET是有区别的,前者是公开标准,而后者是微软对这一标准的实现,Mono则是CLI的又一实现,它从来不是“可移植的.NET”。同样,C#是.NET Framework量身订做的程序语言,而不是NET