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

  • 相关阅读:
    如何使用用Postman工具做接口自动化测试 -入门到实战篇
    python 自动化测试框架unittest与pytest的区别
    Postman接口工具如何测试WebService接口
    Python+requests+unittest+excel实现接口自动化测试框架
    速看!!python WEB接口自动化测试之requests库详解
    大佬教你美团接口自动化测试实战-0基础入门到精通
    dotnet OpenXML 转换 PathFillModeValues 为颜色特效
    dotnet 构建还原失败 NuGet.targets 错误可能原因
    WPF 简单实现一个支持删除自身的应用
    dotnet C# 反射扫描程序集所有类型会不会触发类型静态构造函数
  • 原文地址:https://www.cnblogs.com/JackWang/p/2132842.html
Copyright © 2011-2022 走看看