Не существует компилируемых языков и языков интерпретатора. Они всего лишь реализации языка.

Один язык может иметь более одного использования компиляторов и интерпретаторов, работающих вместе для получения окончательного результата.

Компилятор:

Компилятор преобразует один язык в другой.

source program →| compiler | →Target program

На этом этапе проводится оптимизация кода, если это возможно / требуется.

При компиляции программа не выполняется.

Если целевой язык - машинный код, он может выполняться непосредственно на процессоре.

input →| target program | →output

В наши дни большинство компиляторов переводят исходный код в машинно-независимый байт-код.

Затем байт-код интерпретируется во время выполнения и выполняется с использованием интерпретаторов и JIT.

Переводчик:

Интерпретатор выполняет исходную программу или целевую программу (полученную на этапе компиляции) по одному оператору за раз.

Оптимизация кода невозможна, потому что она сканирует каждую строку, выполняющую его. Таким образом, нет возможности увидеть впереди текущую строку и оптимизировать ее.

source/target program, input →| interpreter | → output

В фоновом режиме интерпретируются даже скомпилированные программы (C, C ++ и т. д.). Есть интерпретатор, запускающий двоичный файл, который реализуется базовым процессором.

ЦП можно рассматривать как аппаратный интерпретатор его машинного кода.

ВМ можно рассматривать как программный интерпретатор.

Пример:

Python может быть преобразован в байт-код, а затем выполнен путем интерпретации промежуточного байт-кода или может быть выполнен напрямую без преобразования его в байт-код.

Итак, технически не существует компилируемых языков или интерпретируемых языков! В нем говорится только о реализации языка.