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

简介: 【考点】CLR的知识,中间语言的知识。

本节书摘来自异步社区《.NET程序员面试秘笈》一书中的第1章,面试题15,作者: 张云翯, 更多章节内容可以访问云栖社区“异步社区”公众号查看。

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

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

【出现频率】

【解答】

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

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


b9ea762a738b885a4ba0604ce8fd41ece51c27e0

【分析】

在系统中运行.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)语言互操作性。支持多种语言编写程序,并编译为中间语言。通过这个特性,可以使多种语言编写的程序交互操作,以提升团队合作的融洽性。

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

相关文章
|
28天前
|
存储 算法 程序员
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;
|
28天前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
28天前
|
Java 程序员
【Leetcode 程序员面试金典 05.01】插入 —— 位运算
位运算问题,只需要把 N 的 i 到 j 位都置 0 后再和 M 左移 i 位的结果进行按位或即可
|
1月前
|
NoSQL Java MongoDB
程序员的50大MongoDB面试问题及答案
程序员的50大MongoDB面试问题及答案
|
1月前
|
网络协议 Linux 程序员
程序员的50大Linux面试问题及答案(二)
程序员的50大Linux面试问题及答案(二)
|
1月前
|
Java 应用服务中间件 程序员
程序员的20大JSP面试问题及答案
程序员的20大JSP面试问题及答案
|
1月前
|
消息中间件 存储 Kafka
程序员的27大Kafka面试问题及答案
程序员的27大Kafka面试问题及答案
|
1月前
|
存储 网络协议 Java
程序员的23大IO&NIO面试问题及答案
程序员的23大IO&NIO面试问题及答案
|
1月前
|
算法 架构师 安全
10年Java面试总结:Java程序员面试必备的面试技巧
作为一名资深10年Java技术专家,我参与了无数次的面试,无论是作为面试者还是面试官。在这里,我将分享我的一些面试经历和面试技巧,希望能帮助即将面临面试的Java程序员们。回顾我的Java职业生涯,我清晰地记得一次特别的面试经历。那是我申请一家知名科技公司的Java开发岗位。为了这次面试,我花了几周的时间准备,这不仅包括Java的基础和高级知识,还有关于公司产品的研究。
|
1月前
|
NoSQL 关系型数据库 MongoDB
【DotNetGuide】C#/.NET/.NET Core学习、工作、面试指南
【DotNetGuide】C#/.NET/.NET Core学习、工作、面试指南

热门文章

最新文章

相关产品

  • 云迁移中心