相关疑难解决方法(0)

字节码中的类型

我已经在(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而不是浮点数?

注意:我找不到这个问题的更好的标题.随意改进它.

java verification bytecode

13
推荐指数
2
解决办法
3992
查看次数

标签 统计

bytecode ×1

java ×1

verification ×1