除非我误解JVM是如何工作的,否则Java字节码的排序与编译的C不同,只是它在JVM上运行而不是在操作系统(JVM充当操作系统)上运行?
如果是这样,这是不是意味着新的jar应该可以在我想要的任何JVM版本上运行?
或者在Java版本之间的实际字节码指令中是否存在某些差异,这些指令在C之类的东西中不存在?
答案 0 :(得分:3)
它不是向前兼容的,因为这意味着不可能引入新的字节码。
当一个新版本的java引入了一个新的字节码时,当然,旧版本的VM无法解释该字节码。
这意味着java无法向前兼容,因为它维护着一组不断发展的(本机)命令。
这与C / C ++不同。这种语言的编译器为您要定位的确切处理器生成字节代码。处理器的命令集不会改变,它是静态的。因此,在为特定CPU编译C时,只要存在与所需操作相对应的指令,就会编译并运行每个版本的C / C ++标准。
编辑:当你仔细观察时,也可以在C / C ++中看到这个问题。例如,标题<cstdint>
引入了可选类型,例如int64_t
。这是出于向前兼容的原因。较旧的芯片可能无法处理64位整数类型,因此为了保持前向兼容性,标准使它们可以声明。
答案 1 :(得分:2)
没有。通常会引入实际(不兼容)差异来支持新功能(并且总是版本号)。字节码是向后兼容的,因为旧的编译器编译的字节代码可以由较新的环境(向后)调用(和链接)。它并非转发兼容,这是您实际询问的内容。无论如何,您可以使用javap -v
检查指令助记符并查看版本。
此外,根据您的问题,(作为人为的示例)使用gcc
编译的代码以-march=586
(可能)不会运行的英特尔奔腾为目标在486
或386
上(与-mtune
相比)。