Q1)为什么是C#最初编IL然后在运行时即遵守和运行上的虚拟机(?).或者是准时遵守地机代码吗?

Q2)如果第二种是真正的(JIT遵守本机代码),然后在那里。净沙箱代码下运行?

3)此外,为什么代码汇编IL在第一位。为什么不简单地汇编为本机代码所有的时间?有一个工具,从MS从这个称为ngen但这是为什么选的?

有帮助吗?

解决方案

在IL是这些JIT过(JIT =只是在时间)作为过程运行编译成本地机器代码。

在使用虚拟机层的允许.NET在跨平台以一致的方式表现(例如,int是始终不管你一个32位或64位机器上运行的32位,这是不情况下与C ++)。

JIT编译允许最佳化来动态地调整自己,因为它运行的代码(例如应用更积极的优化到被频繁调用的码位,或利用硬件指令中使用的特定的机器等SSE2上),其可以”吨做的一个静态编译。

其他提示

A1)JIT编译为当地机的代码

A2)。净,没有这样的术语作为沙箱。有应用程序域代替。和他们行为的一部分CLR(即作为一部分的可执行程序)

A3)NGen的缺点从杰弗里*Richter:

  • NGen会的文件可以得到的同步。当CLR载NGen会文件,进行比较 数量特点有关的以前的编码以及前执行 环境。如果任何特性不匹配,NGen会文件不能 使用,并正常JIT编译器处理的是代替使用。

  • 劣质的装载时性(衍合/结合)。大会文件标准Windows PE文件,并且,正因为如此,每个都包含一个最佳基地址。许多窗户 开发人员熟悉周围的问题基地址和衍合.当时编写代码,这些问题不是一个令人关切,因为记忆正确的地址引用的计算是在运行时间。

  • 低劣的执行时性。当编写代码,NGen不能使尽可能多的 假设关于执行环境作为JIT编译器。这的原因 NGen.exe 生产出低劣的代码。例如,NGen不会优化使用 某些CPU指示;它增加了间接供静态现场访问,因为实际 地址的静态领域是不知道到运行时间。NGen插入代码通话课 造无处不在,因为它不知道的顺序码将执行 如果一类的构造已经被称为。

您可以使用 NGEN 创建你的.NET程序集的原生版本。这样做意味着,JIT不具有在运行时执行此操作。

.NET由于JIT旨在优化IL代码的代码在其下运行的当前CPU被编译成IL第一和然后到本机

.NET代码被编译成IL用于兼容性。既然你可以使用C#,VB.NET等创建代码,然后将JIT需要一个共同的指令,以编译为本地代码集(IL)。如果JIT不得不知道的语言,那么JIT将需要更新一个新的.NET语言发布时。

我不知道有关沙箱的问题,我最好的猜测是,.NET应用程序与3个应用程序域运行。一个域包含.NET运行库(mscorlib程序,system.dll中,等),另一个域包含.NET代码,我不记得什么其他域的对。 检查出 http://my.safaribooksonline.com/9780321584090

<强> 1 C#在编译为CIL(或IL),因为它的股票与.NET语言的其余部分的平台(这就是为什么你可以写在C#DLL,并用它在VB.NET和F#不麻烦)。然后将 CLR 将JIT编译代码到本机代码。

.NET也可以在多个平台(单声道上* NIX和OS X)运行。如果C#编译为本机代码,这不会是几乎一样容易。

<强> 2 没有沙箱中。

第3 涵盖在回答到#1

A1),这样一来它的平台无关(在Windows,Linux,Mac),然后它也可以使用特定的优化为当前的硬件。当它被JIT编译它为机器代码。

A2)整体框架(NET框架)是所有沙箱,因此所有来电您可能使通过的程序将会通过.NET Framework沙箱。

A3)如答案1,它允许.NET二进制到在不同的平台上工作,并在飞行中的客户端计算机执行特定的优化。

编译Net代码变得IL这是在确切相同的方式进行的Java类目标代码的中间语言。是的,它可以生成使用 NGEN 工具机代码。 NGEN结合所得到的固有图像的机器,所以复制ngen'd二进制到不同的系统不会产生预期的结果。编译成中间代码允许对可作出否则不能(容易地)可以与如C ++一个staticly类型的语言作出运行决定,它也允许在不同的硬件archetectures代码运作因为代码就成为在描述某种意义上说,它也描述了在一个位会发生什么(例如32或64)-agnostic的方式,而不是特定的机器代码,仅适用于32位系统还是64位系统,但两者不意图。

此外,NGEN是可选的,因为正如我所说的它结合二进制到系统中,它可以在需要的编译的机器代码动态类型语言的灵活性,性能,你知道是有用的二元不会移至它的未绑定到系统。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top