CLR中你想知道的事
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中你想知道的事的更多相关文章
- Spring中你可能不知道的事(一)
Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...
- 2018-11-20-UWP-开发中,需要知道的1000个问题
title author date CreateTime categories UWP 开发中,需要知道的1000个问题 lindexi 2018-11-20 09:28:53 +0800 2018- ...
- C# 范型约束 new() 你必须要知道的事
C# 范型约束 new() 你必须要知道的事 注意:本文不会讲范型如何使用,关于范型的概念和范型约束的使用请移步谷歌. 本文要讲的是关于范型约束无参构造函数 new 的一些底层细节和注意事项.写这篇文 ...
- 十件你需要知道的事,关于openstack-trove(翻译)
开源数据库即服务OpenStack Trove应该知道的10件事情 作者:Ken Rugg,Tesora首席执行官 Ken Rugg是Tesora的创始人,CEO和董事会成员. Ken的大部分职业都是 ...
- iOS Objective-C 中 bool 与 BOOL 的你不一定知道的事
测试一下这段代码: - (void)test { NSLog(@"this is an attribut: %d", anAttribute); ; i < ; i++) { ...
- 关于Unicode,字符集,字符编码,每个程序员都应该知道的事
关于Unicode,字符集,字符编码,每个程序员都应该知道的事 作者:Jack47 李笑来的文章如何判断一个人是否聪明?中提到: 必要.清晰.且准确的概念,是一切思考的基石.所谓思考,很大程度上,就是 ...
- 你想知道的3D Touch开发全在这里了
前言 iPhone 6s和iPhone 6s Plus为多点触摸界面带来了强大的3D触摸新维度.这项新技术可以感知用户按下显示屏的深度,让他们比以往任何时候都更能使用你的应用程序和游戏.更多关于3D ...
- 漫谈ElasticSearch关于ES性能调优几件必须知道的事
lasticSearch是现在技术前沿的大数据引擎,常见的组合有ES+Logstash+Kibana作为一套成熟的日志系统,其中Logstash是ETL工具,Kibana是数据分析展示平台.ES让人惊 ...
- 苹果强制使用HTTPS传输了怎么办?——关于HTTPS,APP开发者必须知道的事
WeTest 导读 2017年1月1日起,苹果公司将强制使用HTTPS协议传输.本文通过对HTTPS基础原理和通信过程内容的讲解,介绍APP开发者在这个背景下的应对办法. 几周前,我们在<htt ...
随机推荐
- 最简单的DWR例子
什么是DWR? DWR是一个Open Source的 java项目.DWR可以让JavaScript调用运行在Web服务器里面的JAVA程序.简单一点或者专业一点就是Easy AJAX for JAV ...
- Mysql-巧用join来优化sql
0. 准备相关表来进行接下来的测试 相关建表语句请看:https://github.com/YangBaohust/my_sql user1表,取经组 +----+-----------+------ ...
- Flink 源码解析 —— 深度解析 Flink 序列化机制
Flink 序列化机制 https://t.zsxq.com/JaQfeMf 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac 上搭 ...
- iOS项目之多Targets和多环境配置
项目中使用的同一套代码,但需要开发多个app,app中内容基本上相同,只有一些小小的区别,例如名称等等,每个app中又需要分开发环境(Dev).测试环境(Test).正式环境(Pro). 下面就开始搭 ...
- 《机器学习基石》---Linear Models for Classification
1 用回归来做分类 到目前为止,我们学习了线性分类,线性回归,逻辑回归这三种模型.以下是它们的pointwise损失函数对比(为了更容易对比,都把它们写作s和y的函数,s是wTx,表示线性打分的分数) ...
- 最大层内元素和----leetcode周赛150_1002
题目描述: 给你一个二叉树的根节点 root.设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推. 请你找出层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 ...
- Flutter学习笔记(21)--TextField文本框组件和Card卡片组件
如需转载,请注明出处:Flutter学习笔记(21)--TextField文本框组件和Card卡片组件 今天来学习下TextField文本框组件和Card卡片组件. 只要是应用程序就少不了交互,基本上 ...
- linux环境部署,docker如何安装redis
安装步骤 1. 安装Redis 通过docker search redis和docker pull redis下载redis镜像 2. 新建挂载配置文件夹 新建data和conf两个文件夹,位置随意. ...
- Python数据分析之numpy数组全解析
1 什么是numpy numpy是一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于大型.多维数据上执行数值计算. 在NumPy 中,最重要的对象是 ...
- Linux命令行中好用的快捷键
Ctrl + L:清屏,与clear同效: Ctrl + D:终结当前程序,向终端传递EOF(End Of File): Ctrl + A:光标移至一行命令开头: Ctrl + E:光标移至一行命令结 ...