私はしばらくの間 (Java) バイトコードに取り組んできましたが、なぜいくつかの命令が入力されたのかを尋ねることは一度もありませんでした。ADD 演算では、整数の加算と FP の加算を区別する必要があることは理解しています (これが、IADD と FADD がある理由です)。しかし、なぜ ISTORE と FSTORE を区別する必要があるのでしょうか? どちらも、スタックからローカル変数の位置に 32 ビットを移動するまったく同じ操作を伴いますか?
私が考えることができる唯一の答えは、これを防ぐための型安全性です:(ILOAD、ILOAD、FADD)。ただし、型安全性は Java 言語レベルですでに適用されていると思います。クラス ファイル形式は Java と直接結合されていません。これは、Java をサポートしていない言語に対して型安全性を強制する方法ですか? 何か考えはありますか?ありがとうございました。
編集: Reedyの回答をフォローアップします。私はこの最小限のプログラムを書きました:
public static void main(String args[])
{
int x = 1;
}
コンパイルされたもの:
iconst_1
istore_1
return
バイトコード エディタを使用して、2 番目の命令を次のように変更しました。
iconst_1
fstore_1
return
java.lang.VerifyError: Expecting to find float on stack を返しました。
スタック上に型に関する情報がなく、ビットだけである場合、FSTORE 命令は float ではなく int を処理していることをどのように認識したのでしょうか?
注:この質問のより適切なタイトルが見つかりませんでした。お気軽に改善してください。