转载:http://blog.csdn.net/sundacheng1989/article/details/20941893

首先简单说一下计算机软件运行。所谓软件运行,就是一步一步做一些事情。计算机只认识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. 编译原理简单语法分析器(first,follow,分析表)源码下载

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

  2. .Net编译原理简单介绍

    首先简单说一下计算机软件运行.所谓软件运行,就是一步一步做一些事情.计算机只认识0和1.给计算机下命令,只能是0与1的方式,确切的说,其实是CPU只认识0和1,因为软件运行是CPU控制的.人直接操作0 ...

  3. .NET程序的简单编译原理

    1.不管是什么程序,最终的执行官是CPU,而CPU只认识1和0的机器码. 2.我们现在写的一般是高级语言写的程序.CPU是不认识我们用高级语言写的源代码的,那应该怎么办才能让CPU执行我们写好的程序尼 ...

  4. 编译原理(简单自动词法分析器LEX)

    编译原理(简单自动词法分析器LEX)源程序下载地址:  http://files.cnblogs.com/files/hujunzheng/%E6%B1%87%E7%BC%96%E5%8E%9F%E7 ...

  5. C#基础--.net平台的重要组成部分以及.net程序简单的编译原理

    .net平台的组成只要有两部分   FCL:框架类库    CLR:公共语言运行时 .net程序简单的编译原理 1.0:使用C#编译器(csc.exe) 将C#源代码编译成程序集+{编译之前:会检查C ...

  6. Java 实现《编译原理》简单-语法分析功能-LL(1)文法 - 程序解析

    Java 实现<编译原理>简单-语法分析功能-LL(1)文法 - 程序解析 编译原理学习,语法分析程序设计 (一)要求及功能 已知 LL(1) 文法为: G'[E]: E→TE' E'→+ ...

  7. Java 实现《编译原理》简单词法分析功能 - 程序解析

    Java 实现<编译原理>简单词法分析功能 - 程序解析 简易词法分析功能 要求及功能 (1)读取一个 txt 程序文件(最后的 # 作为结束标志,不可省去) { int a, b; a ...

  8. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...

  9. 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...

随机推荐

  1. 那些H5用到的技术(1)——素材加载

    编码环境前言什么时候用到素材加载?loading提示,让用户等待图片的加载音频的加载利用神器PreloadJS总结 编码环境 Sublime Text 3 插件包括: Autoprefixer 自动补 ...

  2. C#常用的引用

    1.使用ConfigurationManager需要在.net引用中添加System.Configuration引用 2.使用HttpContext需要在.net引用中添加System.Web引用

  3. Docker搭建tomcat运行环境(修改镜像方式)

    对于java程序员来说,要想使用Docker来部署你的应用,那么在镜像中安装类似于tomcat的容器基本上是必须的(sprintboot项目除外),本篇介绍自己基于对centos镜像的修改,创建自己的 ...

  4. sencha touch dataview 中添加 button 等复杂布局并添加监听事件

    config 中的属性默认都会自动生成   getter   setter  applier  updater 四个方法. applier 在调用  setter 时被调用, updater 在属性值 ...

  5. TOJ 1836 Play on Words

    描述 Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has t ...

  6. IE浏览器报Promise未定义

    用vue-cli做的项目,用了promise,结果IE下报promise未定义,甚至在比较老的andriod手机浏览器上会显示空白页面,解决方案如下: 首先安装:babel-polyfill npm ...

  7. 学习笔记之--认识Xcode中的重要成员:lldb调试器

    之前对lldb调试器了解比较少,平时主要用来打印日志和暂定时用鼠标查看属性数据以及使用p po一些简单的命令语句. 今天看了一些关于lldb的文章,顿时觉得之前对它了解太少了,原来它还有那么多的功能. ...

  8. Codeforces 494E. Sharti

    Description 有一个 \(n*n\) 的矩形,给出 \(m\) 个子矩形,这些矩形内部的点都是白色的,其余的点都是黑色,每一次你可以选择一个变长不超过 \(k\) 的正方形,满足这个正方形的 ...

  9. linux设置别名

    1.查看别名: alias 2.临时设置别名 alias show='ls -al' 3.永久生效 vi 家目录/.bashrc alias mmm='mysql -uroot -p' 4.删除别名 ...

  10. spring设置字符编码过滤器

    一.在web.xml中的配置 <!-- characterEncodingFilter字符编码过滤器 --> <filter> <filter-name>chara ...