Интерпретатор Python
Что такое интерпретатор Python, какие варианты реализации интерпретатора существуют: CPython, PyPy, Jython, IronPython и гибридный язык Cython.
Что такое интерпретатор
Python — это язык программирования. Но также это и программный пакет, называемый интерпретатором.
Интерпретатор — это программа, которая выполняет другие программы.
Программа, написанная на языке Python — это просто текстовый файл, содержащий выражения языка Python. Интерпретатор Python читает эту программу и выполняет содержащиеся в ней инструкции. Следовательно, чтобы на компьютере можно было запускать программы, написанные на языке Python, нужно установить на этот компьютер интерпретатор Python.
После установки пакета Python на компьютер создается несколько компонентов: как минимум, интерпретатор и библиотека поддержки. В зависимости от способа использования, интерпретатор Python может представлять собой исполняемую программу или набор библиотек, связанных с другой программой. В зависимости от используемой версии Python, сам интерпретатор может быть реализован как программа на языке C, набор классов Java или что-то ещё.
Узнать версию установленного интерпретатора:
python --version
# или
python -V
По общепринятой практике, файлы программ на Python имеют имена, заканчивающиеся на .py. Технически, такая схема именования требуется только для файлов, которые импортируются, но большинство файлов Python имеют имена, оканчивающиеся на .py для единообразия.
Пример: простейшая программа, хранимая в файле script.py:
print("Hello world")
print(10 * 10)
Чтобы запустить эту программу, необходимо сказать интерпретатору Python выполнить ее:
python script.py
# Hello world
# 100
Когда интерпретатор получает команду выполнить скрипт, он совершает несколько шагов, прежде чем код фактически начнёт обрабатываться. В частности, сначала он компилируется в так называемый байт-код, а затем передаётся на так называемую виртуальную машину. Приведенная ниже схема соответствует стандартной реализации интерпретатора CPython. Существуют и другие, и о них коротко будет сказано далее.
Компиляция в байт-код
Сначала Python компилирует исходный код в формат, известный как байт-код.
Байт-код (byte code) — это низкоуровневое, платформенно-независимое представление исходного кода.
Грубо говоря, Python преобразует каждый из исходных операторов в группу инструкций байт-кода, разбивая их на отдельные шаги. Если Python-процесс имеет права на запись, он будет сохранять байт-код в файлах с расширением .pyc (.py compiled). Данные файлы будут сохраняться в подкаталоге __pycache__, расположенном в директории с исходными файлами. В именах .pyc-файлов указывается версия интерпретатора Python, создавшая их (например, script.cpython-314.pyc).
Если Python не может записать файлы байт-кода, программа всё равно будет работать — байт-код генерируется в памяти и просто удаляется при завершении программы. Однако, поскольку .pyc-файлы ускоряют запуск программ, стоит убедиться, что у интерпретатора достаточно прав для их создания, особенно для крупных программ. При следующем запуске программы Python загрузит .pyc-файлы и пропустит этап компиляции, если исходный код не был изменен с момента последнего сохранения байт-кода и используется та же версия Python, которая создала байт-код.
В зависимости от способа создания .pyc его актуальность проверяется либо по метаданным исходного файла, либо по хешу его содержимого. Также учитывается формат байт-кода, зависящий от реализации и версии интерпретатора.
Файлы байт-кода также являются одним из способов распространения программ — Python без проблем запустит программу, если найдет только .pyc-файлы, даже если оригинальные .py-файлы отсутствуют. Однако такой способ распространения программ достаточно хрупок, так как сильно зависит от реализации и версии интерпретатора.
Важное замечание: байт-код сохраняется только для импортированных файлов, а не для файлов верхнего уровня программы, запускаемых только как скрипты (это оптимизация импорта). Более того, байт-код никогда не сохраняется для кода, вводимого в интерактивном режиме.
Виртуальная машина Python (PVM)
После того как программа будет скомпилирована в байт-код (или байт-код будет загружен из существующих файлов .pyc), она отправляется на выполнение в виртуальную машину Python (The Python Virtual Machine — PVM). PVM — это не отдельная программа, и её не нужно устанавливать отдельно. PVM — это среда выполнения Python; она всегда присутствует как часть системы Python и является исполняющим механизмом. По сути, PVM — это просто большой цикл кода, который поочередно перебирает инструкции байт-кода для выполнения их операций. Технически, это всего лишь последний шаг того, что называется «интерпретатором Python».
Разновидности модели выполнения
Описанная выше схема является стандартной, но далеко не единственной реализацией интерпретатора Python. На момент написания статьи существовало несколько реализаций языка Python:
- CPython — стандартная реализация;
- Jython — Python для Java;
- IronPython — Python для .NET;
- PyPy — реализация Python для обеспечения высокой скорости выполнения;
Каждая из этих реализаций представляет собой отдельно устанавливаемую программную систему.
Помимо этих реализаций интерпретатора существует ещё:
- Cython — смесь Python/C;
CPython
Эталонная и стандартная реализация языка Python. Она написана на переносимом языке ANSI C. Именно эта версия используется в большинстве проектов на Python, и она же доступна для скачивания с сайта https://www.python.org/. Альтернативные реализации могут отставать по поддерживаемой версии языка и иметь ограничения совместимости, однако представляют собственные преимущества для определенных сценариев.
Исходный код является открытым и доступен на GitHub.
Jython
Система Jython — это альтернативная реализация языка Python, предназначенная для интеграции с языком программирования Java. Jython состоит из классов Java, которые компилируют исходный код Python в байт-код Java, а затем передают полученный байт-код виртуальной машине Java (JVM). Программисты по-прежнему пишут операторы Python в текстовых файлах .py, как обычно.
Цель Jython — позволить коду Python создавать скрипты для Java-приложений, подобно тому как CPython позволяет Python создавать скрипты для компонентов C и C++. Поскольку код Python транслируется в байт-код Java, во время выполнения он выглядит и ощущается как настоящая программа Java.
IronPython
IronPython разработан для интеграции программ на Python с приложениями, разработанными для работы с Microsoft .NET Framework для Windows, а также Mono для Linux (эквивалент с открытым исходным кодом).
По своей реализации IronPython очень похож на Jython — он заменяет байт-код Java и JVM эквивалентами для выполнения в среде .NET.
Ранее разработанный компанией Microsoft, теперь это проект с открытым исходным кодом.
PyPy
PyPy — это реализация Python, ориентированная на скорость выполнения. Она предлагает реализацию Python с JIT-компилятором (just-in-time).
JIT-компилятор выявляет часто повторяющиеся пути программы и транслирует их в машинный код. JIT-компилятор делает это в ходе выполнения программы и способен создавать машинный код, специализированный для конкретных типов, путем отслеживания типов данных объектов, которые программа обрабатывает.
Cython
Cython — это гибридный язык, объединяющий Python-код с объявлениями типов языка C. Код Cython может компилироваться в код C, который затем можно скомпилировать в машинный код.