Как работает Python - интерпретатор, байт-код, PVM
Как работает Python - интерпретатор, байт-код, PVM

Как работает Python - интерпретатор, байт-код, PVM

Python - интерпретируемый язык программирования. Он не конвертирует свой код в машинный, который понимает железо (в отличие от С и С++). Вместо этого, Python-интерпретатор переводит код программы в байт-код, который запускается на виртуальной машине Python (PVM). Давайте рассмотрим подробнее, как это работает на примере самой популярной реализации интерпретатора – CPython.

Интерпретатор – это программа, которая конвертирует ваши инструкции, написанные на Python, в байт-код и выполняет их. По сути интерпретатор – это программный слой между вашим исходным кодом и железом.

Существует 2 типа интерпретаторов:

  • Простой интерпретатор. Он берет одну инструкцию, транслирует и сразу выполняет ее, а затем берет следующую инструкцию.
  • Интерпретатор компилирующего типа. Это система из компилятора и интерпретатора. Компилятор переводит исходный код программы в промежуточное представление (байт-код), а интерпретатор (виртуальная машина) выполняет этот байт-код.

CPython:

  • Интерпретатор компилирующего типа (благодаря этому достигается большее быстродействие выполнения программ).
  • Считается эталонной реализацией языка Python.
  • Написан на C.
  • Исходный код CPython находится в открытом доступе.
  • Его разработка ведётся группой разработчиков под руководством Гвидо ван Россума – создателя Python.

Кроме этого, у интерпретатора СPython есть особенность – он может работать в режиме диалога (REPL - read-eval-print loop). Интерпретатор считывает законченную конструкцию языка, выполняет её, печатает результаты и переходит к ожиданию ввода пользователем следующей конструкции.

Как CPython выполняет программы

Интерпретатор "Питона" выполняет любую программу поэтапно.

Поэтапное выполнение Python программы Интерпретатором
Поэтапное выполнение Python программы Интерпретатором
Поэтапное выполнение Python программы Интерпретатором

Этап #1. Инициализация

После запуска вашей программы, Python-интерпретатор читает код, проверяет форматирование и синтаксис. При обнаружении ошибки он незамедлительно останавливается и показывает сообщение об ошибке.

Помимо этого, происходит ряд подготовительных процессов:

  • анализ аргументов командной строки;
  • установка флагов программы;
  • чтение переменных среды и т.д.

Этап #2. Компиляция

Интерпретатор транслирует (переводит) исходные инструкции вашей программы в байт-код (низкоуровневое, платформонезависимое представление исходного текста). Такая трансляция необходима в первую очередь для повышения скорости – байт-код выполняется в разы быстрее, чем исходные инструкции.

Этапы генерации байт-кода из исходного кода на Python
Этапы генерации байт-кода из исходного кода на Python
Этапы генерации байт-кода из исходного кода на Python

Если Python-интерпретатор обладает правом записи, он будет сохранять байт-код в виде файла с расширением .pyc. Если исходный текст программы не изменился с момента последней компиляции, при следующем запуске вашей программы, Python сразу загрузит файл .pyc, минуя этап компиляции (тем самым ускорит процесс запуска программы).

Этап #3. Выполнения

Как только байт-код скомпилирован, он отправляется на виртуальную машину Python (PVM). Здесь выполняется байт-код на PVM. Если во время этого выполнения возникает ошибка, то выполнение останавливается с сообщением об ошибке.

PVM является частью Python-интерпретатора. По сути это просто большой цикл, который выполняет перебор инструкций в байт-коде и выполняет соответствующие им операции.

Альтернативы СPython

CPython является стандартной реализацией, но существуют и другие реализации, созданные для специфических целей и задач.

Jython

Основная цель данный реализации – тесная интеграция с языком Java. Работает следующим образом:

  1. Java-классы выполняют компиляцию программного кода на языке Python в байт-код Java
  2. Полученный байт-код запускается на виртуальной машине Java (JVM)

Jython позволить Python-программам управлять Java-приложениями. Во время выполнения такая программа ведет себя точно так же, как настоящая программа на языке Java.

IronPython

Предназначена для обеспечения интеграции Python-программ с C# приложениями на Microsoft .NET Framework или Mono. Принцип работы такой же, как и у Jython.

PyPy

PyPy - это интерпретатор Python, написанный на Python (если быть точнее, то на RPython).

Особенностью PyPy является использование трассирующего JIT-компилятора (just-in-time), который на лету транслирует некоторые элементы в машинный код. Благодаря этому, при выполнении некоторых операций PyPy обгоняет CPython в несколько раз. Но плата за такую производительность – более высокое потребление памяти.

😭
😕
😃
😍