Во-первых, интерпретируемый / скомпилированный является не свойством языка, а свойством реализации. Для большинства языков большинство, если не все реализации, попадают в одну категорию, поэтому можно было бы сохранить несколько слов, говоря, что язык также интерпретируется / компилируется, но это по-прежнему важное различие, как потому, что оно помогает пониманию, так и потому, что существует довольно много языков. с полезными реализациями обоих видов (в основном в области функциональных языков, см. Haskell и ML). Кроме того, существуют интерпретаторы C и проекты, которые пытаются скомпилировать подмножество Python для кода C или C ++ (и впоследствии для машинного кода).
Во-вторых, компиляция не ограничивается преждевременной компиляцией с собственным машинным кодом. В общем, компилятор - это программа, которая преобразует программу на одном языке программирования в программу на другом языке программирования (возможно, вы даже можете иметь компилятор с тем же языком ввода и вывода, если применяются значительные преобразования). А JIT-компиляторы компилируются в собственный машинный код во время выполнения , что может дать скорость, очень близкую или даже лучшую, чем опережающая компиляция (в зависимости от эталона и качества сравниваемых реализаций).
Но чтобы перестать придираться и ответить на вопрос, который вы хотели задать: Практически (читай: используя несколько популярную и зрелую реализацию), Python компилируется . Не скомпилирован в машинный код досрочно (то есть «скомпилирован» по ограниченному и неправильному, но увы общему определению), «только» скомпилирован в байт-код , но это все же компиляция, по крайней мере, с некоторыми из преимуществ. Например, оператор a = b.c()
компилируется в поток байтов, который, когда он «разобран», выглядит примерно так load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)
. Это упрощение, на самом деле оно менее читабельно и немного более низкого уровня - вы можете поэкспериментировать со стандартным dis
модулем библиотеки и посмотреть, как выглядит реальная сделка.
Этот байт-код либо интерпретируется (обратите внимание, что есть разница, как в теории, так и в практической производительности, между интерпретацией напрямую и сначала компиляцией в некоторое промежуточное представление и интерпретацию этого), как в случае эталонной реализации (CPython), либо как интерпретацией, так и компилированием в оптимизированный машинный код во время выполнения, как с PyPy .