为什么我们需要/使用托管代码(超过原生代码)?

时间:2015-10-16 06:31:56

标签: java c# jvm managed .net-native

我在这里遗漏了一些基本的东西。从源语言编译成字节码(java)或中间语言(.NET)然后从JVM或CLR内部运行它们的用途是什么?

使用托管代码的性能下降(无论是轻微还是大),但有哪些好处?我知道那里有垃圾收集和内存管理,但即便如此,在不需要这个中间级别的情况下直接将源代码编译为本机也不会更好吗?

另外(我在这里添加此内容,因为它与问题直接相关) - 显然,Windows 10 Universal应用程序使用.NET Native编译,编译为本机机器代码。我很好奇为什么在使用所有.NET程序之前没有这样做。

5 个答案:

答案 0 :(得分:2)

这是MSDN

托管代码的好处

托管语言提供了一种处理内存管理和垃圾收集细节的通用方法,但代价是开销很小。这种权衡使您免于容易出错的任务,并允许您编写更紧凑,可读和无错误的程序。

未托管代码的好处

如果使用非托管语言(如C ++),则必须编写额外的代码来管理内存和安全性,并在用完目的后清理对象。管家细节很复杂,并且与计划的预期功能无关,因此开发人员经常忽略这些任务,忽略它们或忘记它们。因此,非托管代码的测试成本通常更高,更耗时,而且需要更多的程序员培训和纪律。

但是,开发人员通常更喜欢非托管代码,因为它执行速度更快,允许更灵活地使用指针,并直接控制硬件。

答案 1 :(得分:2)

除了其他答案中指出的所有内容之外,这种方法的主要好处是在开发和维护方面实现了重要的成本降低,并大大提高了开发环境的可扩展性。

考虑没有中间语言的情况;您需要为每个支持的语言开发并保留一个编译器。每个支持的平台。假设你有语言 L1 L2 L3 和平台 P1 P2 P3 。这意味着您需要开发和维护9种不同的编译器: C1(L1,P1) C2(L1,P2) C3( L1,P3) C4(L2,P1)

另一方面,使用中间公共语言 I 可以开发3种语言特定的编译器 C1(L1,I) C2(L2,I ) C3(L3,I)和3个平台特定编译器 C4(I,P1) C5(I,P2) C6(I,P3)

显然,支持的语言和平台基础越大,降低成本就越显着。

它还为将来添加支持的平台或语言提供了很大的灵活性;任何新语言 L4 只需要开发一个单独的编译器 C(L4,I),并且您可以以一个开发的价格立即支持所有平台。相反,如果你有一个新的平台 P4 ,你只需要开发 C(I,P4),而宾果,你有 L1 L2 L3 都在 P4 中工作。

这基本上是双赢局面。

答案 2 :(得分:0)

Bytecode和JVM“shenanigans”意味着代码总是以相同的方式解释,与运行的平台无关。我记得很久以前依旧读到英特尔和AMD(以及其他处理器)做一些不同的逻辑操作,导致这些处理器产生不同的结果,这可能导致一些跨平台的错误。所以字节码解决了这个问题,结果总是不变的。

另一方面,如果您知道自己只针对一个平台进行编程并希望获得额外的性能,那么就是嵌入式软件开发(或低级语言)的用武之地。当您了解Java和.NET时,最好使用Java和.NET。表现并不那么重要。

答案 3 :(得分:0)

这是因为编译本机代码会使您的程序平台被指定。 但是,通过编译为中间语言,您的程序是可移植的,并且如果存在指定的JVM / CLR平台,则可以在每个平台上运行。

Java和.Net都使用即时编译,因此与使用解释器相比,它们可以提供可移植性,但性能仍然更好。

此外,Microsoft已经将Ngen与Visual Studio一起提供,用于将.Net代码编译为本机代码:
https://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx
Ngen和.Net Native之间的主要区别在于Ngen仍然依赖于.Net Framework和.Net Native将.Net所需的代码与程序一起编译,因此不需要安装.Net Framework。

答案 4 :(得分:-1)

在生成字节代码的java中,特定于特定类型的体系结构,有助于java实现“一次编译一次运行”的能力。 除此之外,它需要的内存非常少。