当我使用C ++程序时,我需要Turbo C编译器;当我有一个Java程序时,我需要有JVM。仍然C ++不是平台独立的,但Java是! 如果任何Java程序需要运行JVM才能执行,为什么Java被称为独立于平台?
答案 0 :(得分:4)
Java 操作系统独立,因为它在Java平台(JVM)上运行:口号是“一次编写,随处运行”,因为您使用JDK API编写代码,编译一次,它可以在任何有JVM的操作系统上运行。你编写你的代码,将它包装在一个jar中,然后在合理的范围内运行你想要使用它的jar。 JDK和JVM的工作是抽象环境中的差异。
相比之下,特别是在创建Java时,为多个操作系统编写C或C ++是一件非常痛苦的事情,通常需要额外的工具包(当然,JDK和JVM是各种工具包),即使在今天仍然需要至少重新编译目标系统。
Java的操作系统独立性并没有什么神奇之处。完全可能为C或C ++构建相同的东西:编译为中间形式,提供运行时知道如何解释或重新编译不同环境的中间形式,并提供抽象环境差异的库。 Java只是...做了这个,用它自己的语言旋转。后来,.Net平台也是如此。
答案 1 :(得分:3)
没有软件真正“独立”。最终,您的程序必须调用底层操作系统才能进行一些基本操作,如分配内存,创建新线程等。
实现“跨平台”的可执行文件的方法是为每个OS创建特定的可执行文件。通常的做法是为每个操作系统编写不同的代码,然后将其“隐藏”在跨平台接口中,并将相关代码编译到相关的操作系统。例如,std::thread
对于使用此类的用户来说是“跨平台的”,但在幕后它会根据编译时指定的操作系统调用不同的函数(例如CreateThread
on Windows,但* nix OS上的pthread_create
)。
基本上,JVM是一个C / C ++可执行文件,它是用每个操作系统的不同功能集编写的,并且是为每个操作系统单独编译的。在Linux上运行的JVM可执行文件不能在Windows上运行,反之亦然。
JVM根据当前运行的操作系统和CPU将.class
文件编译为机器代码,这就是Java程序可以“随处运行”的原因。
但基本上,这是谎言。这就像说人类可以生活在火星上...... 如果他住在一个密封的宇宙飞船内,有适当的温度,水,食物,空气和阳光供应
所以Java程序可以在任何地方运行.... 如果已经在计算机上安装并运行了JVM 。
答案 2 :(得分:2)
首先,我想链接到这个有很多好消息的问题。
上面的问题是关于“平台独立”意味着什么的评论,但我想提到的一件事,但在这里总结得很好
你说得对,平台独立性意味着同一个程序可以在任何平台(操作系统)上运行而无需任何修改。
我们编写的代码称为“一次编写,随处运行”或其他人说“运行一次,到处测试。”
我们的Java代码应该在任何地方运行,但有时会出现很少的原生错误,即有人在使用JavaFX-8打印在Mac OSX上打印时遇到问题,而在Windows上工作正常。还有一个错误报告来解决这个“Mac特定的Java问题。”
所以....在大多数情况下,底层JavaSE代码应该适用于所有平台......
**但是,如果您确实在多台计算机上运行了应用程序并使用文件系统,则必须进行检查以了解您正在使用的操作系统,即(System.getProperty("os.name").contains("Windows"));
**
有关此处的更多信息https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html
还有另一件事需要注意。
某些组件不能跨平台工作,即JavaSE与JavaEE。 JSP / JSF是JavaEE中在Web上使用的,专门用于在服务器和网页上运行代码,但不能在桌面中使用(据我所知)。
但是,JavaSE具有诸如Swing和JavaFX之类的GUI,它们也无法在Web上运行,无论是在客户端还是在服务器中。
Android拥有它自己的命令和它可以/不能做的事情,其他“平台”也有它的具体细节。
总的来说,底层Java架构是在所有平台上使用的,其中在某些平台中使用某些“Java Specifics”,即JSP。
在Java的情况下,应用程序在 Java虚拟机中运行,该虚拟机本身不是独立于平台的。这必须是实际机器(操作系统)和您编写的Java代码之间的接口。
我对JVM的知识并不是很了解,但似乎每个JVM都是专门为每个“平台”量身定制的(这就是为什么要安装太多版本的原因),并且做了很多繁重的工作。对于每个操作系统,您可能必须自己完成这些操作(不确定它是如何工作的)。
想要一个适用于Windows的JVM? Np ...... Linux? Np ....你刚买的所有那些花哨的技术的新车?那个JVM ......或者你刚停放车的新停车计时器怎么样?是的,那里也有一个......
例如,以下是本网站关于如何将Java转换为适用于Android的Dalvik的答案。
https://stackoverflow.com/a/24570735/3599960
希望这有帮助并且有意义。
答案 3 :(得分:1)
C或C ++程序被编译成本机代码,接近金属,其中metal是OS(早期它可能是DOS时代的硬件)。在目标平台上运行可执行文件不需要进一步重新编译。但是,开发人员必须为他/她缩进程序运行的所有平台构建可执行文件。
它不仅意味着不同的操作系统,而且意味着特定操作系统的位置。例如,64位二进制文件(EXE)无法在32位操作系统上运行(反之亦然)。这里Java / .NET和其他平台虚拟化引擎对于开发人员来说是有利的 - 他们只构建一次(例如“AnyCPU”用于C#模块),并且不需要提供多个二进制文件(EXE文件) )。在给定操作系统上安装的运行时将重新编译(JIT - 及时编译)。
我不确定Java,但可以将.NET程序编译到特定平台。 .NET引擎也可以通过JIT将中间(或Java中的字节代码)编译为本机格式一次(并保持EXE直接运行)。优点是.NET JIT编译器可以利用当前的硬件和最新的CPU指令,C ++程序不能(它不会有JIT /重新编译)。