【发布时间】:2009-04-16 17:47:48
【问题描述】:
新手问题:
使用 Microsoft .NET 框架编写的程序是否编译/执行本机代码?
我并不是说有没有办法不必在机器上安装 .net 框架。简单地说:.net 应用程序是否运行在像 Java 这样的另一层(即字节码)上。
【问题讨论】:
新手问题:
使用 Microsoft .NET 框架编写的程序是否编译/执行本机代码?
我并不是说有没有办法不必在机器上安装 .net 框架。简单地说:.net 应用程序是否运行在像 Java 这样的另一层(即字节码)上。
【问题讨论】:
.NET 应用程序必须在 Common Language Runtime (CLR) 上运行。
CLR 是 Microsoft 对 CLI 标准的实现。 (除了 Microsoft .NET Framework 之外,还有其他 CLR 实现,例如:Mono、Portable.NET)。
CLR 执行一种称为通用中间语言 (CIL) 的字节码。
【讨论】:
有点。 .NET 编译器将您的源代码编译成 IL(一种中间语言)并将其打包到您部署的程序集(通常是一个 .DLL 或 .EXE 文件)中。在运行时,它由负责执行代码、执行安全规则等的 CLR(公共语言运行时)托管。适用于 Windows 的主桌面 CLR(还有其他类似 Mono 和 Silverlight)不解释 IL,而是在执行方法(函数)之前将 IL 代码“JIT”(及时编译)为本机代码。
请注意,just in-time compilation 实际上有一些性能优势。例如,CLR 可以根据它所运行的机器的性能特征(如 CPU 类型、CPU 缓存大小、CPU 数量、RAM 大小等)优化它生成的本机代码。传统编译器无法做到这一点,因为它们不知道他们生成的代码最终会在哪台机器上执行。
此外,可以使用名为 ngen 的工具对程序集进行“预 JIT”。在这个过程中,本机代码在程序集被执行并缓存在磁盘上之前从 IL 编译。这样,运行时不会产生 JITting 开销。
【讨论】:
简短回答(对您的第二个问题):是的。它被称为公共语言运行时 (CLR)。
该框架的简要概述可在 Wikipedia 上找到:http://en.wikipedia.org/wiki/.NET_Framework#Architecture
【讨论】:
当您编译一个 .NET 程序时,它会被编译成 IL(中间语言)。 IL 与汇编语言非常相似。然后,该 IL 在运行时通过 JIT(即时)编译器转换为本机代码。
所以,回答你的问题,是和不是。编译器不会发出原生代码,而是会在应用程序运行时转换为原生代码的 IL。
【讨论】:
好吧,至少我知道单声道可以生成本机代码而不是托管程序集。我认为有一些适用于 Windows 的开源工具也可以做到这一点。
【讨论】:
我认为您必须小心询问它是否“已编译”并假设这意味着发出的结果必须是“本机代码”。这不是“编译”的意思:
“当最初的翻译器很简单时,我们通常说一种语言是“解释的”。如果翻译器很复杂,我们说该语言是“编译的”。这种区别可能会令人困惑,因为“简单”和“复杂”是主观术语,因为编译器可以生成代码,然后由复杂的虚拟机(解释器)执行......这两个特征 - 彻底的分析和非平凡的转换 - 是编译的标志。”
来自 Michael L. Scott 的 “Programming Language Pragmatics”。奇怪的是,这是一本关于编程语言理论的教科书,我今天下午刚好在读到这本书的那一页。
所以,是的,C# 和其他 .NET 语言在 CLR 上运行并且它们被编译。
【讨论】:
C++ 是一种无需编译为 IL 的 .Net 语言,但如果您选择此选项,您将无法从 .Net 获得任何 .NET 引用或代码。
要研究的另一件事是 c dragon 指出的 - ngen.exe,它可以对许多基于 .Net 窗口/控制台的应用程序进行一些显着的改进。
【讨论】:
在执行时,编译器生成一个IL代码,它是中间语言代码,然后由JIT编译器将代码转换为本地代码
【讨论】: