Недавно в инсте задавал вопрос: "Чем отличается компилятор от интерпретатора"? По большому счету я не получил ни одного правильного ответа, за исключением такого: "компилятор - компилирует, интерпретатор - интерпретирует". Как бы ни казалось это смешным, но ответ вполне приемлемый, т.к. они отвечают за два совершенно разных процесса.



Что делает компилятор - компилирует. Его задача преобразовать / конвертировать код из человекочитаемого формата в нечто, что понятно кому-то другому (машине / интерпретатору). Это значит, что компилятор работает до того, как мы с вами запустим нашу программу. Все дело в том, что для компьютера наш код (то, что мы написал) - это филькина грамота. Он не понимает этот код. Компьютер / машина понимает лишь машинный код. Для этого и нужен компилятор - он преобразует понятный человеку код в код, понятный машине (НО НЕ В СЛУЧАЕ С JAVA!).

С Java все немного интереснее. Компилятор Java (javac) преобразует человекочиаемый код (исходники) в код, понятный интерпретатору (байт код). А вот интерпретатор уже будет интерпретировать его в машинный код прямо в момент выполнения программы. А кто же в случае с джава этот самый интерпретатор? Это наш JVM!



Зная это, мы уже понимаем, как работает интерпретатор - его задача взять код, который непонятен машине, и транстлировать его в понятный для машины. Интерпретаторы работают не только с байт кодом как в Java. Если мы говорим про другие языки программирования, то там интерпретаторы могут интерпретировать сразу исходный код (человекочитаемый) в машинный, пропуская шаг компиляции.



Итого:

Компилятор преобразует исходный код в машинный код, либо в байт код (в случае с java).

Интерпретатор - интерпретирует исходный код, либо байт код в машинный код, прямо в момент выполнения программы (когда программа работает. Собственно она и работает благодаря этому)