为什么Java是独立于平台的? 当我使用C++程序时,需要Turbo C编译器;当我有一个Java程序时,我需要有JVM。但是C++不是平台无关的,但是java是! 如果任何Java程序都需要运行JVM才能执行,为什么说Java是平台独立的?

为什么Java是独立于平台的? 当我使用C++程序时,需要Turbo C编译器;当我有一个Java程序时,我需要有JVM。但是C++不是平台无关的,但是java是! 如果任何Java程序都需要运行JVM才能执行,为什么说Java是平台独立的?,java,c++,jvm,Java,C++,Jvm,没有软件是真正独立的。最终,您的程序必须调用底层操作系统来执行一些基本操作,如分配内存、创建新线程等 实现跨平台可执行文件的方法是为每个操作系统创建特定的可执行文件。通常的做法是为每个操作系统编写不同的代码,然后将其隐藏在跨平台接口中,并将相关代码编译到相关操作系统。例如,std::thread对于使用该类的用户来说是跨平台的,但在幕后它将根据编译时指定的操作系统调用不同的函数,例如Windows上的CreateThread,但pthread_create on*nix操作系统 因此,JVM基本

没有软件是真正独立的。最终,您的程序必须调用底层操作系统来执行一些基本操作,如分配内存、创建新线程等

实现跨平台可执行文件的方法是为每个操作系统创建特定的可执行文件。通常的做法是为每个操作系统编写不同的代码,然后将其隐藏在跨平台接口中,并将相关代码编译到相关操作系统。例如,std::thread对于使用该类的用户来说是跨平台的,但在幕后它将根据编译时指定的操作系统调用不同的函数,例如Windows上的CreateThread,但pthread_create on*nix操作系统

因此,JVM基本上是一个C/C++可执行文件,为每个操作系统使用不同的函数集编写,并为每个操作系统分别编译。在Linux上工作的JVM可执行文件不能在Windows上工作,反之亦然

JVM根据当前运行的操作系统和CPU将.class文件编译成机器代码,所以Java程序可以在任何地方运行

但基本上,这是一个谎言。这就像说一个人可以在火星上生活。。。。 如果他住在一艘密封的宇宙飞船里,有适当的温度、水、食物、空气和阳光供应

所以Java程序可以在任何地方运行。。。。如果JVM已经安装并在计算机上运行。

Java是独立于操作系统的,因为它在Java平台上运行JVM:咒语是写一次,在任何地方运行,因为您使用JDK API编写代码,编译一次,它在任何有JVM可用的操作系统上运行。您编写代码,将其封装在一个jar中,然后jar在合理的范围内运行在您想要使用它的任何地方。JDK和JVM的工作是抽象出环境中的差异

相反,尤其是在java创建时,为多个操作系统编写C或C++是一个很大的痛苦,通常需要额外的工具包,JDK和JVM是一个分类工具包,甚至今天还需要至少对目标系统进行重新编译。


Java的操作系统独立性没有什么神奇之处。完全有可能为C或C++构建相同的东西:编译成中间形式,提供一个知道如何为不同环境解释或重新编译该中间形式的运行时,并提供一个抽象出环境差异的库。Java就是这样做的,它对语言有自己的理解。后来,.Net平台也是如此。

首先,我想链接到这个问题,这个问题有很多好的信息

在上面的问题中,有一些关于平台独立意味着什么的评论,但是我想提到的一件事,在这里得到了很好的总结

没错,平台独立性意味着相同的程序可以在任何平台操作系统上运行,而无需任何修改

我们编写的代码称为“一次编写,在任何地方运行”或其他人所说的“一次运行,在任何地方测试”

我们的Java代码应该在任何地方都可以运行,但有时会有一些本机bug导致问题,例如,有人在Mac OSX上使用JavaFX-8打印时遇到问题,而它在Windows上工作正常。还有一个关于这个问题的bug报告来修复这个特定于Mac的Java问题

所以。。。。在大多数情况下,底层JavaSE代码应该可以跨所有平台工作

**但是,如果您确实有一个应用程序在多台计算机上运行并使用文件系统,则必须进行检查以了解您使用的操作系统,即System.getPropertyos.name.containsWindows**

更多信息请点击这里

还有一件事需要注意

某些组件不能跨平台工作,即JavaSE和JavaEE。JSP/JSF是JavaEE中使用的东西,在web上,专门用于在服务器和网页上运行代码,但据我所知,它不能在桌面上使用

但是,JavaSE有Swing和JavaFX等GUI,它们也不能在web上工作,无论是在客户端还是在服务器上

Android有它自己的一套命令和它能做/不能做的事情,其他平台也有它的细节

总的来说,底层Java架构是跨所有平台使用的架构,其中某些Java细节在特定平台(如JSP)中使用

那么Java有什么不同之处呢? 对于Java,应用程序运行在Java虚拟机中,而Java虚拟机本身并不独立于平台。这必须是实际机器操作系统和您编写的Java代码之间的接口

我真的不知道 这是JVM的一部分,但似乎每个JVM都是针对每个平台专门定制的,这就是为什么要安装这么多版本的原因,而且在后台要做很多繁重的工作,而C您可能必须自己完成这项工作,但对于每个操作系统,并不确定它是如何工作的

想要Windows的JVM吗?NPLinux?NP你刚买的那辆新车里有那么多高科技?为了这个。。。。或者你刚停车的新停车收费表呢?是的,也有一个

例如,这里有一个关于Java如何转换为Android的Dalvik的答案


希望这有帮助和有意义。

< P> C或C++程序编译成与金属是OS的金属接近的本地代码,在DOS时代也可以是硬件。在目标平台上运行可执行文件不需要进一步的重新编译。但是,开发人员必须为他/她缩进程序应该运行的所有平台构建可执行文件

这不仅仅意味着不同的操作系统,还意味着特定操作系统的独特性。例如,64位二进制EXE不能在32位操作系统上运行,但是,通常情况下,也可以在32位操作系统上运行。在这里,Java/.NET和其他平台虚拟化引擎对开发人员来说是个福音——他们只需构建一次,例如AnyCPU for C模块,而不需要提供多个二进制文件EXE文件。安装在给定操作系统上的运行时将重新编译JIT即时编译


我不确定Java,但是.NET程序可以编译到特定的平台。NET引擎还可以将Java中的中间代码或字节代码JIT编译成本机格式,只需一次,并保持EXE直接运行。优点是.NET JIT编译器可以利用当前的硬件和最新的CPU指令,哪个C++程序不可能没有JIT/RealEngy.U/P>它主要是一个营销工具。你不必重新编译来运行在不同的平台上,但是JVM在不同的平台上是不同的。谢谢你回答我的问题。这里可以找到一些很好的答案:开发者会花半个小时下载。在Linux机器上安装JVM真的吗?apt get install openjdk-8-jdk是debian派生版本的全部功能,与许多其他发行版类似。除非你说的是慢速互联网+没有本地安装媒体,但这只会让机器忙,人类可以同时做其他事情。JRE版本并不像你说的那样是500MB,它们更像是60MB。听起来你想把它画得比实际情况更消极。此外,JRE也可以与应用程序捆绑在一起,就像任何其他ependency think一样。dllsI删除了这一段。再想一想,我认为这完全与问题本身无关。但无论如何,您的思维方式就像一个开发人员,更重要的是,您的思维方式就像一个java开发人员。大多数人甚至不知道什么是apt-get-install。此外,对于简单的桌面应用程序,60Mb的内存是低安装率的秘诀。正如我所说,这与问题无关,我真的不想在这里就Java与C++展开激烈的战争,大多数人甚至不知道什么是apt get install。您说过开发人员将花半小时下载和安装JVM。这显然是关于开发人员的争论。这改变了目标。如果你不想挑起一场火焰战,那么请研究一下你想谈论的事情。我说过,开发人员不在乎JVM的安装,不管它有多大的重量或需要多少时间。只需要一些桌面应用程序的人通常更喜欢下载+安装,以便尽快完成。你想歪曲我说的话。downloaders==通常不编程或不知道java、devbian OS、JVM、apt get install是什么的人。我认为LLVM和Clang组合就是这样做的。C++被编译成LLVM,并进入目标平台。