Язык программирование это в первую очередь спецификация, его формальное описание.
Так уж вышло, что в спецификации языка Python есть фичи свойственные интерпретируемым языкам программирования, например eval. Т.е. в питоне можно во время выполнения записать в любую строковую переменную кусок кода и выполнить его. Например можно считать из файла какой-то кусок кода и выполнить его. Можно писать программы которые изменяют сами себя во время выполнения.
Это невероятная гибкость, которая позволяет писать такие программы которые невозможно написать на компилирующемся Си. (окей, возможно но очень сложно)
Однако чтобы такое можно было сделать, необходимо уметь транслировать любой кусок текста во время выполнения. Иными словами нужен интерпретатор, который будет исполнять такой код.
Обычно для реализации подобного языка используют виртуальную машину и байткод.
Хотя известны случаи когда eval реализуется через компиляцию в машкод во время выполнения, а не через интерпретацию байткода, например в SBCL.
Спасибо за ответ. Как я понял, наоборот, создать интерпретатор для компилируемых языков ничто не мешает?