 Простой интерпретатор анализирует и тут же выполняет программу покомандно (или построчно), по мере поступления её исходного кода на вход интерпретатора.
Обычно применяется для REPL (read-eval-print loop) — форма организации простой интерактивной
среды программирования в рамках средств интерфейса командной строки.
Более продвинутым вариантом этой технологии является Jupyter Notebook,
в котором последовательность действий разделяется на шаги и можно возращаться к предыдущему шагу.
Интерпретатор компилирующего типа — это система из компилятора,
переводящего исходный код программы в промежуточное представление, например,
в байт-код, и собственно интерпретатора,
который выполняет полученный промежуточный код (так называемая виртуальная машина).
Достоинством таких систем является большее быстродействие выполнения программ
(за счёт выноса анализа исходного кода в отдельный, разовый проход, и минимизации
этого анализа в интерпретаторе). В Python результат такого анализа сохраняются в файлах .pyc и,
если исходный файл не меняется, то используется повторно.
Вместо перевода в байт-код можно остановиться на переводе в дерево разбора.
Так как производительность интерпретации байт-кода низкая из-за динамической типизации,
для повышения производительности используется JIT-компиляция (Just-in-time compilation) -
динамическая компиляция байт-кода в машинный код непосредственно во время работы программы.
Плюсы: высокая производительность.
Минусы: объем используемой памяти возрастает и увеличивается начальное время
выполнения участка кода из-за анализа для создания машинного кода.
В JVM и .NET байт-код используется для запуска скомпилированной программы на
компьютерах с разной архитектурой, и можно применить JIT-компиляцию еще до выполнения программы,
но обычно она выполняется только для часто используемых функций.
В интерпретаторах только эта технология может обеспечить приемлимую эффективность
и гарантирует безопасность исполнения. При частой смене типа входных данных время
работы программы может резко увеличиться.