Для простоты представьте этот сценарий, у нас есть 2-битный компьютер, который имеет пару 2-битных регистров, называемых r1 и r2, и работает только с немедленной адресацией.
Предположим, что последовательность бит 00 означает добавить к нашему процессору. Также 01 означает перемещение данных в r1, а 10 означает перемещение данных на r2.
Итак, для этого компьютера и ассемблера есть язык сборки, где пример кода будет написан как
mov r1,1
mov r2,2
add r1,r2
Просто, когда я собираю этот код на родном языке, и файл будет выглядеть примерно так:
0101 1010 0001
12 бит выше - это собственный код для:
Put decimal 1 to R1, Put decimal 2 to R2, Add the data and store in R1.
Итак, в основном, как скомпилированный код работает, правильно?
Допустим, кто-то реализует JVM для этой архитектуры. В Java я буду писать код, например:
int x = 1 + 2;
Как именно JVM будет интерпретировать этот код? Я имею в виду, в конце концов, тот же бит-шаблон должен быть передан процессору, не так ли? У всех процессоров есть несколько инструкций, которые он может понять и выполнить, и в конце концов они просто некоторые бит. Допустим, скомпилированный байт-код Java выглядит примерно так:
1111 1100 1001
или что-то еще. Означает ли это, что интерпретация меняет этот код на 0101 1010 0001 при выполнении? Если это так, это уже есть в Native Code, так почему же это говорит о том, что JIT только после нескольких раз? Если он не преобразует его точно в 0101 1010 0001, то что он делает? Как это делает процессор сделать дополнение?
Возможно, в моих предположениях есть некоторые ошибки.
Я знаю, что интерпретация выполняется медленно, скомпилированный код быстрее, но не переносимый, а виртуальная машина "интерпретирует" код, но как? Я ищу "как точно/технически интерпретировать". Любые указатели (например, книги или веб-страницы) приветствуются вместо ответов.