在JVM Instructions中,有些指令的前缀不同,但是它们的功能非常相似。我们真的需要它们吗?如果是,为什么?

In JVM Instructions, some are of different prefixes but their functions are quite similar. Do we really need them all? If Yes, why?

For add : iadd/ladd/fadd/dadd, For sub : isub/lsub/fsub/dsub, For mul : imul/lmul/fmul/dmul For div : idiv/ldiv/fdiv/ddiv For rem : irem/lrem/frem/drem Fro neg : ineg/lneg/fneg/dneg...

  1. 我们可以只使用一条指令,例如 add,来替换所有的add指令吗?
  2. 如果问题 1 的答案为真,这会比当前解决方案获得更好的性能吗?
  3. 如果 Q1 为假,为什么?

Q1: Can we only use only one instruction, e.g. add to implements all the add instructions?

没有。它们被定义为做不同的事情。相似,但不同。

If Q1 is false, why?

因为那是他们定义它的方式。字节码指令集被设计为紧凑、易于代码生成,并且能够表达 Java 语义。指令集满足了这些目标……很好。

JVM 字节码指令集也被设计成稳定的;即允许 20 多年前编译为字节码的 Java 代码仍然可以在当前的 JVM 上执行。破坏兼容性的指令集更改是令人厌恶的:它们不会发生。

就像在真实机器中一样,您不能使用相同的指令来否定 double 或 int。这些指令在位级别上的工作方式确实不同,并且仅在足够高的抽象级别上相同(即取反数字)。

这就是为什么我们有更高级别的语言来抽象掉无趣的机器细节。但是在汇编语言中,区别是必不可少的。