CLR是什么?

CLR 公共语言运行时,是一个可由多个语言共同使用的运行环境,核心(内存管理,程序集加载,安全性,异常处理和多线程)

Visual Studio是一种编译器,编译器也可称为语法检查器和正确代码的分析器

Visual Studio点击生成或调试的时候干了什么?

编译器会生成一个托管模块。托管模块是一个可移植执行体(PE32)文件,如果是64位则是可移植执行体(PE32+)文件

Visual Studio为什么可以智能感知类的方法和参数?

托管模块组成包括,PE32或PE32+头,CLR 头,元数据,IL代码,重点就在元数据上,元数据是一个数据表集合,数据表中描述了模块中定义了什么,包括类型和成员,另一些描述了模块里面引用了什么,包括引用的类型和成员,而且生成的元数据和代码是绑定到一起的,所以元数据和他的描述的IL代码就能永远同步。

元数据用途:1.避免对原生C/C++头和库文件的需求 2.智能感知方法还有参数 3.代码验证,确保类型安全 4.允许对象序列化到内存块 5.允许垃圾回收期跟踪对象生存期

IL是什么,能干什么?

IL是一种高级机器语言,IL代码又被称为托管代码,是Microsoft作者们费尽心思地跟很多编译器作者们请教之后的产物,能访问和操作对象类型,并提供指令来创建和初始化对象、调用对象上的虚方法以及直接操作数组元素、还提供了抛出和捕获异常的指令来实现错误处理,

编译成IL代码之后会再次编译,最终生成能被CPU识别的机器指令,然后执行。

IL如何执行?

说到执行,首先要提到编译,IL编译要用到JIT编译器,JIT编译之后的入口函数称为JITCompiler,如何编译得到JITCompiler函数,请看下面这个代码:

static void Main(string[] args)
{
Console.WriteLine("HelloWorld");
}

执行步骤如下:

1.在负责实现类型(Console)的程序集的元数据中查找被调用的方法(WriteLine)

2.从元数据中获取该方法的IL

3.分配内存块

4.将IL编译成本机CPU指令,然后将这些本机代码存储到步骤3分配的内存中

5.在Type表中修改与方法对象的条目,使它指向步骤3分配的内存块

5.跳转到内存块中的本机代码

为什么说C++牛逼?

C++编译器是独一无二的,它是唯一允许开发人员同时写托管和非托管代码,并生成到同一个模块中。

PDB文件有什么用?

Visual Studio当使用debug模式的时候会再Debug文件夹中生成PDB文件,PDB文件可以帮助调试器查找到局部变量并将IL指令映射到源代码,进行调试。

托管代码和非托管代码的区别?

托管代码简单说就是需要经过CLR二次编译的代码,非托管代码就是可以直接编译成CPU指令的代码。

CLR中你想知道的事的更多相关文章

  1. Spring中你可能不知道的事(一)

    Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...

  2. 2018-11-20-UWP-开发中,需要知道的1000个问题

    title author date CreateTime categories UWP 开发中,需要知道的1000个问题 lindexi 2018-11-20 09:28:53 +0800 2018- ...

  3. C# 范型约束 new() 你必须要知道的事

    C# 范型约束 new() 你必须要知道的事 注意:本文不会讲范型如何使用,关于范型的概念和范型约束的使用请移步谷歌. 本文要讲的是关于范型约束无参构造函数 new 的一些底层细节和注意事项.写这篇文 ...

  4. 十件你需要知道的事,关于openstack-trove(翻译)

    开源数据库即服务OpenStack Trove应该知道的10件事情 作者:Ken Rugg,Tesora首席执行官 Ken Rugg是Tesora的创始人,CEO和董事会成员. Ken的大部分职业都是 ...

  5. iOS Objective-C 中 bool 与 BOOL 的你不一定知道的事

    测试一下这段代码: - (void)test { NSLog(@"this is an attribut: %d", anAttribute); ; i < ; i++) { ...

  6. 关于Unicode,字符集,字符编码,每个程序员都应该知道的事

    关于Unicode,字符集,字符编码,每个程序员都应该知道的事 作者:Jack47 李笑来的文章如何判断一个人是否聪明?中提到: 必要.清晰.且准确的概念,是一切思考的基石.所谓思考,很大程度上,就是 ...

  7. 你想知道的3D Touch开发全在这里了

    前言 iPhone 6s和iPhone 6s Plus为多点触摸界面带来了强大的3D触摸新维度.这项新技术可以感知用户按下显示屏的深度,让他们比以往任何时候都更能使用你的应用程序和游戏.更多关于3D ...

  8. 漫谈ElasticSearch关于ES性能调优几件必须知道的事

    lasticSearch是现在技术前沿的大数据引擎,常见的组合有ES+Logstash+Kibana作为一套成熟的日志系统,其中Logstash是ETL工具,Kibana是数据分析展示平台.ES让人惊 ...

  9. 苹果强制使用HTTPS传输了怎么办?——关于HTTPS,APP开发者必须知道的事

    WeTest 导读 2017年1月1日起,苹果公司将强制使用HTTPS协议传输.本文通过对HTTPS基础原理和通信过程内容的讲解,介绍APP开发者在这个背景下的应对办法. 几周前,我们在<htt ...

随机推荐

  1. Android Bluetooth Low Energy (BLE)简单方便的蓝牙开源库——EasyBLE

    源码传送门 最新版本 功能 支持多设备同时连接 支持广播包解析 支持连接同时配对 支持搜索系统已连接设备 支持搜索器设置 支持自定义搜索过滤条件 支持自动重连.最大重连次数限制.直接重连或搜索到设备再 ...

  2. RE最全面的正则表达式----字符验证

    二.校验字符的表达式汉字:^[一-彪]{0,}$英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$长度为3-20的所有字符:^.{3,20}$由26个英文字母组成的字 ...

  3. vue中的虚拟DOM树

    什么是虚拟DOM树?(Virtual DOM)   虚拟DOM树其实就是一个普通的js对象,它是用来描述一段HTML片段的    01    当页面渲染的时候Vue会创建一颗虚拟DOM树 02    ...

  4. Android——倒计时跳转+sharedpreferences

    public class MainActivity extends Activity { // 3秒钟后,从图1跳转到图2(10) private Handler handler=new Handle ...

  5. 利用反射搭建orm框架

    1思路 根据java反射获取属性上的 注解的value的值 然后拼接成sql去执行 这就是完成了一个orm实体关系映射 package src.Test.Reflect;import java.lan ...

  6. windiows下搭建python+selenium+unittest+Chrome的Web自动化环境

    一.selenium.unittest概念 Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架.它是一款用于运行端到端功能测试的超强工具.您可以使用多个编程语言编写测试,并且 ...

  7. mysql主从不同步处理过程分享

    背景  8月7日15:58收到报障数据库出现不同步:数据库共四台,分别为10.255.70.11,10.255.70.12,10.255.70.13,10.255.70.14(ip为虚拟ip) 数据库 ...

  8. thinkPHP 获得当前请求的全部常量信息

    tp框架提供了常量: http://网址/shop/index.php/分组/控制器/操作方法/名称1/值/名称2/值 __MODULE__: 路由地址分组信息 (/shop/index.php/分组 ...

  9. 防抖(debounce)和节流(throttle)

    场景说明:一般我们在前端页面中会给元素绑定click.scroll.onmousemove.resize等事件,这些事件的执行函数如果是去发请求获取数据的话,我们无意识的连续点击或者连续滚动会给服务器 ...

  10. 五分钟学会悲观乐观锁-java vs mysql vs redis三种实现

    1 悲观锁乐观锁简介 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果 ...