CPython¶
CPython — это эталонная и наиболее распространённая реализация интерпретатора языка программирования Python. Написанная на языке C и Python, она транслирует исходный код Python в байт-код, который затем исполняется виртуальной машиной. CPython является основной реализацией, с которой связывают термин «Python» в большинстве контекстов, и поддерживается организацией Python Software Foundation.
¶История
Разработка CPython началась в 1989 году, когда голландский программист Гвидо ван Россум, работавший в Центре математики и информатики (CWI) в Амстердаме, приступил к созданию нового интерпретируемого языка. Вдохновением послужил язык ABC, который, по мнению ван Россума, был элегантным, но имел ограниченную расширяемость. Первая версия интерпретатора, известная как Python 0.9.0, была выпущена 20 февраля 1991 года. Она уже включала в себя основные элементы: классы с наследованием, обработку исключений, функции и модули.
Название «CPython» стало использоваться после появления альтернативных реализаций Python, таких как Jython (реализация на Java) и IronPython (реализация на .NET). Оно подчёркивает, что данная реализация написана на C и является основной. Ключевым этапом в истории CPython стал выход версии 2.0 в 2000 году, которая представила списковые включения и сборщик мусора с циклическими ссылками. Версия 3.0, выпущенная в 2008 году, была революционным обновлением, нарушившим обратную совместимость ради устранения устаревших конструкций и улучшения языка.
На протяжении всей своей истории CPython остаётся проектом с открытым исходным кодом, управляемым через процесс предложений по улучшению Python (PEP). Разработка ведётся на GitHub, а выпуски выходят по фиксированному графику: каждые 12–18 месяцев.
¶Архитектура
CPython работает по принципу виртуальной машины на основе стека. Процесс выполнения программы состоит из нескольких этапов:
¶Лексический анализ и синтаксический разбор
Исходный код на Python сначала разбивается на лексемы (токены) лексическим анализатором. Затем синтаксический анализатор строит абстрактное синтаксическое дерево (AST) в соответствии с грамматикой языка. На этом этапе проверяется синтаксическая корректность кода.
¶Компиляция в байт-код
AST преобразуется в поток инструкций — байт-код. Байт-код CPython представляет собой набор низкоуровневых команд, таких как LOAD_CONST (загрузить константу), BINARY_ADD (сложить два значения) или CALL_FUNCTION (вызвать функцию). Результат компиляции сохраняется в файлах с расширением .pyc в каталоге __pycache__ для ускорения последующих запусков.
¶Виртуальная машина
Байт-код исполняется главным циклом виртуальной машины, написанным на C. Этот цикл последовательно читает инструкции, выполняет их и переходит к следующей. Виртуальная машина CPython использует стек для хранения промежуточных результатов и локальных переменных. Каждый вызов функции создаёт новый кадр стека (frame), который содержит локальные переменные, счётчик команд и ссылку на глобальное пространство имён.
¶Управление памятью
CPython использует два основных механизма управления памятью: подсчёт ссылок и сборщик мусора для циклических ссылок. Каждый объект в CPython имеет счётчик ссылок. Когда счётчик падает до нуля, объект немедленно уничтожается. Однако подсчёт ссылок не может обработать циклические ссылки (например, когда два объекта ссылаются друг на друга). Для этого существует циклический сборщик мусора, который периодически запускается и находит такие циклы.
¶GIL (Global Interpreter Lock)
Одной из ключевых особенностей CPython является глобальная блокировка интерпретатора (GIL). GIL — это мьютекс, который защищает доступ к внутренним структурам интерпретатора от одновременного изменения несколькими потоками. Это означает, что в любой момент времени только один поток может выполнять байт-код Python.
GIL был введён для упрощения реализации CPython, так как управление памятью с подсчётом ссылок не является потокобезопасным. Без GIL потребовалась бы тонкая синхронизация на каждый объект, что привело бы к значительному снижению производительности в однопоточных сценариях. Однако GIL является серьёзным ограничением для многопоточных вычислительных задач на CPython: для задач, связанных с вводом-выводом (I/O-bound), он не является проблемой, так как потоки освобождают GIL во время ожидания, но для задач, интенсивно использующих процессор (CPU-bound), многопоточность на CPython не даёт прироста производительности.
Существуют проекты, пытающиеся устранить GIL, например, nogil (экспериментальная ветка CPython) или PyPy (альтернативная реализация Python), но на 2024 год GIL остаётся стандартной частью CPython.
¶Стандартная библиотека
CPython поставляется с обширной стандартной библиотекой, которая включает модули для работы с файлами, сетью, многопоточностью, регулярными выражениями, сериализацией данных, криптографией и многими другими задачами. Стандартная библиотека написана частично на Python, частично на C (для критичных по производительности модулей, таких как json, re или socket). Это делает CPython самодостаточным для большинства повседневных задач.
¶Производительность
CPython не является самой быстрой реализацией Python. Его производительность уступает таким реализациям, как PyPy (использующая JIT-компиляцию) или Cython (позволяющая компилировать Python-код в C). Однако CPython остаётся эталоном по совместимости и стабильности. Основные причины относительно низкой производительности CPython:
- Интерпретация байт-кода: Каждая инструкция байт-кода требует нескольких нативных инструкций процессора для её обработки.
- Динамическая типизация: Типы переменных проверяются во время выполнения, что замедляет работу.
- GIL: Ограничивает параллелизм.
Для ускорения критичных участков кода разработчики часто используют расширения на C (например, NumPy, Pandas) или модули ctypes и cffi для вызова библиотек на C.
¶Версии и жизненный цикл
CPython развивается по версиям, каждая из которых имеет свой жизненный цикл. Основные версии (например, 3.8, 3.9, 3.10) выпускаются примерно раз в год. Каждая версия получает обновления безопасности в течение 5 лет после выпуска. После этого она считается устаревшей и не поддерживается. На 2024 год актуальной стабильной веткой является Python 3.12, а Python 3.13 находится в стадии разработки. Python 2.7 был официально прекращён 1 января 2020 года.
¶Альтернативные реализации
Хотя CPython является основной реализацией, существуют и другие, каждая со своими целями:
- PyPy: Реализация на Python и RPython, использующая JIT-компиляцию. Часто быстрее CPython для длительных вычислительных задач, но имеет меньшую совместимость с расширениями на C.
- Jython: Реализация на Java, позволяющая запускать Python в среде Java Virtual Machine (JVM). Имеет доступ к библиотекам Java, но отстаёт по версиям Python.
- IronPython: Реализация для платформы .NET, аналогичная Jython.
- MicroPython: Урезанная реализация для микроконтроллеров и встраиваемых систем.
- Cython: Не является реализацией Python в чистом виде, а представляет собой суперсет Python, который компилируется в C и может быть использован для создания расширений для CPython.
¶Применение
CPython используется в самых разных областях:
- Веб-разработка: Фреймворки Django, Flask, FastAPI работают на CPython.
- Научные вычисления: NumPy, SciPy, Matplotlib, Jupyter Notebook — все они основаны на CPython.
- Автоматизация и скриптинг: CPython часто используется для написания системных скриптов, утилит и задач DevOps.
- Образование: Благодаря читаемому синтаксису CPython является популярным языком для обучения программированию.
- Искусственный интеллект и машинное обучение: TensorFlow, PyTorch, scikit-learn — все эти библиотеки имеют Python-интерфейсы, работающие на CPython.
¶Интересные факты
- Код CPython написан на C, но сам интерпретатор содержит значительную часть на Python (например, стандартная библиотека и тесты).
- Внутреннее устройство CPython документировано в проекте «Python Developer’s Guide».
- CPython поддерживает встраивание в приложения на C/C++ через API, что позволяет использовать Python как скриптовый язык в других программах.
- Исходный код CPython доступен на GitHub и лицензирован под Python Software Foundation License (PSFL), которая является совместимой с GPL.
¶Источники
- Python Software Foundation. «Python Documentation». docs.python.org
- Van Rossum, G. (1995). «Python Reference Manual». CWI Report.
- Beazley, D. (2009). «Python Essential Reference». Addison-Wesley.
- Python Developer’s Guide. «CPython Internals». devguide.python.org
- PEP 1 — PEP Purpose and Guidelines. Python Enhancement Proposals.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


