2016-07-15 202 views
5

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

这是正确的吗?

+0

这是关于垃圾收集的一切,使得托管代码与众不同的地方在于GC可以找回代码使用的对象引用。即时编译器在此方案中起着非常关键的作用,除了将MSIL编译为机器代码(就像C编译器用C代码所做的那样),它还*生成一个表,告诉GC在哪里查找对象引用。该表是不同的,非托管代码不能提供该表。 –

回答

4

从annakata的回答是:(!希望)

托管代码不会被编译成机器码,而是这是一台机器上的解释和执行一些 服务,因此内运行的中间语言 安全的框架,处理危险的东西,如内存和 线程为你。在现代用法中,这通常意味着.NET,但并不是必须的。

非托管代码被编译为机器代码,因此直接由OS执行。因此它有能力去做 破坏/强大的事情托管代码没有。这是一切 如何用来工作,所以通常它与旧的东西一样的.dll

现在,什么是引擎盖下回事关联? 托管与非托管是全部关于内存

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

可视化内存就像一个巨大的停车场。托管语言和非托管语言之间的区别如下所示:

在托管语言中,您走向代理并解释您希望停放10辆汽车。你不知道他们停在哪里其中,但你知道,仆人会很乐意随时为你找回他们。你也不会去决定他们停在哪里 - 你只需告诉代客他们需要停放。

在非托管语言中,选择这些点是您的工作。你可以开车进入其他车辆,停在残疾人的地方,无论 - 这给你更好的表现(你不必经常中转指示给仆人)但是你也可以犯很多愚蠢/危险的错误。

+0

能不能有一个托管语言编译为机器码?我认为这个区别完全是关于有没有垃圾收集器。一个人暗示另一个人吗? – JamesFaix

+0

如果编译为机器代码,那么添加垃圾收集器等功能的唯一方法是在编译期间将大量的程序集发布到代码中。也就是说,众所周知的“代客”将被转换为程序集时插入到其他所有代码行中。 – Ares

+0

老派的LISP减速机呢?(不是说你*应该*知道答案,或者这些日子真的很重要。) – JamesFaix