JIT отличается от интерпретатора байтового кода.
Рассмотрим следующую функцию C:
int sum() {
return 5 + 6;
}
Это будет скомпилировано непосредственно машинным кодом. Точные инструкции, скажем, для процессоров x86 и ARM будут другими.
Если бы мы написали базовый интерпретатор байт-кода, он мог бы выглядеть примерно так:
for(;;) {
switch(*currentInstruction++) {
case OP_PUSHINT:
*stack++ = nextInt(currentInstruction);
break;
case OP_ADD:
--stack;
stack[-1].add(*stack);
break;
case OP_RETURN:
return stack[-1];
}
}
Это может интерпретировать следующий набор инструкций:
OP_PUSHINT (5)
OP_PUSHINT (6)
OP_ADD
OP_RETURN
Если вы скомпилировали интерпретатор байт-кода как на x86, так и на ARM, то вы сможете запустить один и тот же байт-код без дальнейшей перезаписи интерпретатора.
Если вы написали JIT-компилятор, вам нужно будет выдавать специфические для процессора инструкции (машинный код) для каждого поддерживаемого процессора, тогда как интерпретатор байт-кода полагается на компилятор C ++ для выработки специфических для процессора инструкций.