Я работал некоторое время на (Java) Bytecode, однако мне никогда не приходило в голову спросить, почему вводятся некоторые инструкции? Я понимаю, что в операции ADD нам нужно различать целочисленное добавление и добавление FP (почему у нас есть IADD и 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: ожидая найти float в стеке.
Интересно, если в стеке нет информации о типе, только битах, как команда FSTORE знала, что она имеет дело с int, а не с плавающей точкой?
Примечание: Я не мог найти лучшего заголовка для этого вопроса. Не стесняйтесь улучшать его.