zoukankan      html  css  js  c++  java
  • CLR 基础

    最近在看重温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

  • 相关阅读:
    在TreeView控件节点中显示图片
    PAT 甲级 1146 Topological Order (25 分)
    PAT 甲级 1146 Topological Order (25 分)
    PAT 甲级 1145 Hashing
    PAT 甲级 1145 Hashing
    PAT 甲级 1144 The Missing Number (20 分)
    PAT 甲级 1144 The Missing Number (20 分)
    PAT 甲级 1151 LCA in a Binary Tree (30 分)
    PAT 甲级 1151 LCA in a Binary Tree (30 分)
    PAT 甲级 1149 Dangerous Goods Packaging
  • 原文地址:https://www.cnblogs.com/JackWang/p/2132842.html
Copyright © 2011-2022 走看看