.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的编译和运行过程与之类似,首先编写好的源代码,然 ...
随机推荐
- Object-C基础
cocoa 类: 传统的写法:Demo.h // // Demo.h // demoClass // // Created by 王 on 13-12-16. // Copyright (c) 201 ...
- sqldependency 支持的select
https://msdn.microsoft.com/library/ms181122.aspx 支持的 SELECT 语句 满足下列要求的 SELECT 语句支持查询通知: 必须显式说明 SEL ...
- .net处理JSON简明教程
.net处理JSON简明教程 Json.Net是.net中的一种流行的高性能的JSON框架. 特点 灵活的JSON序列化转化.net对象为JSON字符串.和把JSON字符串转换为.net对象. 手动读 ...
- You don't have permission to access / on this server
配置虚拟主机的时候,里面加上如下: <Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOv ...
- Servlet 3.0 新特性
Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发 ...
- Ubuntu目录
1. java.io.FileNotFoundException: ***(Too many open files) 2. 在Ubuntu 12.04 桌面上设置启动器(快捷方式) 3. 解决Ubun ...
- MeepoPS——轻量级 Socket 服务
MeepoPS是Meepo PHP Socket的缩写.旨在提供高效稳定的由纯PHP开发的多进程SocketService. MeepoPS可以轻松构建在线实时聊天,即时游戏,视频流媒体播放,RPC, ...
- docker 中运行 sshd 服务
创建Dockerfile # sshd # # VERSION 0.0.2 FROM ubuntu:14.04 MAINTAINER admln <admln@docker.com> RU ...
- DbHelperSQL 判断数据库表结构公用方法
#region 公用方法 /// <summary> /// 判断是否存在某表的某个字段 /// </summary> ...
- mongodb 操作语句与sql操作语句对比
上行:SQL 操作语句 下行:Mongo 操作语句 CREATE TABLE USERS (a Number, b Number) db.createCollection("mycoll&q ...