读经典——《CLR via C#》(Jeffrey Richter著) 笔记_方法执行
【前言】
- 方法执行前,CLR 会检测方法内代码引用的所有类型。同时 CLR 会分配一个内部数据结构,用来管理对所有引用的类型的访问。
- 首次执行方法时,托管程序集会把 IL 转换成本地 CPU 指令,并将其存储在一个动态分配的内存块中。 这是 CLR 的 JIT(just-in-time)编译器的功能。
- 在应用程序终止前,如果再调用同一个方法,会直接执行存储在动态分配内存块里的 CPU 指令。
【图解】
1.当 “首次” 执行方法时,实际发生的事情如下图所示
就在 Main 方法执行之前,CLR 会检测出 Main 的代码引用的所有类型。这导致 CLR 分配一个内部数据结构,它用于管理对所有引用的类型的访问。如上图所示,Main 方法引用了一个 Console 类型,这导致 CLR 分配一个内部结构。在这个内部数据结构中,Console 类型定义的每个方法都有一个对应的记录项。每个记录项都容纳了一个地址,根据此地址即可找到方法的实现。对这个结构进行初始化时,CLR 将每个记录项都设置成(指向)包含在 CLR 内部的一个未文档化的函数。我们将这个函数称为 JITCompiler。
Main 方法首次调用 WriteLine 时,JITCompiler 函数会被调用。JITCompiler 函数负责将一个方法的 IL 代码编译成本地 CPU 指令。由于 IL 是“即时”(just in time)编译的,所以通常将 CLR 的这个组件称为 JITer 或者 JIT 编译器。
JITCompiler 函数被调用时,它知道要调用的是哪个方法,以及具体是什么类型定义了该方法。然后,JITCompiler 会在定义(该类型的)程序集的元数据中查找被调用的方法的 IL。接着,JITCompiler 验证 IL 代码,并将 IL 代码编译成本地 CPU 指令。本地 CPU 指令被保存到一个动态分配的内存块中。然后, JITCompiler 返回 CLR 为类型创建的内部数据结构,找到与被调用那个的方法对应的那一条记录,修改最初对 JITCompiler 的引用,让它现在指向内存块(其中包含了刚才编译好的本地 CPU 指令)的地址。最后,JITCompiler 的函数跳转到内存块中的代码。这些代码正是 WriteLine 方法(获取单个 String 参数的那个版本)的具体实现。这些代码执行完毕并返回时,会返回到 Main 中的代码,并像往常一样继续执行。
2.方法 “再次” 执行时,实际发生的事情如下图所示
第二次调用 WriteLine。这次由于已对 WriteLine 的代码进行了验证和编译,所以会直接执行内存块中的代码,完全跳过 JITCompiler 函数。 WriteLine 方法执行完毕之后,会再次返回 Main。
注意:JIT 编译器将本地 CPU 指令存储到动态内存中。一旦应用程序终止,编译好的代码也会被丢弃。所以,如果将来再次运行应用程序,或者同时启动应用程序的两个实例(使用两个不同的操作系统进程),JIT 编译器必须再次将 IL 编译成本地指令。
相关文章
- 微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
- c# Custom numeric format strings
- C#调用Java的WebService添加SOAPHeader验证
- 【转载】C# 获取系统时间及时间格式
- C#经典实例(第4版)
- C# 获取特殊日期
- 解决C# WINFORM程序只允许运行一个实例的几种方法详解
- C#学习-访问权限修饰符(private+protected+protected internal+internal+public)
- .NET Core(C#)方法返回多个的值方法及示例代码
- .Net(C#) CefSharp Chrome 浏览器控件后台执行Iframe中的Js代码的方法
- C#并发编程经典实例--并发编程概述
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_8.1实例构造器和类A
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_dynamic基元类型
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_值类型的装箱和拆箱(二)
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(二)
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(一)
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_发布者策略控制
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_高级管理控制(配置)
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_.Net Framework 部署目标
- dotnet C# 高性能配置文件读写库 dotnetCampus.Configurations 简介
- 2019-11-29-VisualStudio-2019-尝试使用-C#-8.0-新的方式
- 2019-10-4-C#-极限压缩-dotnet-core-控制台发布文件
- C# 循环的判断会进来几次
- [C#]委托和事件(详细讲解)