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

3
有时候对于非程序员和管理层来说,我们程序员认为很简单的事情却很难描述清楚。
那么...
你会如何向一个非程序员描述托管代码(或Java字节码)和非托管/本机代码之间的区别?
10个回答

11

托管代码 == "拥有一整套仆人、女佣、厨师和园丁来维护房子的豪宅"

非托管代码 == "我在大学里曾经居住过的地方"


5
谢谢...我一直不喜欢得使用 Malloc() 来分配床和指向其他人的脏盘子。 - Eoin Campbell
1
那么你的意思是托管代码更昂贵,而且你在使用它时拥有的自由度更少?看起来很准确。 - Edmund

3

想象一下你的桌子,如果你经常整理它,就有空间放置你实际正在工作的东西。如果你不整理,你就会用完空间。

这个空间相当于计算机资源,如RAM、硬盘等。

托管代码允许系统自动选择何时以及清理什么。非托管代码使这个过程变得“手动”-也就是说,程序员需要告诉系统何时以及清理什么。


1
这让我想起了Epps教授在《数字追凶》中的一个过场解释。 - Bill the Lizard

3

我相信基本的解释是:

  • Managed = 运行时管理资源清理(例如垃圾回收)
  • Unmanaged = 自己清理资源(例如mallocfree

1
“即malloc和free”对于非程序员来说并不是很有用,不是吗? - Joachim Sauer

3

我对这里的讨论结果感到惊讶(其实并不是,但从修辞上说是)。让我补充一些内容,即使我已经晚了。

虚拟机(VM)和垃圾回收(GC)已经存在几十年,并且是两个独立的概念。存在着使用垃圾回收本地代码编译语言,甚至是几十年前的语言(经典例子: ANSI Common Lisp;还有至少一个 在编译时 进行垃圾回收 的声明性语言 Mercury - 但显然大众喜欢像 Prolog 的语言)。

Suddenly GCed基于字节码的虚拟机成为了解决所有IT问题的灵丹妙药。 现有二进制文件的沙盒化(其他例子在这里在这里在这里)? 最小权限原则(POLA)/基于能力的安全性精简二进制文件(或其现代变体SafeTSA)? 区域推断? 不,先生:微软和Sun甚至不允许我们考虑这样的扭曲行为。 不,最好为这种美妙(???)的新(???)语言§/API重新编写整个软件堆栈。 正如我们的一位主持人所说,这又是火与运动

§ 别傻了,我知道C#不是唯一一个针对.Net/Mono的语言,这是夸张之词。

编辑:阅读S.Lott对此答案的评论,以了解我指出的内存管理/安全性/代码可移植性的替代技术,这尤其具有教育意义。

我的观点是,非技术人员在这个细节层面上不需要被困扰。

另一方面,如果他们被微软/甲骨文的营销所吸引,有必要向他们解释,他们正在被愚弄——基于GC的字节码虚拟机并不像它们声称的那样新颖,它们不能神奇地解决每一个IT问题,而且存在其他实现技术的替代方案(有些更好)。

编辑2: 垃圾回收是一种内存管理技术,和每种实现技术一样,需要被理解才能正确使用。看看在ITA Software中,他们是如何绕过GC以获得良好的性能

4 - 由于我们拥有约2GB的静态数据需要快速访问,因此我们使用C++代码将包含指针为空的C结构(例如航班、票价等)的巨大文件映射到内存中,然后使用外部数据访问从Common Lisp中访问这些数据。一个结构体字段访问会编译为两到三个指令,因此使用C而不是Lisp对象访问实际上没有性能损失。通过这样做,我们可以使Lisp垃圾回收器无法看到数据(对于Lisp来说,指向C对象的每个指针只是一个fixnum,虽然我们经常会暂时将这些指针包装在Lisp对象中以提高可调试性)。因此,我们的Lisp镜像只包含约250MB的“工作”数据结构和代码。
9 - 在800MHz的计算机上,我们可以进行10秒钟的Lisp计算并cons less than 5k的数据。这是因为我们预先分配了所有需要的数据结构,并在超出限制的查询时退出。这可能会让许多Lisp程序员感到不安,但是由于250MB的镜像和实时约束,我们无法承担生成垃圾的成本。例如,我们使用"cons!"而不是"cons",它从我们预先分配的1000万个单元格数组中获取单元格,并在每个查询之后进行重置。 编辑3:(为了避免误解)GC是否比直接操纵指针更好?大多数情况下,当然是的,但两者都有替代方案。有必要向用户介绍这些细节吗?我没有看到任何证据表明这是必要的,除非在必要时消除一些营销炒作。

当然,它们并不是完全新颖的概念。尽管如此,这些运行时所使用的技术组合的广泛应用以及实际JIT/运行时优化的改进范围肯定是这些运行时引入的新概念。除此之外,你的抱怨与问题几乎没有关系:即使它不是新的,也可能需要向外行人描述。 - Joachim Sauer
您连一个理由都没有提供为什么这是必要的;您一直在坚称它,并假装如果不遵循就是在“胡言乱语”。 - MaD70

2
也许可以将其与投资股票市场进行比较。
你可以自己购买和出售股票,试图成为最具风险/回报的专家,或者你可以投资于由“专家”管理的基金 - 代价是你失去了一些控制,并可能付出一些佣金。(不可否认,我更喜欢指数基金,而且股票市场的“专家”近来表现并不出色,但...)

1

这是我的答案:

使用托管 (.NET) 或字节码 (Java) 可以为您节省时间和金钱。

现在让我们比较一下两者:

非托管或本机代码

您需要自己进行资源 (RAM / 内存) 分配和清理。如果您忘记了某些内容,就会出现所谓的“内存泄漏”,导致计算机崩溃。内存泄漏是一个术语,用于描述应用程序开始使用(消耗)Ram/内存,但不释放它,因此计算机无法将其用于其他应用程序;最终导致计算机崩溃。

为了在不同的操作系统上运行您的应用程序(如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位和Windows Server都是不同的操作系统,但同一个.NET应用程序将在每个操作系统上运行。而且,还有Mono项目将.NET带到Linux和Mac OSX。

1

非托管代码是计算机要遵循的指令列表。 托管代码是计算机要遵循的任务列表,计算机可以自由解释如何完成这些任务。


0

最大的区别在于内存管理。使用本地代码,您必须自己管理内存。这可能很困难,并且是许多错误和大量开发时间用于跟踪这些错误的原因。使用托管代码,您仍然会遇到问题,但问题较少且更容易跟踪。这通常意味着软件错误较少,开发时间也较短。

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

如果他们仍然感兴趣,我可能会提到许多漏洞都来自缓冲区溢出,而使用托管代码则不会出现这种情况,或者现在可以轻松重用代码,或者我们不再需要处理COM(如果你很幸运的话)。否则,我可能会远离COM,否则我会对它的糟糕之处进行抨击。


0
这就像在边缘有或没有保险杠的情况下打台球的区别。除非你和其他所有玩家总是能够完美地击球,否则你需要一些东西来保持球在桌子上。(忽略故意反弹...)
或者使用带有墙壁而不是边线和端线的足球场,或者没有后挡板的棒球场,或者没有球门后网的曲棍球场,或者没有屏障的NASCAR赛车,或者没有头盔的橄榄球...

-7

“托管代码”这个特定术语在微软世界中非常普遍。

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

Brad Abrams的博客文章 "What is Managed Code" 给出了一个定义,例如“.NET Framework Common Language Runtime”。

我的观点是:可能根本不必解释这个术语。如果它是一个错误、黑客或解决方法,那么它并不是非常重要。当然,没有必要为此制作一个复杂的通俗描述。它可能会随着下一批微软产品的发布而消失。


不必理会,因为它可能会消失...我希望我的老板能接受这个答案。 - EBGreen
@EBGreen:看看微软的产品公告。微软总是创造和放弃术语来解释某些问题。当你的公司转向Linux时,你就不会再关心了。 - S.Lott
“受控代码”不是一个可以解释问题的术语。它是指由针对.NET Framework(类似于Java字节码)的编译器生成的代码所命名的术语。 - Chris Pietschmann
“垃圾回收环境是过去几十年中最大的软件开发生产力提升。”在Linux世界中,我们并不太关心。因此,我不确定“最大”是否适用。或许可以说是“很大”。也许只适用于Windows系统中的“最大”。 - S.Lott
我需要一把“银枪”来用这个伟大的新“银弹”打自己的脚吗?还是我的旧枪可以?垃圾回收是一种内存管理技术,作为每种实现技术一样,需要理解才能正确使用。看看ITA软件如何绕过GC以获得良好的性能:http://paulgraham.com/carl.html - MaD70
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接