zoukankan      html  css  js  c++  java
  • 第一章 CLR执行模型

      发现看过好几遍还是会忘记,因水平有限理解的不是很到位。欢迎各位大神及时指正。

    CLR执行模型

    1.1编译器将源代码编译成托管模块

       托管模块:是标准的windows可移植执行体文件(PE32(32位机器),或者PE32+(64位机器))它们需要CLR 才能执行

    1.2 编译器将托管模块合并成程序集

    托管模块有四个概念:

    1. PE32,PE32+文件 文件头
    2. CLR头 :标识了要求的CLR版本、标识、托管模块入口方法
    3. 元数据 :数据表集合,一方面描述了模块定义的东东,另外一方面描述了引用的一些东东。东东=类型和成员。(编译器智能感知的数据来源)
    4. IL代码(中间语言)运行时候将IL代码转化为本机cpu指令

    多个托管模块合并成程序集

    1.3 加载公共语言运行时(CLR)(双击可运行程序时候加载)

       电脑上安装了.NET Framework。打开exe程序的时候,windows系统检查EXE文件头,决定加载64还是32位的MSCorEE.dll,进程的主线程调用MSCorEE.dll 的一个方法,这个方法会初始化CLR,再加载exe程序集,然后调用exe的入口方法即main函数。随即托管应用程序启动并且运行。

     CLR的核心功能:

          内存管理、程序集加载、安全性、异常处理和多线程

    因此面向CLR编程的所有语言都具有以上特性

    1.4执行程序集的代码

    执行过程:运行可执行文件时候,先是FrameWork 初始化了CLR,CLR有托管模块的入口方法。执行exe之前CLR做如下几件事情:

    1. 检测你的方法种引用的所有类型,检查之后分配一个内部结构来管理这些被引用的类型。每个类型定义的所有方法,重点(每个类型的所有方法)都有一个对应项,每个对应项都有一个地址,根据地址就能找到方法的实现。
    2. 初始化刚才的那个结构时候每个记录项呢都会被设置成包含在CLR内部的未编档函数(成为JITCompiler),方法内部每个方法被首次调用时候发生了如图的事情。

     

     

    1. 第二次执行时候下图:第二次去执行Writeline函数呢?此时内部结构中Writeline函数入口的地址指向的已经是编译好的CPU指令的地址了,所以也就不会去执行JITCompiler这个函数。

     

     

  • 相关阅读:
    windows(64位)下使用curl命令
    ThinkPHP 3.2 性能优化,实现高性能API开发
    如何摆脱恨死人的低价竞争对手
    火狐浏览器如何js关闭窗口的几种解决方法
    当 Swoole 遇上 ThinkPHP5 世界你好
    TCP网络编程杂谈
    SQL语句操作优先级顺序
    记一次常规的Mysql数据库访问的时间分析
    CSS艺术字
    Eclipse Oxygen创建maven web项目(二)
  • 原文地址:https://www.cnblogs.com/LiMin/p/10712789.html
Copyright © 2011-2022 走看看