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