首先简单说一下计算机软件运行。所谓软件运行,就是一步一步做一些事情。计算机只认识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编译原理简单介绍的更多相关文章

  1. Docker系列之原理简单介绍

    目录 1.1.Docker架构简介 1.2.Docker 两个主要部件 1.3.虚拟机和Docker对比: 1.4.Docker内部结构 Docker系列之原理简单介绍 @ Docker是一个开源的应 ...

  2. LDAP服务器的概念和原理简单介绍

    LDAP服务器的概念和原理简单介绍 1. 目录服务 目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不 ...

  3. CAS单点登录原理简单介绍

    1. SSO简介 1.1 单点登录定义 单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统. ...

  4. Android通过辅助功能实现抢微信红包原理简单介绍

    简书文章:https://www.jianshu.com/p/e1099a94b979 附抢红包开源项目地址,代码已全改为Kotlin了,已适配到最新微信7.0.5版本,如果对你有所帮助赏个star吧 ...

  5. 编译原理简单语法分析器(first,follow,分析表)源码下载

    编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...

  6. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  7. 【Dubbo基础】dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  8. Net编译原理简单

    转载:http://blog.csdn.net/sundacheng1989/article/details/20941893 首先简单说一下计算机软件运行.所谓软件运行,就是一步一步做一些事情.计算 ...

  9. Git学习笔记1--Git原理简单介绍

    Git是一个分布式的版本号控制工具,假设想用github等版本号控制系统,核心就是git,以下简介一些git的基础原理,原文:http://git-scm.com/book/en/Getting-St ...

随机推荐

  1. springmvc前端控制器的三种拦截方式

    *.do :只拦截.do文件 / :拦截除jsp页面的所有请求,包括restful类型的url /*  :拦截所有请求包括jsp页面

  2. c#线程间传递参数

    线程操作主要用到Thread类,他是定义在System.Threading.dll下.使用时需要添加这一个引用.该类提供给我们四个重载的构造函数(以下引自msdn).        Thread (P ...

  3. php创建临时表

    $sql= "create temporary table yc_linshi ( img varchar(100) not null, openid varchar(50) not nul ...

  4. TP微信扫码支付

    1.官网下载php扫码支付adk,放在项目引入第三方类库中 2.配置config中相关参数 注意:可能会遇到问题 微信支付错误问题的解决:curl出错,错误码:60 Fatal error: Unca ...

  5. Android悬浮框,在Service中打开悬浮窗;在Service中打开Dialog;

    文章介绍了如何在Service中显示悬浮框,在Service中弹出Dialog,在Service中做耗时的轮询操作: 背景需求: 公司的项目现在的逻辑是这样的:发送一个指令,然后3秒一次轮询去查询这个 ...

  6. 调整SQLServer最大服务器内存参数后实例停止且无法启动

    很显然问题原因是:限制内存并应用后,SQLServer内存不足自动停止,并且无法正常启动之 解决,以最小模式启动SQLServer实例,修改内存限制 --1.开启一个cmd窗口 窗口1,-f最小模式启 ...

  7. Splunk和ElasticSearch深度对比解析(转)

    转载自:http://www.sohu.com/a/154105465_354963 随着Splunk越来越被大家熟知和认可,现在市面上也不断涌各种同类产品,作为大数据搜索界的翘楚Splunk和Ela ...

  8. jQuery对象的属性操作

    jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作 html属性操作:是对html文档中的属性进行读取,设置和移除操作.比如attr().removeAttr ...

  9. 【HQL】常用函数

    CONCAT_WS(separator, str1, str2,...) 多列转1列,以分割符分割 使用场景: 1.多列在一列显示: 2.多列转多行作为辅助,结合split和explode使用 SEL ...

  10. 一、Jmeter环境介绍

    1.安装 从Apache网站http://jmeter.apache.org/download_jmeter.cgi下载二进制包. .tgz后缀名的为Linux使用的包 .zip后缀的为windows ...