为什么编译的java不能转发兼容

时间:2015-07-30 01:18:03

标签: java jvm bytecode

除非我误解JVM是如何工作的,否则Java字节码的排序与编译的C不同,只是它在JVM上运行而不是在操作系统(JVM充当操作系统)上运行?

如果是这样,这是不是意味着新的jar应该可以在我想要的任何JVM版本上运行?

或者在Java版本之间的实际字节码指令中是否存在某些差异,这些指令在C之类的东西中不存在?

2 个答案:

答案 0 :(得分:3)

它不是向前兼容的,因为这意味着不可能引入新的字节码。

当一个新版本的java引入了一个新的字节码时,当然,旧版本的VM无法解释该字节码。

这意味着java无法向前兼容,因为它维护着一组不断发展的(本机)命令。

这与C / C ++不同。这种语言的编译器为您要定位的确切处理器生成字节代码。处理器的命令集不会改变,它是静态的。因此,在为特定CPU编译C时,只要存在与所需操作相对应的指令,就会编译并运行每个版本的C / C ++标准。

编辑:当你仔细观察时,也可以在C / C ++中看到这个问题。例如,标题<cstdint>引入了可选类型,例如int64_t。这是出于向前兼容的原因。较旧的芯片可能无法处理64位整数类型,因此为了保持前向兼容性,标准使它们可以声明。

答案 1 :(得分:2)

没有。通常会引入实际(不兼容)差异来支持新功能(并且总是版本号)。字节码是向后兼容的,因为旧的编译器编译的字节代码可以由较新的环境(向后)调用(和链接)。它并非转发兼容,这是您实际询问的内容。无论如何,您可以使用javap -v检查指令助记符并查看版本。

此外,根据您的问题,(作为人为的示例)使用gcc编译的代码以-march=586(可能)不会运行的英特尔奔腾为目标在486386上(与-mtune相比)。