我想了解JVM的目的。如果JVM是为了允许平台无关的可执行代码而创建的,那么一个能够生成平台无关的可执行代码的交叉编译器不能取代JVM吗?有关交叉编译器的信息来自于:http://en.wikipedia.org/wiki/Cross_compiler
字节码格式和JVM的优点在于能够根据实际运行时获取的分析数据对代码进行优化。换句话说,不需要静态编译本机代码是一个胜利。一种特别有趣的优化示例是单态调用站点:对于代码中每个调用实例方法的地方,运行时会跟踪确切调用方法的对象类型。在许多情况下,只涉及一个对象类型,JVM将编译该调用,就好像它是一个静态方法(没有虚函数表)。这将进一步允许它内联调用,然后进行更多优化,例如逃逸分析、寄存器分配、常量折叠等。实际上,你的批评可以(有人说,应该)被颠倒过来:为什么Java需要定义字节码呢?这些决策本可以留给实现来处理。现代趋势是分发源代码并让JIT编译器处理源代码。
JVM不仅仅是编译器。JVM是字节码的解释器,同时还包含JIT(即时编译器),它会根据应用程序的运行环境以不同的方式编译相同的字节码。JIT进行了大量的优化,试图以最有效的方式编译您的代码。交叉编译器不能做到这一点,因为它不知道在运行时如何使用您的代码。这是JVM相对于交叉编译器的巨大优势。我以前没有使用过交叉编译器,但我猜交叉编译器的优点在于可以更好地控制代码的编译方式。
跨平台可执行代码,这就是Java字节码。 "跨平台可执行代码" 的问题在于它不能原生地运行在每个平台上(否则“跨平台”将成为一个微不足道且无趣的属性)。换句话说,没有一种格式可以在所有平台上本地运行。 JVM 可根据您对术语的定义而定,它是定义 Java 字节码的 ISA,还是允许在其本机可执行代码格式不是 Java 字节码的平台上运行 Java 字节码的组件。当然,替代平台独立可执行代码的无限设计空间,对于该空间中的任何其他占用者都是如此。因此,在某种意义上,您可以用另一种东西替换 JVM,该替换品使用另一种平台独立的可执行代码格式来实现相同的功能。