Java 交叉编译器与JVM

Java 交叉编译器与JVM,java,cross-compiling,Java,Cross Compiling,我想知道JVM的用途。如果创建JVM是为了允许平台无关的可执行代码,那么能够生成平台无关的可执行代码的交叉编译器难道不能取代JVM吗 有关交叉编译器的信息检索自:JVM所做的不仅仅是编译。JVM是字节码的解释器,它还包含编译字节码的JIT(实时)编译器——但根据应用程序的上下文,相同的字节码可以根据运行时上下文进行不同的编译(它决定在运行时如何编译字节码)。JIT正在进行lof优化——它试图以最有效的方式编译代码。交叉编译器无法完成(所有)这一切,因为它不知道在运行时如何使用代码。这是JVM相对

我想知道JVM的用途。如果创建JVM是为了允许平台无关的可执行代码,那么能够生成平台无关的可执行代码的交叉编译器难道不能取代JVM吗


有关交叉编译器的信息检索自:

JVM所做的不仅仅是编译。JVM是字节码的解释器,它还包含编译字节码的JIT(实时)编译器——但根据应用程序的上下文,相同的字节码可以根据运行时上下文进行不同的编译(它决定在运行时如何编译字节码)。JIT正在进行lof优化——它试图以最有效的方式编译代码。交叉编译器无法完成(所有)这一切,因为它不知道在运行时如何使用代码。这是JVM相对于交叉编译器的最大优势

我以前没有使用过交叉编译器,但我想交叉编译器的优点是您可以更好地控制代码的编译方式

与平台无关的可执行代码

这就是Java字节码。“与平台无关的可执行代码”的问题在于它不可能是每个平台的本机代码(否则,与平台无关将是一个微不足道的、无趣的属性)。换言之,没有一种格式在所有平台上运行时都没有本机支持。 JVM是定义Java字节码的ISA,或者是允许Java字节码在可执行代码的本机格式不是Java字节码的平台上运行的组件,具体取决于您对该术语的定义


当然,对于替代的独立于平台的可执行代码来说,存在着无限的设计空间,对于所述空间的任何其他占用者来说,上述情况都是正确的。因此,是的,在某种意义上,您可以用另一种东西来代替JVM,它可以为另一种独立于平台的可执行代码格式实现相同的功能。

字节码格式和JVM的优点是能够在运行时根据实际运行期间获取的分析数据优化代码。换句话说,没有静态编译的本机代码是一种胜利

运行时编译优势的一个特别有趣的例子是单态调用站点:对于代码中调用实例方法的每个位置,运行时都会精确跟踪调用该方法的对象类型。在很多情况下,只涉及一种对象类型,如果调用是静态方法(不涉及vtables),JVM将编译该调用。这将进一步允许它内联调用,然后进行更多优化,如转义分析、寄存器分配、常量折叠等等


事实上,你的批评可能(有人说,应该)被颠倒过来:为什么Java要定义字节码,修正许多可能留给实现的设计决策?现代的趋势是分发源代码并让JIT编译器处理这些代码。

取决于您想做什么以及如何做。交叉编译器意味着编译。字节码不需要额外编译。Java包括操作系统挂钩,包括GUI功能;如果不使用Java,您需要编译(再次)并使用跨平台GUI库。请告诉我,这个独立于平台的可执行代码是什么样子,在没有JVM模拟的所有平台上它将如何运行?JVM有一个“预游标”,它被称为。微软的公共语言运行库是另一个“独立于平台”的可执行代码。如果你能将你的应用程序编译到每个目标环境中,你需要为每个平台包含所需的库二进制文件,这可以让你的小应用程序从几千字节变为10s兆字节(如果我记得的话,JVM大约是30mb)因此,我们不需要部署单个Jar(或捆绑包)现在,您需要为每个平台包含一个可执行文件。您可能还需要编译到的每个环境,以便可以链接到所需的库…更复杂的是…您误解了交叉编译器的功能。它为其他系统生成输出,而不是运行它的位置,二进制可以不在同一台计算机上运行(除了emulator)。交叉编译与平台无关的代码无关。