java - 当 Java 需要 JVM 来运行时,它是如何独立于平台的?

标签 java cross-platform

我刚开始学习 Java,对平台独立性这个话题感到困惑。

“独立”不是意味着 Java 代码应该在任何机器上运行并且不需要安装特殊软件吗?然而,JVM 需要存在于机器中。

例如,我们需要 Turbo C 编译器来编译 C/C++ 源代码然后执行它。机器必须有C编译器。

有人能问一下,Java 被描述为“平台无关”是什么意思吗?

最佳答案

通常,编译后的代码是 CPU“执行”程序所需的确切指令集。在 Java 中,编译后的代码是一组精确的“虚拟 CPU”指令集,需要在每台物理机器上都以相同的方式工作。

因此,从某种意义上说,Java 语言的设计者决定该语言和编译后的代码将独立于平台,但由于代码最终必须在物理平台上运行,他们选择将所有平台JVM中的依赖代码。

JVM 的这一要求与您的 Turbo C 示例相反。使用Turbo C,编译器会产生平台相关的代码,不需要类似JVM的工作,因为编译后的Turbo C程序可以直接由CPU执行。

使用 Java,CPU 执行依赖于平台的 JVM。这个正在运行的 JVM 然后执行独立于平台的 Java 字节码,前提是您有一个可供它执行的 JVM。您可能会说,编写 Java 代码,您不是为要在物理机上执行的代码编写程序,而是要编写要在 Java 虚拟机上执行的代码。

所有这些 Java 字节码都可以在所有 Java 虚拟机上工作的唯一方法是为 Java 虚拟机的工作方式编写了一个相当严格的标准。这意味着无论您使用什么物理平台,Java 字节码与 JVM 接口(interface)的部分都保证只能以一种方式工作。由于所有 JVM 的工作方式完全相同,因此相同的代码在任何地方都完全相同,无需重新编译。如果您无法通过测试以确保其相同,则不允许将您的虚拟机称为“Java 虚拟机”。

当然,有一些方法可以破坏 Java 程序的可移植性。您可以编写一个程序来查找仅在一个操作系统上找到的文件(例如 cmd.exe)。您可以使用 JNI,它有效地允许您将已编译的 C 或 C++ 代码放入一个类中。您可以使用仅适用于特定操作系统的约定(例如假设“:”分隔目录)。但是你可以保证永远不必为不同的机器重新编译你的程序,除非你正在做一些非常特别的事情(比如 JNI)。

关于java - 当 Java 需要 JVM 来运行时,它是如何独立于平台的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2748910/

相关文章:

java - 如何在 JPanel 类中创建 JList "refresh"方法

javascript - QuickConnect 相对于 Phonegap 的优势?

linux - 将 fork-exec 习惯用法移植到 Windows

运行时输出目录的 cmake 生成器表达式

java - 来自类的 Intent 未启动

java - 为什么 new File(File Parent, String childName) 表现不明显?

java - org.hibernate.exception.JDBCConnectionException : Error calling DriverManager#getConnection

java - Java Struts Web 应用程序中的 DataGrid

android - 开始 Android 开发 : Native or cross-platform?

javascript - 您对 Android 网络应用有什么体验(限制、提示、最佳实践)?