.Net编译原理简单介绍
首先简单说一下计算机软件运行。所谓软件运行,就是一步一步做一些事情。计算机只认识0和1.给计算机下命令,只能是0与1的方式,确切的说,其实是CPU只认识0和1,因为软件运行是CPU控制的。人直接操作0与1是不现实的,非常复杂。所以我们需要一种接近于自然语言的方式,人能看得懂的东西,即代码。
在C语言的方式下,编译运行的过程是怎样的呢?
如图所示,从一段printf代码到计算机运行输出的过程。编译器即中介,把代码翻译成机器认识的0与1的编码。编译器与硬件紧密相连,Windows下的编译器跟Linux下的编译器是不同的,并且编译出来的东西也是不同的,只能在各自的平台上运行。编译器只认识C语言。编译器编译出来的exe文件CPU就可以直接读懂并且运行,就像一个能听懂0与1的耳朵。
在.Net的模式下,编译运行又是怎样的一种模式呢?
微软推行.NET平台的同时,推出了强大的Framework. 在XP系统的时候需要自行安装Framework, 在Win7系统中已经自动集成了。Framework的强大,再于面向对象的基础类库与运行时CLR. 基础类库即编程时可以使用的工具类,这里不多说,着重说一下CLR.运行时是程序运行的监管者,程序运行起来运行的怎么样了,是否对内存有太大的消耗,是否对内存进行整理清空,出现异常怎么进行处理,在运行时中都有相应的对策。
这里的编译器与上边的编译器不太一样。在编译的过程中,并没有编译成CPU认识的编码,而是CLR认识的编码。在编译的过程中,把框架库中的东西加进来了。编译完成结果是exe文件,但是这个exe文件是IL文件,是不能被CPU识别的,只能被CLR识别。双击这个文件,CLR会把其加载到内存中,这时要出场的就是及时编译器JIT. 及时编译器的作用就是识别IL文件,然后操作CPU去完成相应的操作。即由运行时将exe转换成CPU认识的0与1编码,操作计算机。
这里涉及到了一个概念是多语言平台的混合编程。
IL中间文件是一种标准,一种规范。只要符合这种规范的文件,都能被CLR识别运行。C#,F#,VB,编写的代码,只要提供相应的编译器,编译出来的东
西都能被CLR识别运行。而且这里为跨平台做了很好的准备。因为IL的规范是确定了的,对于C#程序的移植,比如说移植到Linux上,我们只需要有一个
能在Linux上运行的CLR就行了,这个CLR能识别在Windows上编译好的IL运行。Mono就是很好的一个例子。
上图是整个流程。还有要说明的几点。如果你
的电脑上安装后Framework,
在类似于C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe这样的路径中,找到这个CSC文
件。其实这个就是Framework的编译器。大家在使用VS的时候,按F6就进行编译,其实调用的是这个文件。或许我们直接使用命令行,都可以编译我们
写好的文件txt文件,不过还是要改后缀名为cs.
.Net的运行效率其实完全决定于JIT.
将中间语言代码根据当前的硬件与软件环境,进行运行时编译,并缓存代码。及时编译器会根据操作系统与操作系统与硬件环境对代码优化。CLR是托管代码,加
了中间层,为什么效率还高?这是JIT决定的。根据硬件平台来编译,而不是每一句代码都编译。例如空的for循环是不进行编译,提高效率。如果代码中有很
多次调用一个方法,那么CLR在JIT编译这个代码第一次以后就会将已经编译好的代码缓存起来,下一次在使用的时候,不去编译了,直接从缓存中取出编译好
的代码执行即可。还有垃圾回收机制,将不用的或者不常用的代码删除掉,如果再要使用,重新创建。整理内存,使得内存连续。
.Net编译原理简单介绍的更多相关文章
- Docker系列之原理简单介绍
目录 1.1.Docker架构简介 1.2.Docker 两个主要部件 1.3.虚拟机和Docker对比: 1.4.Docker内部结构 Docker系列之原理简单介绍 @ Docker是一个开源的应 ...
- LDAP服务器的概念和原理简单介绍
LDAP服务器的概念和原理简单介绍 1. 目录服务 目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不 ...
- CAS单点登录原理简单介绍
1. SSO简介 1.1 单点登录定义 单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统. ...
- Android通过辅助功能实现抢微信红包原理简单介绍
简书文章:https://www.jianshu.com/p/e1099a94b979 附抢红包开源项目地址,代码已全改为Kotlin了,已适配到最新微信7.0.5版本,如果对你有所帮助赏个star吧 ...
- 编译原理简单语法分析器(first,follow,分析表)源码下载
编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...
- dubbo学习过程、使用经验分享及实现原理简单介绍
一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...
- 【Dubbo基础】dubbo学习过程、使用经验分享及实现原理简单介绍
一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...
- Net编译原理简单
转载:http://blog.csdn.net/sundacheng1989/article/details/20941893 首先简单说一下计算机软件运行.所谓软件运行,就是一步一步做一些事情.计算 ...
- Git学习笔记1--Git原理简单介绍
Git是一个分布式的版本号控制工具,假设想用github等版本号控制系统,核心就是git,以下简介一些git的基础原理,原文:http://git-scm.com/book/en/Getting-St ...
随机推荐
- 第2课 类型推导(2)_decltype关键字
1. decltype关键字 (1)auto所修饰的变量必须被初始化,编译器才能通过初始化来确定auto所代表的类型,即必须先定义变量. (2)decltype可以在编译期推导出一个变量或表达式的结果 ...
- supervisor管理hive metastore和hive server2进程
1. hive_metastore.ini [program:hive_metastore] environment = JAVA_HOME=/usr/java/jdk1..0_172-amd64,H ...
- DOM内容操作和自定义、样式改变
自定义 function 方法名或函数名(参数1,参数2,...) { 方法体: return返回值:(可不写) } function abc() { alert("123"); ...
- (转)C# Oracle数据库操作类
原文地址:http://www.cnblogs.com/haibing0107/p/6143922.html using System;using System.Data;using System.C ...
- Java——ikanalyzer分词·只用自定义词库
需要包:IKAnalyzer2012_FF_hf1.jarlucene-core-5.5.4.jar需要文件: IKAnalyzer.cfg.xmlext.dicstopword.dic 整理好的下载 ...
- flask连接数据库mysql+SQLAlchemy
使用flask框架链接2种数据库 ----------db.py # -*- coding: utf-8 -*- # Flask hello world from flask import Flask ...
- 在Raid模式下装Win10找不到固态硬盘怎么办
现在新出厂的笔记本电脑中,系统的BIOS内,SATA Controller Mode默认设置的是为Intel RST Premium模式,该模式会将硬盘组成磁盘阵列的模式(Raid模式),而原版的Wi ...
- 让MySql支持表情符号(MySQL中4字节utf8字符保存方法)
UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而MySQL的utf8编码最多3个字节,所以数据插不进去. 解决方案:将编码从utf8转换成utf8mb4. 1. 修改my.in ...
- python学习之----深网和暗网
深网是网络的一部分,与浅网(surface Web)对立.浅网是互联网上搜索引擎可以抓 到的那部分网络.据不完全统计,互联网中其实约90% 的网络都是深网.因为谷歌不 能做像表单提交这类事情,也找不到 ...
- django---单表操作之展示书籍列表
下面使用python console对数据库进行增删改查 下面我们来举个例子在页面上展示记录 结果: 注意html里面变量的写法 {% for book in book_list %} <tr& ...