3) Интерпретатор компилирующего типа - компилирует команды на языке высокого уровня в байт код.
Байт код понятен среде/виртуальной машине (.NET, Java), которая компилирует байт код в двоичный код.
Вообще достаточно кривой термин, тк тут у нас две независимые сущности должно быть:
1. Компилятор исходного кода в байт-код
2. Интерпретатор этого байт-кода
При этом интерпретатор байткода ничего не знает об исходном коде.
Тоесть схема такая:
1. Берём исходный код (.java) и компилируем его при помощи компилятора (javac) в байткод (.jar)
2. Запускаем интерпретатор (javav) и передаём ему байтеод (.jar). Интерпретатор обрабатывает команды поштучно
Между первым и вторым шагом может пройти сколько угодно времени, и вместо интерпретатора может быть компилятор байткода в машинный код, а в сам интерпретатор может быть встроен jit компилятор, а может и нет (а может быть выключен)