【问题标题】:Why .NET code compiles to MSIL?为什么 .NET 代码编译为 MSIL?
【发布时间】:2009-12-18 05:06:39
【问题描述】:

首先 .NET 代码编译为 MSIL,然后 JIT 将其转换为机器相关代码。谁能告诉我由于两步编译而获得的所有好处。谢谢

【问题讨论】:

  • 嗯,Java 早在 .NET 诞生之前就已经做到了。所以我只是认为.NET 复制了这个想法。 :)
  • 嗯,UCSD Pascal 在 1970 年代做到了这一点,而 Java(和许多其他人)“复制”了它。来吧! :-)

标签: .net cil


【解决方案1】:

有几个原因。首先也是最重要的可能是使其跨平台。如果 C# 或其他 .NET 语言直接编译为本机代码,则必须针对它们运行的​​每个平台重新编译它们。使用 VM,所有代码都可以保存为中间格式,您只需为每个平台编写一个 VM 实现。

此外,通过使用与语言无关的中间语言,您可以拥有许多高级语言(C#、VB.NET、Python 等),所有这些都引用用其他语言编写的程序集。由于它们都编译成同一个东西,它们可以相互无缝地工作。

还有性能优势。 JIT 编译器可以专门针对当时运行代码的机器进行积极的优化。我不知道 .NET JIT 编译器在这个意义上做了多少优化,但理论上可以带来非常大的好处。

【讨论】:

  • 跨平台对 .NET 框架的应用并不多,因为它只是为了在 Windows 上运行,但仍然是一个有效的观点。 +1
  • 真的吗?然后解释 Mono。 :)
  • @Matt 你能解释一下我怎样才能在不同的平台上运行我的 .net 代码吗?意味着如果我想在 linux 上运行我的 .net 应用程序?有可能吗?
  • .NET 并不意味着只能在 Windows 上运行。 v1 文档说已经提到了这一点。实际情况是微软没有费心为其他平台实现虚拟机。
  • musicfreak - 虽然 MS.NET 仅适用于 Windows,但它仍然需要考虑转换为 2000、XP、Vista、7 及更高版本的 API,更不用说 x86 与 x64 以及 x128 (如果 8 支持它),再加上即将到来的一切。 “Windows”远非同质化。
【解决方案2】:

可以在MSDN找到答案

【讨论】:

    【解决方案3】:

    首先从高级语言转换到机器级,.Net 平台就是这样设计的。第一层负责将高级语言转换为 MSIL,第二层可以专注于平台的故障和故障,以将 MSIL 转换为机器级代码。它主要支持语言互操作性,可能在不久的将来,当像 Mono 这样的项目获得更多发展时,它还将提供跨平台支持。

    【讨论】:

      【解决方案4】:
      • 可执行文件未绑定到平台。例如,XNA 同时针对 PPC (Xbox360) 和 x86 处理器。一些程序将在 Linux 或 OSX 上的 Mono 上运行。

      • 它可以让您更好地针对目标机器进行优化或替换缺失的功能:

        • 例如 OSX >= 10.5 在运行时使用 OpenCL 编译时缺少 GPU 指令。
        • 假设您正在使用不支持浮点的 CPU,那么您可以使用 JIT 模拟它,而无需完全重写代码。
        • 在未来的某个时间点,可以将处理负载动态地转移到 GPU 或其他目标中(我怀疑函数式语言更适合这种情况)。

      【讨论】:

      • 你对函数式语言的断言是正确的。对于某些情况,GPU 确实非常强大。函数式语言使基础架构更容易决定这些情况何时到来。
      • 我认为未来更有可能是 FP + 大规模线程并行代码 (GPGPU) 的混合。
      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2010-11-26
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      相关资源
      最近更新 更多