之间的区别是什么管理/字节的代码和不受管理/司机代码吗?
题
有时很难描述的一些事情,"美国程序"可以认为是简单的,向非程序员和管理类型。
所以...
你会如何形容之间的差异管理的代码(或Java字节的代码)和不受管理/司机代码,向非程序员?
解决方案
管理代码==“Mansion House与全体员工或管家,女佣,厨师及其他人园丁保持这个地方不错“
非托管代码==“我过去住在大学的地方”
其他提示
该空间相当于RAM,硬盘等计算机资源
托管代码允许系统自动选择清理时间和清理内容。非托管代码使流程“手动”。 - 程序员需要告诉系统清理的时间和内容。
我对这次讨论的结果感到惊讶(好吧,不是真的,而是修辞)。让我补充一点,即使我迟到了。
虚拟机(VM)和垃圾收集(GC)已有数十年之久和两个独立的概念。存在垃圾收集的本机代码编译语言,即使是几十年(规范示例: ANSI Common Lisp ;好吧,至少有一个 <强大的>编译时垃圾收集声明性语言,水星 - 但显然群众在类似Prolog的语言中大吼大叫。)
基于GC的基于字节码的虚拟机突然成为所有IT疾病的灵丹妙药。 现有二进制文件的沙箱(其他示例这里,这里和这里)? 最低权限原则(POLA) / 基于功能的安全性? Slim binaries (或其现代变体 SafeTSA )? 地区推断?不,先生:微软&amp; Sun并没有授权我们甚至只考虑这种变态。不,更好地重写我们整个软件堆栈的这个美妙的(???)新(???)语言&#167; / API。正如我们的主持人所说,它是 Fire and Motion 一遍又一遍。
&#167;不要太傻了:我知道C#不是唯一以.Net / Mono为目标的语言,它是一个夸张。
编辑:查看对此答案的评论”。 p>
我的观点是,非技术人员不需要在这个详细程度上受到技术问题的困扰。 另一方面,如果他们对微软/ Sun营销印象深刻,有必要向他们解释他们被愚弄 - 基于GC的字节码虚拟机并不像他们声称的那样新颖,他们并没有神奇地解决每一个问题。存在IT问题和这些实现技术的替代方案(有些更好)。 编辑2:垃圾收集是一种内存管理技术,因为每种实现技术都需要被理解为正确使用。了解如何在ITA Software 他们绕过GC以获得良好的性能: 4 - 因为我们需要快速访问大约2个静态数据,
我们使用C ++代码来进行内存映射
包含无指针 C结构的文件
(航班,票价等),然后
使用Common Lisp访问这些
外国数据访问。结构域
访问编译成两个或三个
说明,所以没有
任何表现。惩罚
我非常确定基本的解释是:
- 管理 =资源清除管理的运行时间(即垃圾收集)
- 托管 =后清理自己的(即
malloc
&free
)
或许将其与投资股票市场进行比较。
您可以自己买卖股票,试图成为能够带来最佳风险/回报的专家 - 或者您可以投资一个由“专家”管理的基金。谁会为你做这件事 - 代价是你失去了一些控制权,可能还有一些佣金。 (不可否认,我更像是追踪基金的粉丝,股票市场“专家”最近并没有做得很好,但......)
这是我的答案:
托管(.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。
非托管代码是计算机要遵循的说明列表。 托管代码是计算机的任务列表,计算机可以自行解释如何完成它们。
最大的不同是内存管理。使用本机代码,您必须自己管理内存。这可能很困难,并且是导致许多错误和大量开发时间用于追踪这些错误的原因。使用托管代码,您仍然会遇到问题,但问题却少得多,而且更容易追踪。这通常意味着软件越少,开发时间越短。
还有其他差异,但内存管理可能是最大的。
如果他们仍然感兴趣,我可能会提到很多漏洞来自缓冲区溢出,并且你没有得到托管代码,或者代码重用现在很容易,或者我们不再需要处理COM (无论如何你很幸运)。我可能会远离COM,否则我会发现它是多么可怕的长篇大论。
这就像沿着边缘玩有和没有保险杠的游泳池之间的区别。除非你和所有其他玩家总是拍出完美的镜头,否则你需要一些东西来保持球在桌子上。 (忽略故意弹跳......)
或者使用带有墙壁而不是边线和终点线的足球,或没有逆止器的棒球,或没有网球后面的网球,或没有障碍的NASCAR,或没有头盔的足球......)
“特定术语托管代码在Microsoft世界中特别普遍。”
由于我在MacOS和Linux世界工作,所以这不是我使用或遇到的术语。
The Brad Abrams&quot; 什么是托管代码一>&QUOT;博客文章的定义类似于“.NET Framework公共语言运行时”等。
我的观点是:根据条款解释它可能不合适。如果它是一个错误,黑客攻击或解决方案,它并不是非常重要。当然不够重要,无法处理复杂的外行人描述。随着一批MS产品的下一次发布,它可能会消失。