使用Microsoft .NET框架编写的程序是否编译/执行本机代码?

时间:2009-01-17 04:17:19

标签: .net native

Newb问题:

使用Microsoft .NET框架编写的程序是否编译/执行本机代码?

我不是说如果有办法不在机器上安装.net框架。简单地说:.net应用程序是否运行在另一层,如Java(即字节码)。

8 个答案:

答案 0 :(得分:26)

.NET应用程序必须在Common Language Runtime(CLR)上运行。

CLR是Microsoft对CLI标准的实现。 (除了Microsoft .NET Framework之外还有CLR的其他实现,即:MonoPortable.NET)。

CLR执行一种称为通用中间语言(CIL)的字节码。

CIL

答案 1 :(得分:7)

排序。 .NET编译器将您的源代码编译为IL(一种中间语言),并将其打包在您部署的程序集(通常是一个.DLL或.EXE文件)中。在运行时,它由CLR(公共语言运行库)托管,CLR负责执行代码,强制执行安全规则等。用于Windows的主桌面CLR(还有其他像Mono和Silverlight)在执行方法(函数)之前不会解释IL,而是将“JIT”(只是及时编译)IL代码解释为本机代码。

注意just in-time compilation实际上有一些性能优势。例如,CLR可以根据运行的机器的性能特征优化它生成的本机代码,如CPU类型,CPU缓存大小,CPU数量,RAM大小等。传统编译器不能这样做不知道他们生成的代码最终将在哪台机器上执行。

此外,程序集可以使用名为ngen的工具进行“预先JIT”。在此过程中,本机代码在执行程序集并在磁盘上缓存之前从IL编译。这样,在运行时不会产生JITting开销。

答案 2 :(得分:1)

简短回答(对你的第二个问题):是的。它被称为公共语言运行时(CLR)。

该框架的简要概述可在维基百科上找到:http://en.wikipedia.org/wiki/.NET_Framework#Architecture

答案 3 :(得分:1)

编译.NET程序时,它编译为IL(中间语言)。 IL与汇编语言非常相似。然后,IL在运行时通过JIT(即时)编译器转换为本机代码。

所以,回答你的问题,是的,不是。编译器不会发出本机代码,而是发送IL,它在运行应用程序时转换为本机代码。

答案 4 :(得分:0)

好吧,至少使用mono,我知道你可以生成本机代码而不是托管程序集。我认为有适用于Windows的OpenSource工具也能够做到这一点。

答案 5 :(得分:0)

我认为你必须小心询问它是否“编译”并假设这意味着发出的结果必须是“本机代码”。这不是“编译”的意思:

“当初始翻译很简单时,我们通常会说语言被'解释'。如果译者很复杂,我们说语言是”编译的“。这种区别可能会让人感到困惑,因为”简单“和“复杂”是主观的术语,因为编译器可以生成由复杂的虚拟机(解释器)执行的代码......这两个特征 - 彻底的分析和非平凡的转换 - 是编译的标志。

来自Michael L. Scott的“编程语言语用学”。奇怪的是,这是一本关于编程语言理论的教科书,我恰好在今天下午正在阅读该页面的页面。

所以,是的,C#和其他.NET语言在CLR上运行它们被编译。

答案 6 :(得分:0)

C ++是一种.Net语言,它不需要编译成IL,但如果你采用这个选项,你就不能拥有.Net的任何.NET引用或代码。

另外需要研究的是c龙指出的内容 - ngen.exe可以为许多.Net windows / console应用程序提供一些显着的改进。

答案 7 :(得分:0)

在执行时,编译器生成一个IL代码,它是中间语言代码,然后代码由JIT编译器转换为本机代码