交叉编译器与JVM

3
我想了解JVM的目的。如果JVM是为了允许平台无关的可执行代码而创建的,那么一个能够生成平台无关的可执行代码的交叉编译器不能取代JVM吗?有关交叉编译器的信息来自于:http://en.wikipedia.org/wiki/Cross_compiler

取决于你想做什么以及如何做。交叉编译器意味着编译。字节码不需要额外的编译。Java包括操作系统钩子,包括GUI功能;如果你不使用Java,你需要编译(再次)并使用跨平台GUI库。 - Dave Newton
请告诉我,这个平台无关的可执行代码会是什么样子,它在没有JVM类似物的情况下如何在所有平台上运行? - user395760
JVM 有一个“前身”,它被称为 p-code。微软的公共语言运行时是另一个“平台无关”的可执行代码。 - Elliott Frisch
1
如果您可以将应用程序编译到每个目标环境,那么您需要为每个平台包含所需的库二进制文件,这可能会使您的小应用程序从几千字节变成数十兆字节(如果我没记错,JVM 大约是 30MB)。因此,您现在需要为每个平台包括一个可执行文件,而不是能够部署大小只有一小部分的单个 Jar(或捆绑包)。您可能还需要每个要编译的环境,以便可以链接所需的库...更多的复杂性... - MadProgrammer
你误解了交叉编译器的作用。它会为其他系统生成输出,二进制文件无法在同一台机器上运行(除非使用模拟器)。交叉编译与平台无关的代码没有任何关系。 - hyde
3个回答

3
字节码格式和JVM的优点在于能够根据实际运行时获取的分析数据对代码进行优化。换句话说,不需要静态编译本机代码是一个胜利。一种特别有趣的优化示例是单态调用站点:对于代码中每个调用实例方法的地方,运行时会跟踪确切调用方法的对象类型。在许多情况下,只涉及一个对象类型,JVM将编译该调用,就好像它是一个静态方法(没有虚函数表)。这将进一步允许它内联调用,然后进行更多优化,例如逃逸分析、寄存器分配、常量折叠等。实际上,你的批评可以(有人说,应该)被颠倒过来:为什么Java需要定义字节码呢?这些决策本可以留给实现来处理。现代趋势是分发源代码并让JIT编译器处理源代码。

1
JVM不仅仅是编译器。JVM是字节码的解释器,同时还包含JIT(即时编译器),它会根据应用程序的运行环境以不同的方式编译相同的字节码。JIT进行了大量的优化,试图以最有效的方式编译您的代码。交叉编译器不能做到这一点,因为它不知道在运行时如何使用您的代码。这是JVM相对于交叉编译器的巨大优势。
我以前没有使用过交叉编译器,但我猜交叉编译器的优点在于可以更好地控制代码的编译方式。

0
跨平台可执行代码,这就是Java字节码。 "跨平台可执行代码" 的问题在于它不能原生地运行在每个平台上(否则“跨平台”将成为一个微不足道且无趣的属性)。换句话说,没有一种格式可以在所有平台上本地运行。 JVM 可根据您对术语的定义而定,它是定义 Java 字节码的 ISA,还是允许在其本机可执行代码格式不是 Java 字节码的平台上运行 Java 字节码的组件。
当然,替代平台独立可执行代码的无限设计空间,对于该空间中的任何其他占用者都是如此。因此,在某种意义上,您可以用另一种东西替换 JVM,该替换品使用另一种平台独立的可执行代码格式来实现相同的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接