.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 ...
随机推荐
- video兼容--可用
兼容ie6,7,8,但是播放器会卡顿黑屏<!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- springboot+mybatis整合(单元测试,异常处理,日志管理,AOP)
我用的事IDEA,jdk版本是1.7.新建项目的时候这个地方的选择需要注意一下,springboot版本是1.5的,否则不支持1.7的jdk pom.xml <dependency> &l ...
- SSM 项目整合
SSM整合:spring + springmvc + mybatis 1.1 生成Maven项目:ar_ssm 1.2 添加jar包 <dependencies> <!-- 单元测试 ...
- saliency map [转]
基于Keras实现的代码文档 (图+说明) "Deep Inside Convolutional Networks: Visualising Image Classification Mod ...
- python第三方库,你要的这里都有
Python的第三方库多的超出我的想象. python 第三方模块 转 https://github.com/masterpy/zwpy_lst Chardet,字符编码探测器,可以自动检测文本. ...
- 基于tcp的下载文件,以及struct模块的应用。
一 基于TCP的下载 客户端: from socket import * import os def main(): tcp_socket = socket(AF_INET, SOCK_STREAM) ...
- git将多个commit合并成一个
1. 查看提交历史(最近10个) git log - 2. 回到前面第十个commit,且将后面九个commit提交的内容状态改为未提交 git reset commitID(第十个commit的ID ...
- python-路径处理path
#-*- coding:utf-8 -*- # file: class_01_path.py #本次学习:OS模块--处理路径 #F:\pythonzhm\study_181112 import os ...
- concurrent.futures模块 -----进程池 ---线程池 ---回调
concurrent.futures模块提供了高度封装的异步调用接口,它内部有关的两个池 ThreadPoolExecutor:线程池,提供异步调用,其基础就是老版的Pool ProcessPoolE ...
- android 实现一个简单纯文本的ListView
思维线路: 1.创建一个ListViewActivity,LinearLayout布局里写了一个ListView布局 2.创建一个TextView布局给ArrayAdapter适配器使用 3.将Tex ...