Является ли Python интерпретируемым или компилируемым языком
Что проверяют
Понимаете ли вы, что это свойство реализации, а не языка, и знаете ли про байт-код.
Как отвечать
Правильный ответ: и то, и другое, а точнее вопрос поставлен не совсем корректно. Компилируемость и интерпретируемость это свойства реализации, а не самого языка. Для любого языка можно написать и компилятор, и интерпретатор.
Как это устроено в стандартной реализации:
- исходный текст компилируется в байт-код, промежуточное низкоуровневое представление;
- байт-код исполняется виртуальной машиной, то есть интерпретируется.
То есть компиляция есть, просто не в машинный код. Байт-код кэшируется в отдельных файлах, поэтому повторный импорт модуля не требует повторной компиляции. Именно поэтому в проекте появляются служебные каталоги с этими файлами.
Значит корректная формулировка звучит так: компилируется в байт-код, который интерпретируется виртуальной машиной. Похожая схема у Java, только там байт-код дополнительно компилируется в машинный код на лету.
Полезно назвать другие реализации, они хорошо показывают условность вопроса:
- PyPy использует компиляцию на лету: часто выполняемые участки превращаются в машинный код, и на вычислительных задачах он в разы быстрее;
- Cython и Nuitka транслируют код в C и компилируют в настоящий исполняемый файл;
- в стандартной реализации, начиная с версии 3.13, появился экспериментальный компилятор на лету, то есть граница размывается и там.
Практические следствия интерпретации, которые стоит упомянуть: ошибки в синтаксисе видны при компиляции модуля, а ошибки типов и имён только при выполнении соответствующей строки. Отсюда ценность статических анализаторов и тестов: они частично возвращают то, что даёт компилятор в статически типизированных языках.
Где спотыкаются
Отвечают односложно, не упоминая байт-код.
Считают, что компиляция обязательно означает машинный код.
Не знают про другие реализации языка.
Путают проверку типов на этапе выполнения с отсутствием компиляции вовсе.