为什么 Java 平台独立?

Why is Java platform independent?

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

没有软件是真的"independent"。最终,您的程序必须调用底层 OS 才能进行一些基本操作,例如分配内存、创建新线程等。

实现 "cross platform" 可执行文件的方法是为每个 OS 创建特定的可执行文件。通常的做法是为每个 OS 编写不同的代码,然后 "hide" 在跨平台界面中将相关代码编译为相关 OS。例如,std::thread 对使用此 class 的用户来说是 "cross-platform",但在后台它会根据编译时指定的 OS 调用不同的函数(例如 Windows 上的 CreateThread,但 *nix OS 上的 pthread_create)。

所以基本上,JVM 是一个 C/C++ 可执行文件,为每个 OS 使用不同的函数集编写,并为每个 OS 单独编译。适用于 Linux 的 JVM 可执行文件不会适用于 Windows,反之亦然。

JVM 根据当前运行的 OS 和 CPU 将 .class 文件编译为机器代码,所以这就是为什么 Java 程序可以 "run anywhere".

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

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

Java 是 操作系统 独立的,因为它在 Java 平台(JVM)上运行:口头禅是 "write once, run anywhere" 因为您使用 JDK API 编写代码,编译一次,它就可以在任何具有可用 JVM 的操作系统上运行。您编写代码,将其封装在一个 jar 中,然后该 jar 在合理的范围内运行在您想要使用它的任何地方。 JDK 和 JVM 的工作是抽象掉 环境差异。

相比之下,特别是在创建 Java 的时候,为多个操作系统编写 C 或 C++ 是一个很大的痛苦,通常需要额外的工具包(当然,JDK 和 JVM 是一个各种工具包),即使在今天仍然需要至少为目标系统重新编译。

Java 的 OS 独立没有什么神奇之处。完全有可能为 C 或 C++ 构建相同的东西:编译为中间形式,提供知道如何为不同环境解释或重新编译该中间形式的运行时,并提供抽象出环境差异的库。 Java 只是...做到了,对语言有自己的看法。后来.Net平台也是如此

首先,我想link回答这个有很多有用信息的问题。

https://softwareengineering.stackexchange.com/questions/85175/what-is-the-exact-meaning-of-platform-independence

上面的问题是关于"Platform independent,"意味着什么的评论,但我想提的一件事是

You're right, platform independence means that the same program works on any platform (operating system) without needing any modification.


我们写的代码被称为"Write once, run anywhere"或者别人说的"run once, test everywhere."

我们的 Java 代码 应该 运行 无处不在,但有时会有一些本机错误导致问题,即有人在 Mac OSX 使用 JavaFX-8 打印,而在 Windows 上工作正常。还有一个关于这个的错误报告来修复这个 "Mac specific Java issue."

所以....在大多数情况下,底层JavaSE 代码应该适用于所有平台......

** 然而,如果您确实在多台计算机上有一个应用程序 运行ning 并使用文件系统,您将必须进行检查以了解您正在使用哪个 OS,即, (System.getProperty("os.name").contains("Windows")); **

更多信息请点击此处https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

还有一点需要注意

某些组件不能跨平台工作,即 JavaSE 与 JavaEE。 JSP/JSF 是在 JavaEE 中使用的,在网络上,它特定于服务器和网页上的 运行ning 代码,但不能在桌面上使用(以我的知识)。

但是,JavaSE 具有 GUI,例如 Swing 和 JavaFX,它们也无法在 Web 上运行,无论是在客户端还是在服务器中。

Android 有它自己的一组命令和它 can/cannot 做的事情,其他 "Platforms" 也有它的细节。

总体而言,底层 Java 架构是所有平台都使用的架构,其中某些 "Java Specifics" 用于某些平台,即 JSP.


那么 Java 有什么不同呢?

In the case of Java the application runs in a Java Virtual Machine which itself isn't platform independent. This has to be the interface between the actual machine (operating system) and the Java code you've written.

我不太了解 JVM,但似乎每个 JVM 都是专门针对每个 "Platform"(这就是为什么要安装这么多版本),并且做了很多在后台进行繁重的工作,而对于每个 OS.

,您可能必须自己全部完成(不确定它是如何工作的)

想要 Windows 的 JVM? np...Linux? Np ....你刚买的那辆新车里面有那么多花哨的技术?用于此的 JVM……或者您刚刚停放汽车的那个新停车收费表怎么样?是的,也有一个...

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


希望这对您有所帮助并且有意义。

C 或 C++ 程序被编译成本机代码,接近金属,其中金属是 OS(早期它也可能是 D[ 中的硬件=30=]时代)。 运行 目标平台上的可执行文件无需进一步重新编译。但是,开发人员必须为所有平台构建可执行文件 he/she 缩进程序应该 运行。

它不仅仅意味着不同的 OSes,还意味着特定的 OS 的位数。例如,64 位二进制文​​件 (EXE) 不能在 32 位 OS 上 运行(反之亦然,但大多数情况下是可能的)。这里 Java/.NET 和其他 平台虚拟化 引擎对开发人员来说是福音 - 他们只构建一次(例如 "AnyCPU" 用于 C# 模块),并且不不需要提供多个二进制文件(EXE 文件)。在给定 OS 上安装的 运行time 将重新编译(JIT - Just In Time 编译)。

我不确定 Java,但是 a.NET 程序可以编译到特定平台。 .NET 引擎也可以将中间体(或 Java 中的字节码)JIT 编译成本机格式一次(并保留直接 运行 的 EXE)。优点是 .NET JIT 编译器可以利用当前的硬件和最新的 CPU 指令,而 C++ 程序不能(它不会有 JIT/re-compilation)。