我已经在(Java)字节码上工作了一段时间,但是,我从来没有想过为什么要输入一些指令?我知道在 ADD 操作中,我们需要区分整数加法和 FP 加法(这就是我们有 IADD 和 FADD 的原因)。但是,为什么我们需要区分 ISTORE 和 FSTORE 呢?它们都涉及完全相同的操作,即将 32 位从堆栈移动到局部变量位置?
我能想到的唯一答案是类型安全,以防止这种情况:(ILOAD,ILOAD,FADD)。但是,我相信类型安全已经在 Java 语言级别强制执行。好的,Class 文件格式不直接与 Java 耦合,那么这是对不支持它的语言强制执行类型安全的一种方法吗?任何想法?谢谢你。
编辑:跟进里迪的回答。我写了这个最小的程序:
public static void main(String args[])
{
int x = 1;
}
编译为:
iconst_1
istore_1
return
使用字节码编辑器,我更改了第二条指令:
iconst_1
fstore_1
return
它返回了一个java.lang.VerifyError: Expecting to find float on stack。
我想知道,如果堆栈上没有关于类型的信息,只有位,那么 FSTORE 指令是如何知道它处理的是 int 而不是 float?
注意:我找不到这个问题的更好标题。随意改进它。