Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我们需要/使用托管代码(而不是本机)?_Java_C#_Jvm_Managed_.net Native - Fatal编程技术网

Java 为什么我们需要/使用托管代码(而不是本机)?

Java 为什么我们需要/使用托管代码(而不是本机)?,java,c#,jvm,managed,.net-native,Java,C#,Jvm,Managed,.net Native,我缺少一些基本的东西。从源语言编译成字节码(java)或中间语言(.NET),然后从JVM或CLR内部运行它们有什么用 使用托管代码会降低性能(无论大小),但好处是什么?我知道有垃圾收集和内存管理,但即使如此,直接将源代码编译为本机而不需要这个中间级别不是更好吗 另外(我在这里添加这个,因为它与这个问题直接相关)-显然,Windows 10通用应用程序是编译成本机机器代码的。我很好奇为什么以前所有的.NET程序都没有这样做。字节码和JVM“神怪”意味着代码总是以相同的方式解释,与运行它的平台无

我缺少一些基本的东西。从源语言编译成字节码(java)或中间语言(.NET),然后从JVM或CLR内部运行它们有什么用


使用托管代码会降低性能(无论大小),但好处是什么?我知道有垃圾收集和内存管理,但即使如此,直接将源代码编译为本机而不需要这个中间级别不是更好吗

另外(我在这里添加这个,因为它与这个问题直接相关)-显然,Windows 10通用应用程序是编译成本机机器代码的。我很好奇为什么以前所有的.NET程序都没有这样做。

字节码和JVM“神怪”意味着代码总是以相同的方式解释,与运行它的平台无关。我隐约记得很久以前读到过这样一篇文章:英特尔和AMD(以及其他处理器)的某些逻辑运算方式不同,这会导致这些处理器产生不同的结果,并可能导致一些跨平台的错误。所以字节码解决了这个问题,结果总是不变的


另一方面,如果您知道您只为一个平台编程,并且希望获得额外的性能,那么嵌入式软件开发(或低级语言)就是其中的一部分。当您知道性能没有那么重要时,最好使用Java和.NET。

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

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

此外,Microsoft已经与Visual Studio一起提供了Ngen,用于将.Net代码编译为本机代码:


Ngen和.Net Native之间的一个主要区别是,Ngen仍然依赖于.Net Framework,.Net Native与程序一起编译.Net所需的代码,因此不需要安装.Net Framework。

在java中,生成字节码时,字节码是特定于特定类型的体系结构的,帮助java实现其“一次编译,在任何地方运行”的功能。 除此之外,它占用的内存非常少。

这是来自:

托管代码的好处

托管语言提供了一种通用的方法来处理内存管理和垃圾收集的细节,但代价很小。这种折衷使您从容易出错的任务中解脱出来,并允许您编写更紧凑、可读性更强、无错误的程序

非托管代码的好处

如果使用非托管语言,如C++,则必须编写额外的代码来管理内存和安全性,并在它们达到目的后清理对象。内务管理的细节是复杂的,并且与程序的预期功能无关,因此开发人员经常忽略这些任务,忽略它们,或者失去对它们的跟踪。因此,非托管代码的测试成本和时间往往更高,并且需要更多的程序员培训和规范


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

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

考虑没有中间语言的情况;您需要为每种支持的语言和每种支持的平台开发并维护一个编译器。假设您有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中工作


这基本上是一个双赢的局面。

字节码的一大优势是,无论您实现了虚拟机,都可以运行它。这在Windows中的范围是有限的,因为您只针对少数体系结构(atom、x86等)。NET Native不只是“编译为机器代码”,它本质上是在早期进行jit,因此以后不需要进行jit。这仍然被转换为与jit期间完全相同的机器代码;你过分简单化了它,听起来就像你认为它神奇地变成了原生C++。但这不是我的选择,我引用了我提到的链接(),Krythic是不正确的。.NET本机编译器使用与微软C++编译器相同的技术集。事实上,用于.NET Native的一组代码生成技术几乎与为我们的非本机产品构建的JIT完全不同。Aniruddha Varma的问题似乎不是关于托管/非托管代码的。他想知道为什么在Java/.Net程序中使用中间语言。