#python #python-3.x #interpreter
Вопрос:
Я просто пытаюсь понять компиляторы и интерпретаторы с python. Я еще не до конца понимаю это, поэтому могу неправильно использовать некоторые термины.
Мое понимание прямо сейчас:
- CPython является как компилятором (для байт-кода) для python, так и виртуальной машиной, где этот байт-код интерпретируется и запускается как машинный код
- поэтому, когда вы запускаете файл .py, CPython компилирует ваш код в байт-код.
- этот байт-код затем преобразуется в машинный код в виртуальной машине python (которая также является cpython?)
Комментарии:
1. Байтовый код может быть преобразован в машинный код. Это то, что делает компилятор just-in-time (JIT). CPython строго интерпретирует каждый байтовый код; вот почему это виртуальная машина, а не компилятор.
2. Нет, CPython компилирует исходный код Python в байтовый код, а затем интерпретирует байтовый код. CPython ничего не переводит в машинный код.
3. @skushu Тот факт, что компиляция байт-кода происходит во время выполнения, имеет мало значения по сравнению с другими факторами. Python кэширует байт-код модулей (то есть, если вы запускаете одно и то же приложение несколько раз без изменения исходного кода, последующие запуски будут только перекомпилировать основной файл), и есть способы предварительной компиляции всех файлов. Но все это влияет только на время запуска, которое обычно не оказывает существенного влияния на общее время выполнения кода.
4. Тот факт, что CPython является чистым интерпретатором, действительно имеет существенное значение. Альтернативные реализации Python, в которых предусмотрена JIT-компиляция, существуют и во многих случаях достигают заметных улучшений производительности (хотя и не до такой степени, чтобы производительность стала сопоставимой с C). Обратите внимание, что JIT-компиляция все еще происходит во время выполнения, так что это больше похоже на сравнение компиляции и интерпретации, чем на сравнение времени выполнения и времени компиляции. Я не верю, что опережающий компилятор для Python даст лучшие результаты, чем JIT-компилятор. На самом деле, они, вероятно, были бы еще хуже.
5. Причиной этого являются языковые особенности Python, которые плохо поддаются заблаговременной компиляции или эффективной реализации в целом. К ним относятся динамическая типизация и метапрограммирование, а также, как правило, динамическая природа Python. Когда дело доходит до языковых функций, которые сложно эффективно реализовать (хотя и не обязательно сложно скомпилировать), это также включает такие вещи, как целочисленный тип по умолчанию с произвольной точностью и, конечно, сбор мусора.