在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...
- 我们可以只使用一条指令,例如 add,来替换所有的add指令吗?
- 如果问题 1 的答案为真,这会比当前解决方案获得更好的性能吗?
- 如果 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。这些指令在位级别上的工作方式确实不同,并且仅在足够高的抽象级别上相同(即取反数字)。
这就是为什么我们有更高级别的语言来抽象掉无趣的机器细节。但是在汇编语言中,区别是必不可少的。
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...
- 我们可以只使用一条指令,例如 add,来替换所有的add指令吗?
- 如果问题 1 的答案为真,这会比当前解决方案获得更好的性能吗?
- 如果 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。这些指令在位级别上的工作方式确实不同,并且仅在足够高的抽象级别上相同(即取反数字)。
这就是为什么我们有更高级别的语言来抽象掉无趣的机器细节。但是在汇编语言中,区别是必不可少的。