《.NET程序员面试秘笈》----面试题15 .NET程序是如何编译的

面试题15 .NET程序是如何编译的

.NET程序员面试秘笈
【考点】CLR的知识,中间语言的知识。

【出现频率】

【解答】

.NET的程序可由多种高级语言编写,如C++、Visual Basic、 C#、 J# 等,但是最后将会被各自的编译器编译为一致的中间语言(IL)。最后由CLR提供运行环境,将中间语言编译为机器码,供CPU执行,其编译过程如图1.26所示。

为了尽量减少中间代码编译为机器代码的性能损失,中间语言采用即时编译,也被称为JIT编译。这种编译方式只编译调用的代码部分,而并非完全编译程序中所有的代码,编译过的部分将存储在内存中,下次执行时不需重复编译。当退出程序时,已编译部分的代码才会被清除。这种策略极大地降低了中间代码的性能损失,是程序灵活性和性能相权衡的较佳方案。

【分析】

在系统中运行.NET程序必须安装相应版本的.NET Framework,目前最新版本为4.5。.NET程序不是已经编译过了么?为什么还要依赖.NET Framework呢?这和.NET程序的运行机制有关,传统上程序分为源代码层和编译后的本机代码层(机器码)。而.NET提供了对多种编程语言以及多重平台的支持,所以在其中添加了中间代码层,中间代码被称为IL或MSIL。由于多了中间语言代码,使.NET程序有了更好的灵活性,有运行于多个平台的可能性(如Linux系统)。

.NET Framework的核心是CLR,即公共语言运行时,CLR是.NET程序的运行库环境。中间语言需要在CLR中运行并转换为机器码,所以.NET程序必须依赖.NET Framework才能运行。以C# 语言为例,C# 编译器编译的程序只是由中间语言构成,无法直接运行,必须由CLR执行。

.NET这种编译运行的机制和Java、ActionScript比较相似,Java第一次编译为字节码,而Java良好的移植性得益于此。只要客户机安装了Java虚拟机(JVM),就可以直接运行Java程序(JVM将字节码编译为机器码)。类似地,ActionScript同样被第一次编译为字节码,并存放于swf文件中。只要客户机安装了FlashPlayer,swf即可运行,因为FlashPlayer含有AS虚拟机(AVM)。可见,.NET的CLR和JVM、AVM是殊途同归。

说明:

客户机应尽量安装新版本的.NET Framework。
本节问题主要考察面试者对于.NET Framework编译的认识,特别是对于中间语言的理解。.NET程序的中间语言(IL)也被称为托管代码,其优点总结如下所示:

(1)平台无关性。例如MONO项目,可以使.NET程序运行于Windows以外的平台。

(2)JIT性能优化。及时编译需要调用的代码,尽可能提高程序运行速度。

(3)语言互操作性。支持多种语言编写程序,并编译为中间语言。通过这个特性,可以使多种语言编写的程序交互操作,以提升团队合作的融洽性。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-08-01 06:36:48

《.NET程序员面试秘笈》----面试题15 .NET程序是如何编译的的相关文章

《.NET程序员面试秘笈》---- 面试题11 举例说明简单工厂模式的作用

面试题11 举例说明简单工厂模式的作用 .NET程序员面试秘笈 [考点]工厂模式的理解,工厂模式在实际应用中的编写. [出现频率] [解答] 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.为了绕过常规对象的创建方法(new运算符创建实例),工厂模式提供一种"封装机制"来减少使用程序和这种"多系列具体对象创建工作"的耦合性. 说明: 这里的程序指客户程序之类的使用者. 简单工厂模式

《.NET程序员面试秘笈》----面试题16 请简述 .NET的命名空间

面试题16 请简述 .NET的命名空间 .NET程序员面试秘笈 [考点].NET的命名空间的基本理解,自定义命名空间的知识,在程序中使用命名空间的各种技巧. [出现频率] [解答] 使用命名空间的方法可以反映程序中的逻辑关系,并且可以有效避免类名冲突.命名空间就是各种类或其他类型名称的逻辑组织方式,而不代表物理组织方式.例如以下代码: System.Windows.Forms.MessageBox.Show("文本内容"); 在执行以上代码时,将跳出一个带有"确定"

《Java程序员面试秘笈》—— 面试题11 使用jar命令

面试题11 使用jar命令 Java程序员面试秘笈 请使用jar命令,将test文件夹压缩成.jar文件,并简述其压缩包的结构. 考点:对于Java程序员来说,更多情况下是使用的集成Java开发工具,例如JBuilder.Eclipse等,而对于最基本的Java编译和常见的命令行工具往往都不熟悉.这个面试题主要考察求职者对于Java命令行基本工具的使用,从而了解求职者对Java编程的熟悉程度. 出现频率: [面试题解析]熟练的Java开发者应该掌握常用的Java命令行工具.求职者应该熟练掌握ja

《Java程序员面试秘笈》—— 面试题12 如何执行mian()方法

面试题12 如何执行mian()方法 Java程序员面试秘笈 利用Java SDK中哪一条命令能够执行test的main()方法? (a)java test (b)javac test (c)java test.java (d)java test.class (e)java test.main 考点:考察求职者对java命令的熟悉程度. 出现频率: [面试题解析]求职者容易出现的错误是选择了(d).实际上,java命令后面只需要class文件的名称就可以,不用加入.class全名.如果使用jav

《.NET程序员面试秘笈》----面试题13 举例说明索引器的作用

面试题13 举例说明索引器的作用 .NET程序员面试秘笈 [考点]索引器的理解,this在索引器中的作用. [出现频率] [解答] 索引器可以使客户程序很方便地访问类中的集合或数组,访问方法类似于通过索引访问数组,并且索引器向客户程序隐藏了内部的数据结构.索引器和属性同样使用get和set访问器读取.写入值,不过索引器的get和set访问器必须具有与索引器相同的形参表.但是属性可以为静态成员,而索引器必须为实例成员.索引器不支持类似于属性的自动实现的语法. 说明: 形参表即为声明索引器时接收的形

《.NET程序员面试秘笈》----第1章 .NET概念题 面试题1 简述面向对象的程序设计思想

第1章 .NET概念题 .NET程序员面试秘笈 本章内容包含面向对象程序设计和.NET的基础概念题,由于这部分题目涉及的范围比较广,因此在很多公司的面试题中占了比较大的比重.很多.NET程序员在编写代码时非常熟练,但往往缺乏对基础知识的深刻理解,从而导致面试失败.这类知识是程序设计的基础,如果不加以重视,程序编写就没有创造性,只能学一步,做一步. 面向对象编程是当前流行的编程方式,被大多数高级语言支持..NET程序同样是基于面向对象的设计,只有深刻理解面向对象的编程理念,才可以开发出结构良好的.

《.NET程序员面试秘笈》----面试题12 访问关键字this和base有什么作用

面试题12 访问关键字this和base有什么作用 .NET程序员面试秘笈[考点]this的理解,base的理解. [出现频率] [解答] this关键字用于引用类的当前实例.base关键字用于派生类访问基类成员. 为了说明this和base在类中的具体应用,在ch01目录下新建一个程序文件,并命名为This.cs,编写代码如程序1.13所示. 程序1.13 this和base示例:This.cs using System; class This { static void Main() { C

《.NET程序员面试秘笈》----面试题9 举例描述接口的作用

面试题9 举例描述接口的作用 .NET程序员面试秘笈[考点]接口类型的理解,接口在程序中的意义. [出现频率] [解答] 接口在程序设计中的作用为充当类或结构的功能界面,接口的属性.方法等属于抽象描述必须通过类或结构的实现才能使用.接口是使用者只知道接口有些什么功能,却不知道功能如何实现.由谁实现,这给程序的设计留下了很大的灵活性.例如某个项目由多个功能模块组成,每个模块由一个程序员完成,程序员只需编写完模块功能的实现后,留下该模块的接口供其他人使用.其他人在程序中只需直接使用接口的功能,而不必

《Java程序员面试秘笈》—— 面试题10 类继承的建模表示方法

面试题10 类继承的建模表示方法 Java程序员面试秘笈根据图1.4的UML表示,选择一个正确的描述. (a)Box类是MyBox类的子类. (b)Box类是MyBox类的父类. (c)Box类和MyBox类是聚合关系. (d)Box类和MyBox类是一对多关系. 考点:该面试题貌似简单,在实际的面试中回答正确的却并不是很多,其实只是考察求职者对类的继承的建模表示方法的掌握程度. 出现频率: [面试题解析]Java中有两种机制来保证根据现有的类来构造新的类,那就是继承和聚合.例如,有一个盒子的类

《.NET程序员面试秘笈》----面试题7 构造函数有什么作用

面试题7 构造函数有什么作用 .NET程序员面试秘笈[考点]各种形态构造函数的理解,派生类的构造函数,构造函数的重载. [出现频率] [解答] 构造函数用于创建类的实例,并对实例进行初始化操作,通过不同的参数传递,可进行不同的实例初始化操作.本例通过多种不同形式的构造函数创建实例,并输出初始化的结果.在ch01目录下新建一个程序文件,并命名为Constructor.cs,编写代码如程序1.8所示. 在命令行下编译Constructor.cs后,执行Constructor程序,其效果如图1.10所