.NET程序编译和运行
一次面试的时候遇到的一道题目,简要说明.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程序编译和运行的更多相关文章
- .NET概念:.NET程序编译和运行
.NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...
- c++ 程序编译后运行时的内存分配
程序编译后运行时的内存分配 太好的文章了,看到不得不转,转自:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一.编译时与运行时的内存情况 1 ...
- Java程序编译和运行的过程
Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode) 2 ...
- Java程序编译和运行的过程【转】
转自:http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来 ...
- java 程序编译和运行过程
java整个编译以及运行的过程相当繁琐,我就举一个简单的例子说明: Java程序从源文件创建到程序运行要经过两大步骤: 1.源文件由编译器编译成字节码(ByteCode): 2.字节码由java虚拟机 ...
- Java程序编译和运行过程之 一个对象的生命之旅(类加载和类加载器)
Java程序从创建到运行要经过两个大步骤 1:源文件(.java)由编译器编译成字节码ByteCode(.class) 2:字节码由Java虚拟机解释并运行 源文件编译成字节码,主要分成两个部分: 1 ...
- 利用文本编辑器输入Hello.java,并在JDK环境下编译和运行。请将程序编译、运行的结果
- 4.用文本编辑器输入课堂上练习的Hello.java,并在JDK环境下编译和运行。请将程序编译、运行的结果截图,填入下框中。
一开始报错是因为在文本框了的:用的是中文下的,应该用英文下的;
- .NET程序的编译和运行
程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行. 下图为传统代码编译运行过程: .NET的编译和运行过程与之类似,首先编写好的源代码,然 ...
随机推荐
- PostgreSQL没有redo log multiplexing
与Oracle不同的是,PostgreSQL中压根没有这种的东西. 若以,如果因为写在线WAL文件是发生磁盘I/O错误,那么数据库系统就启动不了了. 解决的办法,我想,在PostgreSQL中,如论如 ...
- [cocos2dx]怎样将Android手机游戏移植到电视?
近期智能电视很火,我也买了一个小米电视,看片效果不错,网络也还算给力.可是,玩游戏比較蛋疼,要用遥控器,下了一个捕鱼达人试玩了一把,要用方向键控制大炮的方向和远近,再用确定键发射炮弹,根本没法玩... ...
- .net+mssql制作抽奖程序思路及源码
近期一直在研究数据库,刚好有个项目要做抽奖程序,恩,拿来练练手吧. 抽奖程序: 思路整理,无非就是点一个按钮,然后一个图片旋转一会就出来个结果就行了,可这个程序的要求不是这样的,是需要从数据库中随机抽 ...
- k-means聚类JAVA实例
<mahout in action>第六章. datafile/cluster/simple_k-means.txt数据集例如以下: 1 1 2 1 1 2 2 2 3 3 8 8 8 9 ...
- CCScrollView/CCTableView(CCTableViewDelegate CCTableViewDataSource CCTableView-滑动列表-游戏中大量使用 非常重要的一个类)
tableview scrollViewDidScroll函数中有一段 ---- 即---滑动tableview时触发的函数 : 会将全部显示的cell又一次刷新(刷新函数中调用了自己定义的ta ...
- android之BitmapFactory.Options的使用
怎样获取图片的大小? 首先我们把这个图片转成Bitmap,然后再利用Bitmap的getWidth()和getHeight()方法就可以取到图片的宽高了. 新问题又来了,在通过BitmapFactor ...
- Android典型界面设计——ViewPage+Fragment实现区域顶部tab滑动切换
一.问题描写叙述 本系列将结合案例应用,陆续向大家介绍一些Android典型界面的设计,首先说说tab导航,导航分为一层和两层(底部区块+区域内头部导航).主要实现方案有RadioGroup+View ...
- oc-31-多对象的内存管理
在每个OC对象内部,都专门有8个字节的存储空间来存储引用计数器. 引用计数器的常见操作 retain消息:堆内存中对象的计数器变量 +(该方法返回对象本身,要想计数器变量加1就要调用对象的retain ...
- java 访问修饰符
此题考察修饰符,函数定义等,故从网上搜罗了下相关资料,总结如下: 类.方法.成员变量和局部变量的可用修饰符 修饰符 类 成员访求 构造方法 成员变量 局部变量 abstract(抽象的) √ √ - ...
- WPF 之 style文件的引用
总结一下WPF中Style样式的引用方法. 一.内联样式: 直接设置控件的Height.Width.Foreground.HorizontalAlignment.VerticalAlignment等属 ...