【问题标题】:Does managed code mean JIT or GC?托管代码是指 JIT 还是 GC?
【发布时间】:2011-09-27 16:27:33
【问题描述】:

我已经看到了一些关于“托管”代码含义的解释,其中一些针对将托管代码编译为中间语言和 JITed 的想法,而另一些则讨论了 GC 和内存管理。哪个实际上使一种语言受管理,还是两者兼而有之?

GC 的答案很有意义,因为内存是托管的(因此称为“托管代码”),但假设不可能有一种具有 GC 的语言但是本机的(未编译为 IL)。 GC 和 IL 代码是否以某种方式紧密耦合?

【问题讨论】:

  • JIT 编译器的存在是一个实现细节(它与运行程序的语义无关,可能在 JIT 中保存未定义的行为和错误)。 技术上,这同样适用于将代码编译为字节码还是原生代码,尽管它在实现的生命周期内发生变化的可能性要小得多,而且对于许多语言来说,在大多数或所有实现之间甚至是一致的.

标签: c# memory-management garbage-collection managed il


【解决方案1】:

不,我不会说 GC 和 IL 是紧密耦合的。事实上,一个人可以没有另一个人而存在——有时就是这样。

IL 的主要目的是使其与平台无关,并允许 JIT 进行依赖于平台的非常具体的优化。例如,x86、x64、ARM 等。JIT 的目的是将 IL 转换为架构的本机机器代码,并对其进行正确优化。

您无法针对 x86 和 ARM 进行优化,因为平台差异太大。这就是每个特定平台都有 JIT 的原因。 JIT 有幸知道它将运行在什么平台上。作为代码作者,你可能不知道。

另一方面,GC 是关于内存管理的。有很多垃圾收集器库用于不编译为中间语言的软件。以this one 为例,它虽小但能完成工作。在这个主题上也有很多papers

一个人可能没有另一个人而存在,但这不是我们经常看到的。

那么是什么造就了“托管”语言?对我来说,这意味着涉及某种类型的虚拟机。在 .NET 的情况下,CLR。提供GC、Jit、代码访问安全(CAS)等多种服务。

【讨论】:

    【解决方案2】:

    http://en.wikipedia.org/wiki/Managed_code

    这清楚地表明它是托管的代码(通过在虚拟机下运行),而不是内存。

    【讨论】:

    • 是的,但是 CLR 是否提供垃圾收集? (我问是因为我不知道)
    • @stargazer。是的,它确实。但这并不是让它“被管理”的原因。
    【解决方案3】:

    托管代码意味着它由虚拟运行时机器运行,通常意味着内存管理。这就是人们说“托管代码”时的意思。系统资源(例如内存分配)是为您管理的。

    JIT 与它无关。 JIT 是某些虚拟运行时机器的一项功能,但不是必需的。 Visual Basic 6 使用运行时而不是 JIT——它是逐行解释的。 JIT 在调用时编译一个代码单元。然而,.NET 语言将使用实现 JIT 编译的 .NET 运行时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多