Java 在JVM指令中,有些指令具有不同的前缀,但它们的功能非常相似。我们真的需要它们吗?若有,原因为何?
用于添加:iadd/ladd/fadd/dadd, 对于sub:isub/lsub/fsub/dsub, 对于mul:imul/lmul/fmul/dmul 用于div:idiv/ldiv/fdiv/ddiv 对于rem:irem/lrem/frem/drem 从负开始:ineg/lneg/fneg/dnegJava 在JVM指令中,有些指令具有不同的前缀,但它们的功能非常相似。我们真的需要它们吗?若有,原因为何?,java,jvm,java-bytecode-asm,Java,Jvm,Java Bytecode Asm,用于添加:iadd/ladd/fadd/dadd, 对于sub:isub/lsub/fsub/dsub, 对于mul:imul/lmul/fmul/dmul 用于div:idiv/ldiv/fdiv/ddiv 对于rem:irem/lrem/frem/drem 从负开始:ineg/lneg/fneg/dneg 我们能否仅使用一条指令(例如,添加)来替换所有添加指令 如果Q1的答案是正确的,那么这会比当前的解决方案获得更好的性能吗 如果Q1为假,为什么 问题1:我们能否只使用一条指令,例如,add
JVM字节码指令集也被设计为稳定的;i、 e.允许20多年前编译成字节码的Java代码仍然可以在当前JVM上执行。对破坏兼容性的指令集的更改是令人憎恶的:它们不会发生。就像在真实的机器中一样,对double或int求反不能有相同的指令。这些指令在位级别上的工作方式确实不同,只有在足够高的抽象级别上(即对数字求反)才是相同的
这就是为什么我们有更高级的语言来抽象掉无趣的机器细节。但是在汇编语言中,区别是必不可少的。非常相似与完全相同是完全不同的。如果所有这些说明都做了同样的事情,你真的认为它们都会存在吗?这只是命名法。Java为不同的参数类型选择了显式不同的名称,否则可能是相同名称的“重载”。本质上,它们是不同的指令,无论它们是否共享助记符号。