托管/字节代码和非托管/本机代码之间有什么区别?

时间:2008-10-30 22:39:04

标签: unmanaged bytecode managed

有时很难描述“我们的程序员”认为对非程序员和管理类型来说很简单的一些事情。

因此...

您如何描述托管代码(或Java字节代码)与非托管/本机代码与非程序员之间的区别?

10 个答案:

答案 0 :(得分:11)

管理代码==“Mansion House与全体员工或管家,女佣,厨师和园丁保持良好的地方”

非托管代码==“我以前居住在大学的地方”

答案 1 :(得分:3)

想想你的办公桌,如果你定期清理它,就有空间坐在你面前的实际工作中。如果你不清理它,你的空间就会用完。

该空间相当于RAM,硬盘等计算机资源

托管代码允许系统自动选择清理时间和清理内容。非托管代码使流程“手动” - 程序员需要告诉系统清理的时间和内容。

答案 2 :(得分:3)

我很确定基本的解释是:

  • 托管 =由运行时管理的资源清理(即垃圾收集)
  • 不受管理 =自行清理(例如malloc& free

答案 3 :(得分:3)

我对这次讨论的结果感到惊讶(好吧,不是真的,而是修辞)。让我补充一点,即使我迟到了。

虚拟机(VM)和垃圾收集(GC)已有数十年之久两个独立的概念。垃圾收集的本机代码编译语言存在,甚至存在于几十年(规范示例:ANSI Common Lisp;嗯,至少有一种compile-time garbage-collected声明性语言,水星 - 但显然群众在Prolog般尖叫语言)。

基于GC的基于字节码的虚拟机突然成为所有IT疾病的灵丹妙药。 Sandboxing of existing binaries(其他示例hereherehere)? Principle of least authority (POLA) / capabilities-based securitySlim binaries(或其现代变体SafeTSA)? Region inference?不,先生:微软& Sun并没有授权我们甚至只考虑这种变态。不,更好地重写我们整个软件堆栈的这个美妙的(???)新的(???)语言§/ API。正如我们的一位主持人所说,它再次 Fire and Motion

§不要太傻了:我知道C#不是唯一以.Net / Mono为目标的语言,它是hyperbole

编辑:根据我指出的内存管理/安全/代码移动性的替代技术,查看S.Lott的comments to this answer特别有启发性。

我的观点是,非技术人员不需要在这个详细程度上受到技术问题的困扰。

另一方面,如果他们对微软/ Sun营销印象深刻,有必要向他们解释他们被愚弄 - 基于GC的字节码虚拟机并不像他们声称的那样新颖,他们并没有神奇地解决每一个问题。存在IT问题和这些实现技术的替代方案(有些更好)。

编辑2:垃圾收集是一种内存管理技术,因为每种实现技术都需要被理解为正确使用。请参阅ITA Software的they bypass GC to obtain good perfomance

  

4 - 因为我们需要快速访问大约2个静态数据,   我们使用C ++代码来进行内存映射   包含无指针 C结构的文件   (航班,票价等),然后   使用Common Lisp访问这些   外国数据访问。结构域   访问编译成两个或三个   说明,所以没有   任何表现。访问罚款   C而不是Lisp对象。通过做   这,我们保持Lisp的垃圾   看到数据的收藏家(到   Lisp,每个指向C对象的指针都是   虽然我们经常做,但这只是一个固定点   暂时包装这些指针   Lisp对象改进   可调试)。我们的Lisp图像是   因此只有约250兆   “工作”数据结构和代码。

     

...

     

9 - 我们可以在800mhz的盒子上进行10秒的Lisp计算   少于5k的数据。这是因为   我们预先分配所有数据结构   需要和死在超过的查询   他们。这可能会产生很多Lisp   程序员畏缩,但有250兆   图像和实时约束,我们   不能生成垃圾。对于   我们,而不是使用利弊   使用“cons!”,它可以抓取细胞   我们的10,000,000个细胞阵列   预先分配并重置   每一个查询。

编辑3:(以避免误解)GC比直接使用指针更好吗?当然,大部分时间都是两者的替代品。是否需要使用这些详细信息来打扰用户?除了在必要时消除一些营销炒作之外,我没有看到任何证据证明是这种情况。

答案 4 :(得分:2)

或许将其与投资股票市场进行比较。

您可以自己买卖股票,试图成为能够带来最佳风险/回报的专家 - 或者您可以投资一个由“专家”管理的基金,该基金将为您提供 - 在你失去一些控制的成本,可能还有一些佣金。 (不可否认,我更多的是追踪基金的粉丝,股票市场“专家”最近并没有完全表现出色,但......)

答案 5 :(得分:1)

这是我的答案:

托管(.NET)或字节代码(Java)将为您节省时间和金钱。

现在让我们比较两者:

非托管或本机代码

您需要自己的资源(RAM /内存)分配和清理。如果你忘了某些东西,你最终会得到一个可能导致计算机崩溃的“内存泄漏”。内存泄漏是一个术语,当应用程序开始耗尽(吞噬)Ram / Memory而不是让它运行时,计算机可以用于其他应用程序;最终导致计算机崩溃。

为了在不同的操作系统(Mac OSX,Windows等)上运行您的应用程序,您需要专门为每个操作系统编译代码,并可能更改许多特定于操作系统的代码,以便它们适用于每个操作系统。操作系统。

.NET托管代码或Java字节代码

所有资源(RAM /内存)分配和清理都是为您完成的,创建“内存泄漏”的风险降至最低。这样可以有更多时间来编写功能,而不是花在资源管理上。

为了在不同的操作系统(Mac OSX,Windows等)上运行您的应用程序,您只需编译一次,只要它们支持给定的框架,您就可以在每个操作系统上运行( .NET Framework / Mono或Java)。

简而言之

使用.NET Framework(托管代码)或Java(字节代码)进行开发使构建可轻松定位多个操作系统的应用程序的总体成本更低,并且可以花更多时间来构建丰富的功能而不是平凡的内存/资源管理任务。

此外,在有人指出.NET Framework不支持多个操作系统之前,我需要指出技术上的Windows 98,WinXP 32位,WinXP 64位,WinVista 32位,WinVista 64- bit和Windows Server都是不同的操作系统,但每个都运行相同的.NET应用程序。此外,还有Mono Project将.NET引入Linux和Mac OSX。

答案 6 :(得分:1)

非托管代码是计算机要遵循的说明列表。 托管代码是计算机的任务列表,计算机可以自行解释如何完成它们。

答案 7 :(得分:0)

最大的不同是内存管理。使用本机代码,您必须自己管理内存。这可能很困难,并且是导致许多错误和大量开发时间用于追踪这些错误的原因。使用托管代码,您仍然会遇到问题,但问题却少得多,而且更容易追踪。这通常意味着软件越少,开发时间越短。

还有其他差异,但内存管理可能是最大的。

如果他们仍然感兴趣,我可能会提到很多漏洞来自缓冲区溢出,并且你没有得到托管代码,或者代码重用现在很容易,或者我们不再需要处理COM (无论如何你很幸运)。我可能会远离COM,否则我会发现它是多么可怕的长篇大论。

答案 8 :(得分:0)

这就像沿着边缘玩有和没有保险杠的游泳池之间的区别。除非你和所有其他玩家总是拍出完美的镜头,否则你需要一些东西来保持球在桌子上。 (忽略故意弹跳......)

或者使用带有墙壁而不是边线和终点线的足球,或没有逆止器的棒球,或没有网球后面的网球,或没有障碍的NASCAR,或没有头盔的足球......)

答案 9 :(得分:-7)

“特定术语托管代码在Microsoft世界中特别普遍。”

由于我在MacOS和Linux世界工作,所以这不是我使用或遇到的术语。

Brad Abrams“What is Managed Code”博客文章的定义类似于“.NET Framework公共语言运行时”。

我的观点是:根据条款解释它可能不合适。如果它是一个错误,黑客攻击或解决方案,它并不是非常重要。当然不够重要,无法处理复杂的外行人描述。随着一批MS产品的下一次发布,它可能会消失。