7

新手问题:

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

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

4

8 回答 8

26

.NET 应用程序必须在公共语言运行时(CLR) 上运行。

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

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

CIL

于 2009-01-17T04:25:09.060 回答
7

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

请注意,即时编译实际上有一些性能优势。例如,CLR 可以根据它所运行的机器的性能特征(如 CPU 类型、CPU 缓存大小、CPU 数量、RAM 大小等)优化它生成的本机代码。传统编译器无法做到这一点,因为它们不知道他们生成的代码最终会在哪台机器上执行。

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

于 2009-01-17T04:54:33.043 回答
1

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

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

于 2009-01-17T04:22:53.043 回答
1

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

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

于 2009-01-17T04:24:42.010 回答
0

好吧,至少对于单声道,我知道您可以生成本机代码而不是托管程序集。我认为有适用于 Windows 的开源工具也可以做到这一点。

于 2009-01-17T04:32:59.823 回答
0

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

“当最初的翻译者很简单时,我们通常说一种语言是‘解释的’。如果翻译者很复杂,我们就说这种语言是‘编译的’。这种区别可能会造成混淆,因为‘简单’和‘复杂’是主观术语,并且因为编译器可以生成代码,然后由复杂的虚拟机(解释器)执行......这两个特征 - 彻底的分析和非平凡的转换 - 是编译的标志。”

来自Michael L. Scott 的“Programming Language Pragmatics” 。奇怪的是,这是一本关于编程语言理论的教科书,我今天下午刚好在读到这本书的那一页。

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

于 2009-01-17T04:34:15.407 回答
0

C++ 是一种不必编译成 IL 的 .Net 语言,但如果您选择此选项,则不能从 .Net 获得任何 .NET 引用或代码。

要研究的另一件事是c dragon 指出的-ngen.exe,它可以对许多基于.Net windows/console 的应用程序进行一些显着的改进。

于 2009-01-17T05:10:03.290 回答
0

在执行时,编译器生成中间语言代码 IL 代码,然后由 JIT 编译器将代码转换为本地代码

于 2009-04-16T09:47:48.997 回答