Для простоты представьте этот сценарий: у нас есть 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 при выполнении? Если это так, то это уже есть в собственном коде, так почему же сказано, что JIT срабатывает только после определенного количества раз? Если он не преобразует его точно в 0101 1010 0001, то что он делает? Как он заставляет процессор выполнять добавление?
Может быть, в моих предположениях есть какие-то ошибки.
Я знаю, что интерпретация выполняется медленно, скомпилированный код быстрее, но не переносится, а виртуальная машина «интерпретирует» код, но как? Я ищу, "как именно / технически выполняется перевод". Любые указатели (например, книги или веб-страницы) также приветствуются вместо ответов.