本节书摘来自异步社区《.NET程序员面试秘笈》一书中的第1章,面试题15,作者: 张云翯, 更多章节内容可以访问云栖社区“异步社区”公众号查看。
面试题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)语言互操作性。支持多种语言编写程序,并编译为中间语言。通过这个特性,可以使多种语言编写的程序交互操作,以提升团队合作的融洽性。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。