【问题标题】:Does A Program that is written with the Microsoft .NET framework compile/execute native code?使用 Microsoft .NET 框架编写的程序是否编译/执行本机代码?
【发布时间】:2009-04-16 17:47:48
【问题描述】:

新手问题:

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

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

【问题讨论】:

    标签: .net native


    【解决方案1】:

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

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

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

    【讨论】:

    • 我总是听到 MSIL 而不是 CIL。是否将其称为 MSIL?
    • @PhoenixRedeemer:最初被称为 MSIL,在 .NET 语言的 beta 版本期间,但由于标准化(Ecma-335 is.gd/gchW)现在正式称为 CIL...跨度>
    【解决方案2】:

    有点。 .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 开销。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

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

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

            【讨论】:

              【解决方案7】:

              C++ 是一种无需编译为 IL 的 .Net 语言,但如果您选择此选项,您将无法从 .Net 获得任何 .NET 引用或代码。

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-09-22
                  • 2010-09-07
                  • 2013-09-14
                  • 1970-01-01
                  • 2020-01-22
                  • 2020-03-11
                  • 2017-01-09
                  • 1970-01-01
                  相关资源
                  最近更新 更多