通常,编译代码是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)。