Java 与本机编译语言相比,使用虚拟机编译(如JVM)有哪些优势?

Java 与本机编译语言相比,使用虚拟机编译(如JVM)有哪些优势?,java,c,pascal,qbasic,Java,C,Pascal,Qbasic,我听说java的优点是人们可以编写代码,为JVM编译代码,并在任何地方运行。每个人都只需要一个JVM应用程序作为他们的平台 当然,它看起来与当前的情况类似,每个人都有一个特定于其平台的编译器。因此,这种优势并不能用它来解释。但是我想我明白了。。问题一定是,在java环境中,您不能或无意以特定于操作系统的方式直接访问真正的机器 我想这意味着在其他语言中,代码本身必须根据运行它的计算机进行修改 有谁能提供一个简短的例子,比如一个Hello World程序来演示这一点?毫无疑问,它应该是非java的,

我听说java的优点是人们可以编写代码,为JVM编译代码,并在任何地方运行。每个人都只需要一个JVM应用程序作为他们的平台

当然,它看起来与当前的情况类似,每个人都有一个特定于其平台的编译器。因此,这种优势并不能用它来解释。但是我想我明白了。。问题一定是,在java环境中,您不能或无意以特定于操作系统的方式直接访问真正的机器

我想这意味着在其他语言中,代码本身必须根据运行它的计算机进行修改

有谁能提供一个简短的例子,比如一个Hello World程序来演示这一点?毫无疑问,它应该是非java的,例如C


由于这不是Hello World程序中通常会发生的事情,或者我在java上使用的书籍中看到的大多数情况,不幸的是,它们是“如何编程”风格的书籍,其中的所有内容都没有演示这一点(可能是因为他们不能或不想使用java来演示!)。尽管他们鼓吹这是一大优势。我想看看它的例子。

我猜您在谈论移植问题。事实上,JVM是流行文献中所说的,Java消除了代码移植的需要是一个更微妙的阴影

你不必看得太远。Windows到UNIX代码移植开发人员(反之亦然)的一小部分行业正是出于这个原因而存在的。想举个例子吗?像C语言中的远近指针这样的东西怎么样?或者使用uu declspec(dllexport)创建一个特定于Windows的dll,而gcc没有这些功能,您需要-shared选项吗

<> PQ>最困难的场景之一是在QT出现之前,特别是基于C++的GUI。GUI的加载仍然在.NET上完成,遗留代码在MFC上,对于Linux/UNIX,许多遗留代码在XWindows中。在这种情况下,Java是天赐之物——大多数东西都可以工作,而无需跨平台重新发明轮子

。。。每个人都有一个特定于他们平台的编译器。因此,这种优势并不能用它来解释

<>移植代码,例如C或C++,几乎总是比简单地编译代码更为复杂。这当然不是一个普通的、没有开发人员的计算机用户可以轻松做到的事情。用编译语言编写的代码通常是针对特定操作系统(例如Win32 API)的API编写的,因此无法在其他操作系统上轻松编译

Java字节码在任何有Java运行时环境的平台上运行。代码不需要重新编译。当然,您可以用Java编写特定于操作系统的代码,但是Java的标准库和web上提供的许多免费库提供了非常丰富的跨平台环境

除了可移植性,在虚拟机上运行还有其他优势。Java在运行时使用编译工具将Java字节码编译为本机代码。JIT编译器可以对运行程序的特定CPU进行复杂的优化,并且可以使用提前编译器无法使用的评测信息——原则上,JIT编译器因此可以生成比“普通”编译器更优化的代码


除了JavaVM,还有其他虚拟机。例如,微软.NET包含(公共语言运行库),并且它还有许多不同语言的前端,包括C和C++(它也应该把JIT编译的优点也引入C和C++)。我认为关键是java上的有用的东西也可以是便携的。在C和C++中,有时你不得不做指针运算,担心因式(或OS)和CPU的大小。标准中有以可移植的方式处理这些问题的修正,但是java从一开始就考虑到了这一点。我认为JVM还有另一个好处。像jython和scala这样的东西能够使用大量的java库(以及任何其他可用的java类),就好像它们是自己语言的一部分一样。在大多数其他语言中,与不同语言交互的方式是使用C ABI,这在OOP世界中有一定的局限性。从这个意义上说,java是新的C语言。此外,jvm还提供垃圾收集和反射等功能。

除了jvm的优点外,由于JIT编译器,它允许您以合理的性能独立于CPU体系结构执行代码,Java的一个基本优势是,它不仅是一种编程语言,而且是一种运行时环境,其API与运行它的所有底层平台通用(有时会有一些差异,但它们往往是bug)

例如,
gcc
(GNU交叉编译器)将允许您为或多或少的任何平台编译C代码。原则上,对于任何仅限于在
stdio.h
和其他一些文件中使用调用的文件,这都是很好的。然而,当您尝试使用更具体的操作系统时,您会很快遇到麻烦,这往往会很快出现:GUI、一些I/O、线程、进程、网络

一旦你的C代码中有了一个
#include
或类似的代码,你就必须重写部分代码以将其移植到Linux/OSX平台,有些工作可能并不明显或直接可行

Java的优势不仅在于它的虚拟机以及在任何平台上读取和运行相同字节码的能力,还在于它提供了一个相当大的库作为JRE(例如J2SE)的一部分,以及一个通用的线程和网络模型

当然,它看起来很像 当前情况,每个人都有 特定于其 站台

你需要了解的东西