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