• 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

  • 相关阅读:
    CentOS7 安装 JIRA 7.2.x 教程:下载、安装、汉化、破解
    安装 GraphicsMagick
    CentOS 7 yum 安装 Nginx
    CentOS 安装 OpenResty
    软件工程技术面试个人指南
    五线谱
    中央C-高低音谱号里的中央C和其它音节
    使用管道copy同一文件至多个目录下
    refusing to merge unrelated histories
    Viewing A Specific Commit_12
  • 原文地址:https://www.cnblogs.com/JackWang/p/2132842.html
Copyright © 2020-2023  润新知