我一直在(Java)Bytecode上工作了一段時間,但是,我從來沒有想過要問爲什麼鍵入了一些指令?我知道在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:期望在堆棧上找到浮動。
我想知道,如果在堆棧中沒有關於類型的信息,只是位,FSTORE指令是如何知道它是在處理int而不是float?
注意:我找不到這個問題更好的標題。隨意改進它。
感謝您的回答。因此驗證器在執行類來檢測這種類型的錯誤之前執行一些數據流分析。有趣的學習:) – 2010-04-15 07:38:24