Java字节码如何处理多个平台?

时间:2013-08-22 16:07:16

标签: java bytecode

例如,假设您有一个只打开窗口的java程序。这显然会导致不同操作系统的不同汇编代码(在Windows上最终必须调用CreateWindowEx)。那么Java字节码(或任何其他类似语言)如何表示像这样的特定平台呢?

4 个答案:

答案 0 :(得分:6)

JVM是依赖于操作系统的,字节代码不是。

这意味着字节码是一种“通用”语言,JVM将根据其运行的系统解释最终执行。


<强>更新

正如Chris Jester-Young所说,我的答案并非严格正确:

  
      
  1. 100%纯Java程序的字节码确实与平台无关。当然,这些程序调用的底层Java平台类不是。
  2.   
  3. 大多数时候,JVM也会进行JIT编译,而不仅仅是解释。 (你可以启用纯解释模式,但它会很慢!)
  4.   

答案 1 :(得分:1)

Serenity说:

通常,编译的代码是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的接口部分都只能以一种方式工作。由于所有JVM的工作方式完全相同,因此无需重新编译,相同的代码在任何地方都可以完全相同。如果您无法通过测试以确保它们是相同的,则不允许将您的虚拟机称为“Java虚拟机”。

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

来源:How is Java platform-independent when it needs a JVM to run?

答案 2 :(得分:1)

  

在Java编程语言中,所有源代码首先以.java扩展名结尾的纯文本文件编写。然后,这些源文件由javac编译器编译为.class文件。 .class文件不包含处理器本机的代码;它包含字节码 - Java虚拟机1(Java VM)的机器语言。然后,java启动器工具使用Java虚拟机的实例运行您的应用程序。

enter image description here

please read this doc by oracle

.class filesi.e byte code)相同但不是JVM,它与操作系统不同。

答案 3 :(得分:1)

每个操作系统都有不同的Java虚拟机二进制文件。它们可以运行相同的Java字节码(类,jar),但实现有时会有所不同。

例如,所有窗口处理代码在Windows,Unix和Mac上的实现方式都不同。他们每个人都会调用操作系统原生调用打开一个窗口或绘制一些东西。您不必关心它,因为虚拟机会自动执行此操作。