一次面试的时候遇到的一道题目,简要说明.NET的编译过程,在网上看了很多资料,简单总结如下:

  1、一般的编译过程

  通常高级语言的程序编译过程是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行。

  

  2、.NET程序的编译与之类似:首先编写好的源代码,然后编译为微软中间语言代码,运行的时候即时编译为本地机器语言,同时.NET代码运行时有一个CLR(运行时)环境来管理程序;

  

  

  MSIL  

  采用某种熟悉的语言编写完毕的.NET源程序被.NET Framework中该语言的编译器编译成PE(Portable Executable,可移植可执行)文件,这个以.EXE或者.DLL为扩展名的文件是与计算机操作系统和硬件环境无关的中间语言代码文件,称为MSIL(MS Intermediate Language)代码文件。PE文件主要包括两部分,IL代码和元数据。元数据是描述PE文件内容的含义的数据。

  JIT

  当在某个具体的计算机上要执行编译后的PE文件时,.NET Framework调用“Just-In-Time”(即时)编译器,在.NET Framework类库的支持下,结合具体的操作系统和硬件环境,编译成最终的可执行代码。

  .NET Framework  

  在每台计算机上安装.NET Framework后,一次编写的.NET应用程序就可以跨操作系统平台和硬件环境执行。.NET中实现这一功能的原理和Java差不多,.NET Framework的作用就好比是Java的虚拟机。

  .NET Framework中提供了两个编译器。一个编译器是每门程序语言的编译器,这个编译器编译后的代码只是与硬件环境无关的中间代码MSIL。每台计算机上安装的“Just-In-Time”编译器最后完成与具体的硬件环境有关的可执行代码的编译。

  由此引出的两个概念是:.NET Framework跨平台和跨语言两大主要特征

  1、跨平台  

    在每台计算机上安装.NET Framework后,我们编写的.Net源程序就能被编译成与操作系统和硬件无关的中间语言文件(EXE或DLL),程序员在编写.NET程序时,无论采用什么样的平台进行开发,最后都可以在.NET Framework的支持下移植到其他不同的平台上。硬是要与JAVA比较的话,如果把.NET Framework理解为Java虚拟机的功能,那么MSIL文件就好比是Java的字节码文件。

  2、跨语言  

    .NET Framework中设计了一个通用语言系统(Common Language System,CLS),定义了很多标准的数据类型,.NET Framework支持的所有高级语言都必须同时支持该系统对数据类型的定义。

    在编译成MSIL代码的同时,各种高级语言自身的数据类型都被转换成了CLS系统中的标准数据类型,比如,VB.NET中定义的Integer数据类型被转换成了System.Int32数据类型,C#中的int类型也被转换成了System.Int32数据类型。这样不同语言的变量就可以相互交换信息了,这就是.NET Framework支持混合语言编程的基本原理。

    从直观来看,工具Microsoft Visual Studio2010中提供多种编程语言可供选择,如C#、C++、F#、VB,据说目前.Net已经能支持20多种编程语言的托管和编译。

                                                    注:部分内容来自网络

.NET程序编译和运行的更多相关文章

  1. .NET概念:.NET程序编译和运行

    .NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...

  2. c++ 程序编译后运行时的内存分配

    程序编译后运行时的内存分配 太好的文章了,看到不得不转,转自:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一.编译时与运行时的内存情况 1 ...

  3. Java程序编译和运行的过程

    Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode)  2 ...

  4. Java程序编译和运行的过程【转】

    转自:http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来 ...

  5. java 程序编译和运行过程

    java整个编译以及运行的过程相当繁琐,我就举一个简单的例子说明: Java程序从源文件创建到程序运行要经过两大步骤: 1.源文件由编译器编译成字节码(ByteCode): 2.字节码由java虚拟机 ...

  6. Java程序编译和运行过程之 一个对象的生命之旅(类加载和类加载器)

    Java程序从创建到运行要经过两个大步骤 1:源文件(.java)由编译器编译成字节码ByteCode(.class) 2:字节码由Java虚拟机解释并运行 源文件编译成字节码,主要分成两个部分: 1 ...

  7. 利用文本编辑器输入Hello.java,并在JDK环境下编译和运行。请将程序编译、运行的结果

  8. 4.用文本编辑器输入课堂上练习的Hello.java,并在JDK环境下编译和运行。请将程序编译、运行的结果截图,填入下框中。

    一开始报错是因为在文本框了的:用的是中文下的,应该用英文下的;

  9. .NET程序的编译和运行

    程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行. 下图为传统代码编译运行过程: .NET的编译和运行过程与之类似,首先编写好的源代码,然 ...

随机推荐

  1. Hadoop on Mac with IntelliJ IDEA - 10 陆喜恒. Hadoop实战(第2版)6.4.1(Shuffle和排序)Map端 内容整理

    下午对着源码看陆喜恒. Hadoop实战(第2版)6.4.1  (Shuffle和排序)Map端,发现与Hadoop 1.2.1的源码有些出入.下面作个简单的记录,方便起见,引用自书本的语句都用斜体表 ...

  2. WAF指纹探测及识别技术<freebuf>

    Web应用防护系统(也称:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HT ...

  3. 创建C#串口通信程序详解

    在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports.这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信.我们将使用标准 ...

  4. .Net 应用程序如何在32位操作系统下申请超过2G的内存【转】

    作者: eaglet 2008 年我写过一篇博客叫 <让.Net 应用程序突破2G的内存访问限制> 这篇博客主要讲述了如何在32位操作系统下利用AWE 扩展访问超过2G的内存.AWE方式虽 ...

  5. 【MongoDB】mongoimport and mongoexport of data (一)

    In the software development, we usually are faced with a common question of exporting or importing d ...

  6. Linux中搭建SVNserver

    一 下载工具 1. subversion-1.6.17.tar.gz 2. subversion-deps-1.6.17.tar.gz 二 解压两个包: 1.在此之前,我已经创建了一个用户svnroo ...

  7. QoS 测量 (目标,方法,协议)

    本文翻译自ITU-T的Technical Paper:<How to increase QoS/QoE of IP-based platform(s) to regionally agreed ...

  8. swift 3.0基本数据语法

    swift 3.0 字符串的介绍 OC和Swift中字符串的区别 在OC中字符串类型时NSString,在Swift中字符串类型是String OC中字符串@"",Swift中字符 ...

  9. Android记录一个setTextColor常见的一个bug

    今天写代码 一不小心就犯了个错误. 细致检查才发现,仅记录一下,防止各位同学犯相同的错误哦 代码例如以下: remote.setTextColor(summaryId, R.color.news_ha ...

  10. cocos2dx-jsb 跨语言调用及第三方集成 - 过程记录

    1:C++中调用js方法: 问题:ios中当用户通过home键将游戏转入后台时,调用js中的暂停游戏方法: AppDelegate::applicationDidEnterBackground() 和 ...