【问题标题】:managed code vs unmanaged code托管代码与非托管代码
【发布时间】:2016-07-15 20:43:04
【问题描述】:

我试图让我的思想围绕托管代码与非托管代码的概念展开。如果我错了,请纠正我,但托管代码是任何被编译成字节码的东西,而非托管代码被编译成机器代码。

这对吗?

【问题讨论】:

  • 这都是关于垃圾回收的,托管代码的独特之处在于 GC 可以找到代码使用的对象引用。即时编译器在此方案中起着非常关键的作用,除了将 MSIL 编译为机器代码(就像 C 编译器对 C 代码所做的那样)之外,它生成一个告诉 GC 的表在哪里查找对象引用。那个表是不同的,非托管代码不能提供那个表。

标签: computer-science unmanaged managed


【解决方案1】:

来自 anakata 的回答:

托管代码不会编译为机器代码,而是编译为由某些人解释和执行的中间语言 机器上的服务,因此在(希望如此!) 处理诸如内存和 线程为你。在现代用法中,这通常意味着 .NET,但确实 不必。

非托管代码被编译为机器代码,因此由操作系统直接执行。因此它有能力做 破坏性/强大的东西托管代码没有。这就是一切 以前可以工作,所以通常它与 .dll 之类的旧东西相关联

现在,引擎盖下发生了什么? 托管与非托管都是关于内存

在托管代码中,代码本身并不直接操作内存。它向代表代码执行此操作的运行时提供指令。这样,可以阻止不安全或非法的操作,并且代码在半沙箱中运行。托管语言可以而且经常确实有非托管代码——这就是计算的本质。

将记忆想象成一个巨大的停车场。托管语言和非托管语言的区别如下:

用一种受管理的语言,您走到代客处并解释说您想要停放 10 辆车。您不知道它们究竟停在哪里,但您知道代客随时乐意为您取回它们。您也不必决定他们停在哪里 - 您只需告诉代客他们需要停放。

在非托管语言中,挑选位置是您的工作。你可以开到其他车里,把车停在有残障的地方,随便 - 这会让你有更好的表现(你不必经常向代客传达指令)但是你可以也会犯很多愚蠢/危险的错误。

【讨论】:

  • 不能有一种可以编译成机器码的托管语言吗?我认为区别严格在于是否有垃圾收集器。一种暗示另一种吗?
  • 如果它编译为机器代码,那么添加垃圾收集器等功能的唯一方法是在编译期间向代码中发出大量的程序集。也就是说,众所周知的“代客”在转换为汇编代码时必须插入到几乎所有其他代码行中。
  • 老式的 LISP 还原机器怎么样? (并不是说你应该知道它的答案,或者这几天真的很重要。)
  • 老实说,我不知道。这个类比在几乎所有情况下都足以作为解释。即使发生了这种情况,基本行为也没有显着改变。
  • 你对 OP 的回答很棒,很抱歉我有点切题了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2011-01-29
  • 2012-03-04
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
相关资源
最近更新 更多