Как интерпретатор Python обрабатывает код при запуске
Что проверяют
Понимаете ли вы, что Python компилируется в байт-код, и знаете ли, откуда берутся файлы в каталоге кеша.
Как отвечать
Путь такой: исходный текст разбирается на токены, из них строится синтаксическое дерево, дерево компилируется в байт-код, а байт-код исполняет виртуальная машина.
Что стоит добавить по каждому шагу:
- компиляция происходит при импорте модуля и результат кешируется в каталоге
__pycache__с привязкой к версии интерпретатора. Поэтому первый импорт медленнее, а повторные запуски быстрее. Главный файл, запущенный напрямую, не кешируется; - байт-код можно посмотреть: модуль
disпоказывает инструкции, и это полезно, чтобы понять, во что превращается конструкция; - виртуальная машина стековая: инструкции работают со стеком значений, и в CPython цикл интерпретации это большой обработчик кодов операций;
- имена разрешаются во время выполнения, поэтому опечатка в имени функции внутри редкой ветки кода вылезет только при её выполнении, а не при импорте. Синтаксические ошибки, наоборот, ловятся на этапе компиляции модуля;
- глобальная блокировка интерпретатора позволяет одновременно исполнять байт-код только одному потоку, отсюда ограничения многопоточности для вычислений.
Полезно упомянуть направление развития: в новых версиях появился адаптивный интерпретатор со специализацией инструкций, экспериментальный JIT и режим без глобальной блокировки. Это показывает, что вы следите за языком.
Где спотыкаются
Называют Python чисто интерпретируемым и не знают про этап компиляции в байт-код.
Считают, что __pycache__ можно и нужно коммитить.
Ждут, что интерпретатор найдёт опечатки во всём файле при запуске: он проверяет синтаксис, но не существование имён.