3

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

所以...

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

4

10 回答 10

11

托管代码 == “拥有全体员工或管家、女佣、厨师和园丁的豪宅,以保持这个地方的美好”

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

于 2008-10-30T22:48:34.990 回答
3

想想你的办公桌,如果你定期清理它,你面前就有空间可以放置你实际正在处理的东西。如果你不清理它,你就会用完空间。

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

托管代码允许系统自动选择清理的时间和内容。非托管代码使该过程“手动” - 因为程序员需要告诉系统何时以及清理什么。

于 2008-10-30T22:44:59.087 回答
3

我很确定基本解释是:

  • Managed = 由运行时管理的资源清理(即垃圾收集)
  • Unmanaged = 自己清理(即malloc& free
于 2008-10-30T22:47:00.593 回答
3

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

虚拟机 (VM) 和垃圾收集 (GC)已有数十年历史,是两个独立的概念。存在垃圾收集的本机代码编译语言,即使是几十年前的这些(规范示例:ANSI Common Lisp;嗯,至少有一种编译时垃圾收集声明性语言 Mercury - 但显然大众对类似 Prolog 的语言大喊大叫)。

突然之间,基于 GC 的基于字节码的 VM 成为了所有 IT 疾病的灵丹妙药。现有二进制文件的沙盒(其他示例在这里这里这里)?最小权限原则 (POLA) /基于能力的安全? 苗条的二进制文件(或其现代变体SafeTSA)?区域推断? 不,先生:Microsoft 和 Sun 并没有授权我们甚至只考虑这种变态。不,最好为这种美妙的(???)新(???)语言§/API重写我们的整个软件堆栈。正如我们的一位主持人所说,这又是火与动

§ 别傻了:我知道 C# 不是唯一针对 .Net/Mono 的语言,它是一种夸张的语言。

编辑:根据我指出的内存管理/安全/代码移动性的替代技术,查看 S.Lott对这个答案的评论特别有启发性。

我的观点是,非技术人员不需要在这个细节级别上为技术问题而烦恼。

另一方面,如果他们对 Microsoft/Sun 的营销印象深刻,则有必要向他们解释他们被愚弄了——基于 GC 字节码的 VM 并不像他们声称的那样新颖,它们并不能神奇地解决所有 IT 问题,而且存在这些实现技术的替代品(有些更好)。

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

4 - 因为我们有大约 2 gigs需要快速访问的静态数据,我们使用 C++ 代码对包含无指针C 结构(航班、票价等)的大文件进行内存映射,然后使用外部数据从 Common Lisp 访问这些文件访问。一个结构域访问编译成两个或三个指令,所以实际上并没有任何性能。访问 C 而不是 Lisp 对象的惩罚。通过这样做,我们可以防止 Lisp 垃圾收集器看到数据(对于 Lisp,每个指向 C 对象的指针只是一个固定编号,尽管我们经常将这些指针临时包装在 Lisp 对象中以提高可调试性)。因此,我们的 Lisp 图像只有大约 250 兆的“工作”数据结构和代码。

...

9 - 我们可以在 800mhz 的机器上进行 10 秒的 Lisp 计算,并且使用少于 5k 的数据。这是因为我们预先分配了我们需要的所有数据结构,并在超过它们的查询上死掉。这可能会让许多 Lisp 程序员感到畏缩,但是由于 250 兆图像和实时限制,我们不能产生垃圾。例如,我们不使用 cons,而是使用“cons!”,它从我们预先分配的 10,000,000 个单元格的数组中抓取单元格,并且每次查询都会重置。

编辑3:(避免误解)GC比直接摆弄指针更好吗?大多数时候,当然,但两者都有替代方案。有必要用这些细节来打扰用户吗?除了在必要时消除一些营销炒作之外,我没有看到任何证据表明情况确实如此。

于 2009-10-19T14:23:57.287 回答
2

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

您可以自己买卖股票,努力成为能够提供最佳风险/回报的专家 - 或者您可以投资由“专家”管理的基金,该“专家”将为您做这件事 - 以您为代价失去一些控制权,可能还有一些佣金。(诚​​然,我更喜欢追踪基金,而股市“专家”最近表现并不出色,但是……)

于 2008-10-30T22:50:00.137 回答
1

这是我的答案:

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

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

非托管或本机代码

您需要自己进行资源(RAM / 内存)分配和清理。如果您忘记了某些内容,最终会导致可能导致计算机崩溃的所谓“内存泄漏”。内存泄漏是指应用程序开始用尽(消耗)内存/内存但不放手,以便计算机可以将其用于其他应用程序的术语;最终这会导致计算机崩溃。

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

.NET 托管代码或 Java 字节码

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

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

简而言之

使用 .NET Framework(托管代码)或 Java(字节码)进行开发,总体上可以更便宜地构建可以轻松针对多个操作系统的应用程序,并允许将更多时间花在构建丰富的功能上,而不是用于内存的平凡任务/资源管理。

另外,在有人指出 .NET Framework 不支持多种操作系统之前,我需要指出技术上的 Windows 98、WinXP 32 位、WinXP 64 位、WinVista 32 位、WinVista 64 位和 Windows服务器都是不同的操作系统,但相同的 .NET 应用程序将在每个操作系统上运行。而且,还有将 .NET 引入 Linux 和 Mac OSX 的Mono 项目

于 2008-10-30T23:22:40.337 回答
1

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

于 2008-10-31T00:00:41.040 回答
0

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

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

如果他们仍然感兴趣,我可能会提到有多少漏洞来自缓冲区溢出,而托管代码无法做到这一点,或者代码重用现在很容易,或者我们不再需要处理 COM(如果你'无论如何都很幸运)。我可能会远离 COM,否则我会开始长篇大论说它有多糟糕。

于 2008-10-31T00:02:58.210 回答
0

这就像在边缘有和没有保险杠的打台球之间的区别。除非你和所有其他球员总是能投出完美的球,否则你需要一些东西来保持球在桌面上。(忽略故意弹跳...)

或者使用有墙而不是边线和端线的足球,或者没有后援的棒球,或者没有球门后网的曲棍球,或者没有障碍的NASCAR,或者没有头盔的足球......)

于 2008-10-31T01:30:29.923 回答
-7

“托管代码这一特定术语在 Microsoft 世界中尤为普遍。”

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

Brad Abrams “什么是托管代码”博客文章有一个定义,其中包含“.NET Framework 公共语言运行时”之类的内容。

我的观点是:用这些术语来解释它可能根本不合适。如果它是一个错误、hack 或变通方法,它不是很重要。当然不够重要,不足以进行复杂的外行描述。它可能会随着下一批 MS 产品的发布而消失。

于 2008-10-30T22:43:14.610 回答