, Внутреннее устройство CPython

Внутреннее устройство CPython

Энтони Шоу

 

Обновлена: 25 января 2021

Логотипы “Python” and the Python являются торговой маркой или зарегистрированной торговой маркой Python Software Foundation, применяемой Real Python с разрешения этого фонда.

Благодарим вас за выгрузку этой электронной книги. Эта электронная книга лицензирована исключительно для вашего персонального обладания. Эта книга не может быть перепродана или выдаваться прочим людям. Если вы желаете совместно пользоваться этой книгой с прочими персонами, будьте добры приобрести дополнительную копию для каждого получателя. Если вы читаете эту книгу, но не покупали её, либо она не была приобретена исключительно для вашего пользования, будьте так любезны вернутся в realpython.com/cpython-internals и приобрести свою собственную копию. Благодарим Вас за уважение к тяжёлой работе над этой книгой.

ISBN 9781775093343 (на бумажной основе)

ISBN 9781775093350 (электронная)

realpython.com

2021-05-03

 Состав исполнителей

Автор
Энтони Шоу
Разработка обложки
Алдрен Сантос
Дополнительное редактирование и правка корректуры
Джейкоб Шмидт
Технолог
Джаоти Чауан

Что говорят читатели об этой книге

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

- Кэрол Виллинг, разработчик ядра CPython и участник CPython Steering Council.

Глава "Параллелизм и одновременность" одна из моих самых любимых. Я искал глубокого проникновения в эту тему и нашёл Вашу книгу чрезвычайно полезной.

Естественно, после прочтения этой главы я не смог устоять и перед остальными Я жду- не дождусь, когда у меня появится моя собственная отпечатанная копия!

Я уже знакомился с Вашей статьёй `Руководство по исходному коду CPython`, которая побудила меня узнать больше о его внутреннем устройстве.

Существует большое число книг по Python, в которых обучают этому языку, но я не встречал ничего, что могло бы дать пояснение любознательным о его внутреннем устройстве.

И поскольку я в настоящее время я преподаю Python своей дочери, я добавил эту книгу в её список обязательного чтения. В настоящее время она изучает информационные системы в Государственном университете Джорджии.

- Милан Пэйтел, вице- президент (одного из ведущих инвестиционных банков)

Что меня больше всего впечатлило в книге Энтони, так это то, как в ней упорядочены в простой последовательности все этапы по внесению изменений в базовый код CPython. Это действительно похоже на `утраченное руководство`.

Погружение в основы C языка Python оказалось большим развлечением и это сняло у меня некоторое стародавние вопросы. Особенно поучительной я нашёл главу о распределении памяти CPythob.

Эта книга отличный (и уникальный) ресурс для всех, кто хочет поднять свои знания Python до более глубокого уровня.

- Дэн Бэйдер, автор Python Tricks и главный редактор Real Python.

Эта книга помогла мне лучше разобраться с тем, как именно работает лекисческий и синтаксический разбор в Python. Я рекомендую её в качестве источника, если и вам хочется понимать это.

- Флориан Далитц, приверженец Python

Исчерпывающее пошаговое руководство по внутреннему устройству Python, той теме, которая, на удивление, не имеет хороших ресурсов, причём в простой для понимания манере, как для новичков, так и для искушённых пользователей Python.

- Абнишек Шарма, специалист в области данных

 Об авторе

Энтони Шоу является заядлым последователем Python и участник Python Software Foundation.

Энтони занимается программированием с 12 лет и возлюбил Python, оказавшись в ловушке в отеле в Сиэтле, штат Вашингтон, 15 лет спустя. Отказавшись от прочих языков программирования, которые он изучал, Энтони с тех пор занимается исследованиями, написанием и созданием курсов по Python.

Энтони также участвует в малых и крупных проекта Открытого исходного кода, в том числе CPython, а также участник Apache Software Foundation.

Страсть Энтони состоит в разбирательстве со сложными системами с последующим их упрощением и обучению им людей.

 Рецензенты

Джим Андерсон давно занимается программированием на разных языках. Он работал над встраиваемыми системами, создавал системы рапределённой сборки, управлял внешними поставщиками и участвовал во многих мероприятиях.

Джоанна Джаблонски является исполнительным редактором Real Python. Ей нравятся естественные языки в той же степени, что и языки программирования. Её любовь к головоломкам, узорам и мелким неприятным подробностям привела её к карьере переводчика. Это стало лишь вопросом времени, чтобы она полюбила новый язык Python! Она присоединилась к Real Python в 2018 году и с тех пор помогает последователям Python наращивать свой уровень.

 realpython.com

 Предисловие

 Вступление

"Созданный сообществом язык программирования благоприятствует счастью его пользователей по всему миру."

- Гвидо ван Россум "Речь в честь Дня короля"

Я люблю создавать инструменты, которые помогают нам учиться, дают возможность творить и побуждают делиться знаниями и идеями с прочими. Когда я слышу как эти инструменты и Python помогают вам решать реальные задачи, такие как изменение климата или болезнь Альцгеймера, я испытываю смирение, благодарность и гордость.

Благодаря своей четырёхлетней любви к программированию и решению задач, я потратил время на обучение, написание большого количества кода и обмен собственными идеями с другими. По мере того, как мир перешёл от мейнфреймов к услугам сотовой связи, к огромным чудесам Интернета и облачным вычислениям, я наблюдал глубокие изменения в технологиях. Все эти технологии, включая Python, обладают одной общей чертой.

В какой- то момент эти успешные нововведения были не более чем некой идеей. Создателям, как и Гвидо, пришлось идти на риск и решительные шаги для продвижения вперёд. Приверженность, обучение методом проб и ошибок, а также совместная работа через множество неудач, заложили прочную основу для успеха и роста.

Эта книга отправит вас в путешествие изучения чрезвычайно успешного языка программирования Python. Книга служит руководством тому, как работает CPython внутри себя. Это даст вам представление о том как основные разработчики создавали этот язык.

Сильные стороны Python включают в себя его удобочитаемость и гостеприимное сообщество, посвящающее себя образованию. Энтони использует эти сильные стороны при объяснении CPython, побуждая вас читать исходный код и разделять с вами строительные блоки самого языка.

Почему я хочу поделиться с вами этой книгой Энтони? Это именно та книга, существование которой я бы желал много лет назад, когда я начинал своё путешествие по Python. Что ещё более важно, я полагаю, что у нас, как членов сообщества, имеется уникальная возможность применения своего опыта для решения сложных проблем реального мира, с которыми мы сталкиваемся.

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

Я надеюсь, что Энтони побудит вас побольше узнать о Python, вдохновит вас на создание инновационных вещей и придаст вам уверенности поделиться своими творениями со всем миром.

"Сейчас лучше чем никогда"

- Тим Питерс, "Дзен Python"

Давайте последуем этой мудрости Тома и приступим прямо сейчас.

Сердечно с вами,

- Кэрол Виллинг, основной разработчик CPython и участник CPython Steering Council

 Введение

Существуют ли определённые фрагменты Python, которые выглядят просто как волшебство, например, такие как поиск элемента намного быстрее выполняется по словарям, чем обход циклом по списку? Как генератор запоминает состояние переменных всякий раз, когда возвращает некое значение? Почему вам не требуется выделять память как в прочих языках программирования?

Ответ заключается в том, что CPython, наиболее популярная среда времени выполнения Python, написана на читаемым человеком коде C и Python.

CPython абстрагируется от сложности базовой платформы C и вашей операционной системы. Это делает многопоточность простой и переносимой между платформами. Он избавляет от головной боли управления памятью в C и упрощает её.

CPython снабжает пишущего код Python разработчика платформой для написания масштабируемых и высокопроизводительных приложений. На определённом этапе вашего становления в качестве разработчика Python вам потребуется разобраться с тем как работает CPython. Эти абстракции не являются безупречными и они текучи.

После того как вы разберётесь с тем, как работает CPython, вы сможете полностью воспользоваться его мощностью и оптимизировать свои приложения. Эта книга поясняет основные концепции, идеи и технические стороны CPython.

В этой книги вы рассмотрите основные концепции стоящие за внутренним устройством CPython и изучите как:

  • Читать исходный код и путешествовать по нему

  • Компилировать CPython из исходного кода

  • Вносить изменение в синтаксис Python и компилировать его в вашу версию CPython

  • Управлять внутренней работой таких функций как списки, словари и генераторы, а также разобраться с ними.

  • Станьте хозяином возможностей управления памятью CPython

  • Масштабируйте свой код Python при помощи параллельности и одновременности

  • Изменяйте центральные типы новыми функциональными возможностями

  • Исполняйте комплекты тестирования

  • Профилируйте и выполняйте эталонное тестирование производительности своего кода Python и времени выполнения

  • Отлаживайте код C и Python как профессионал

  • Изменяйте и обновляйте компоненты библиотеки CPython для их внесения в последующие версии

Не спешите с каждой из глав и опробуйте демонстрации и интерактивные элементы. Вы ощутите достижение, когда разберётесь с основными концепциями, которые превратят вас в лучшего программиста Python.

 Как пользоваться этой книгой

Эта книга посвящена обучению на практических примерах, поэтому не забудьте настроить свою IDE на ранней стадии, прочитав инструкции, загрузив код и написав примеры.

Для достижения наилучших результатов мы рекомендуем чтобы вы избегали копирования и вставки примеров кода. Все примеры в этой книге предпринимают множество итераций чтобы стать верными и они также могут содержать ошибки.

Внесение ошибок и изучение их исправления являются частью нашего процесса обучения. Вы можете найти более действенные способы реализации этих примеров, попробовать их изменить и посмотреть какой эффект это даёт.

При достаточной практике вы овладеете этим материалом и в процессе получите удовольствие!

Насколько искушён в Python я должен быть чтобы воспользоваться этой книгой?

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

Должен ли я владеть C чтобы пользоваться этой книгой?

Вам нет нужды быть профессионалом в C чтобы применять эту книгу. Если вы новичок для C, просмотрите Дополнение A. Введение в C для программистов Python для быстрого входа в кус дел.

Сколько времени потребуется на освоение этой книги?

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

Не устареет ли содержимое этой книги слишком быстро?

Python существует на протяжении более чем тридцати лет. К некторым частям кода CPython не прикасались с момента их первоначального написания. Многие из принципов в данной книге оставались прежними на протяжении десяти и более лет.

В действительности, при написании этой книги мы исследовали многие строки кода, которые были написаны Гвидо ван Россумом (автором Python) и остаются неприкасаемыми начиная с 1 версии.

Некоторые концепции этой книги совершенно новые. А часть из них даже экспериментальные. При написании этой книги мы преодолевали проблемы в имеющемся исходном коде и ошибки в CPython, которые позднее были исправлены или улучшены. Именно в этом и состоит чудо CPython как процветающего проекта с открытым исходным кодом.

Те навыки, которые вы получите из данной книги, помогут вам читать и понимать текущую и последующие версии CPython. Изменения постоянны, а экспертиза это нечто, что вы можете развивать по ходу дела.

 Премиальные материалы и учебные ресурсы

Данная книга поставляется с некоторым числом бесплатных премиальных ресурсов, к которым вы можете получить доступ через realpython.com/cpython-internals/resources/. На этой веб- странице вы также можете обнаружить перечень исправлений с коррекциями, сопровождаемыми командой Real Python.

Образцы кода

Примеры и образцы настроек на протяжении этой книги будут помечаться заголовком, обозначающих их как часть папки cpython-book-samples :


cpython-book-samples/01/example.py

import this
 	   

Вы можете выгрузить образцы кода с realpython.com/cpythoninternals/resources/.

Лицензии кода

Все примеры сценариев Python, относящихся к данной книге лицензированы в соответствии с Creative Commons Public Domain (CC0) License. Это означает, что приветствуется использование всех частей данного кода для любых целей в ваших собственных программах.

CPython лицензируется в соответствии с Python Software Foundation 2.0 license. Фрагменты и образцы исходного кода CPython, используемые в этой книге подпадают под терминологию этой лицензии PSF 2.0.

[Замечание]Замечание

Весь код из этой книги был протестирован при помощи Python 3.9 в Windows 10, macOS 10.15 и Linux.

Соглашения о формате

Блоки кода применяются для представления образцов кода:


# This is Python code:
print("Hello, World!")
 	   

Не зависящие от операционной системы команды соответствуют формату в стиле Unix:


$ # This is a terminal command:
$ python hello-world.py
		

(Символ $ не является частью команды).

Специфичные для Windows команды имеют формат командной строки Windows:


> python hello-world.py
		

(Символ > не является частью команды).

Синтаксис командной строки следует такому формату:

  • Текст без скобок должен набираться так, как он отображён.

  • <Текст внутри угловых скобок> указывает на некую переменную, для который вам надлежит подставить некое значение. Например, вы можете заменить <filename> соответствующим названием для определённого файла.

  • [Текст внутри квадратных скобок] указывает необязательный аргумент, который вы можете предоставить.

Жирный текст обозначает новый или важный термин.

Замечания и предостережения появляются в следующем виде:

[Замечание]Замечание

Это примечание, занятое текстом-заполнителем. Быстрая коричневая лиса прыгает через ленивую собаку. (Съешь [же] ещё этих мягких французских булок да выпей чаю.) Быстрый коричневый питон скользит по ленивому кабану.

[Предостережение]Предостережение

Это предостережение, также занятое текстом-заполнителем. Быстрая коричневая лиса прыгает через ленивую собаку. (Съешь [же] ещё этих мягких французских булок да выпей чаю.) Быстрый коричневый питон скользит по ленивому кабану.

Любые ссылки на некий файл внутри исходного кода CPython будут показаны так:


path/to/file.py
		

Закладки или команды меню будут предоставляться в последовательности, выгдядящей следующим образом:


Ctrl + Space
		

Клавиатурные команды и Быстрые клавиши и для формата macOS, и для Windows будут выдаваться так:


File > Other > Option 
		

Обратная связь и ошибки

Мы приветствуем идеи, предложения, обратные отклики и случающиеся разглагольствования. Вы нашли некую тему путанной? Вы обнаружили ошибку в тексте или коде? Мы не придали внимания теме, о которой вы бы желали знать больше?

Мы всегда стремимся улучшать свои учебные материалы. Какой бы ни была причина, отправьте свой отзыв по следующей ссылке: realpython.com/cpython-internals/feedback

О команде Real Python

В Real Python вас обучат навыкам программирования реальных задач силами сообщества профессиональных Последователей Python (Питонистов) по всему миру.

Наш вебсайт realpython.com, был запущен в 2012 году и в настоящее время помогает более чем трём миллионам разработчиков Python каждый месяц книгами, руководствами по программированию и прочими ресурсами глубокого обучения.

Вот как вы можете найти Real Python на просторах Веб:

 Содержание

Предисловие
Вступление
Введение
Как пользоваться этой книгой
Премиальные материалы и учебные ресурсы
Глава 1. Начинаем работать с исходным кодом CPython
Что у нас в исходном коде?
Глава 2. Настройка вашей среды разработки
IDE или редактор?
Монтаж Visual Studio
Монтаж кода Visual Studio
Установка
Рекомендуемые для этой книги расширения
Применение Расширенной навигации и расширения кода
Настройка задачи и запуск файлов
Монтаж JetBrains CLion
Монтаж Vim
Выводы
Глава 3. Компиляция CPython
Компиляция CPython в macOS
Компиляция CPython в Linux
Установка персональной версии
Краткое руководство по Make
Цели Make CPython
Цели сборки
Цели тестирования
Цели очистки
Цели установки
Различные цели
Компиляция CPython в Windows
Установка необходимых зависимостей
Компиляция из вашей командной строки
Компиляция из Visual Studio
Проводимая профилем оптимизация
Выводы
Глава 4. Язык и грамматика Python
Почему CPython написан на C, а не на Python
Спецификация языка Python
Документация языка
Пример
Файл грамматики
Пример: оператор while
Генератор синтаксического разбора
Повторная генерация грамматики
Лексемы
Выводы
Глава 5. Конфигурация и входные данные
Состояние конфигурации
Предварительная инициализация конфигурации
Относящиеся к делу исходные файлы
Структура данных конфигурации времени исполнения
Монтаж конфигурации времени исполнения при помощи командной строки
Просмотр флагов времени исполнения
Сборка конфигурации
Сборка модуля из входных данных
Относящиеся к делу файлы исходного кода
Считывание файлов/ входных данных
Ввод строки из приглашения на ввод команд
Просмотр флагов времени исполнения
Ввод данных из файла сценария или стандартного ввода
Просмотр флагов времени исполнения
Выводы
Глава 6. Лексический и синтаксический разбор при помощи синтаксических деревьев
Выработка реального синтаксического дерева
CPython Parser-Tokenizer
Относящиеся к делу файлы
Ввод данных в синтаксический анализатор из файла
Поток синтаксического анализатора и механизма разбора лексем
Абстрактные синтаксические деревья
Относящиеся к делу файлы
Применение Instaviz для представления деревьев абстрактного синтаксиса
Компиляция деревьев абстрактного синтаксиса
Важные термины для запоминания
Пример: Добавление оператора сравнения почти-равенства
Выводы
Глава 7. Собственно компилятор
Относящиеся к делу исходные файлы
Важные термины
Создание экземпляра компилятора
Флаги фьючерсов и флаги компилятора
Флаги фьючерсов
Справка по флагам фьючерсов для 3.9
Флаги компилятора
Символьные таблицы
Относящиеся к делу исходные файлы
Структура данных символьной таблицы
Применение стандартного библиотечного модуля symtable
Реализация символьной таблицы
Ядро процесса компиляции
Доступ к компилятору из Python
API компилятора C
Инструкции
Тип инструкции
Инструкции безусловного перехода
Блоки базового кадра
Операции и аргументы
Сборка
Структура данных ассемблера
Алгоритм ассемблера поиска в глубину
API C ассемблера
Поиск в глубину
Создание объекта кода
Применение Instaviz для отображения объекта кода
Пример: Реализация оператора почти-равенства
Выводы
Глава 8. Цикл расчёта
Относящиеся к делу исходные файлы
Важные термины
Построение состояния потока
Тип состояния потока
Относящиеся к делу исходные файлы
Построение объектов кадров
Тип объекта кадра
Относящиеся к делу исходные файлы
API инициализации объекта кадра
Преобразование параметров ключевых слов в словарь
Преобразование позиционных аргументов в переменные
Упаковка позиционных аргументов в *args
Загрузка аргументов ключевых слов
Добавление пропущенных позиционных аргументов
Добавление пропущенных аргументов ключевых слов
Свёртывание замыканий
Создание генераторов, сопрограмм и асинхронных генераторов
Исполнение кадра
Отслеживание выполнения кадра
Стек значений
Пример операции байтового кода: BINARY_OR
Имитация стека значений
Действия стека
Пример: Добавление элемента в список
Выводы
Глава 9. Управление памятью
Выделение памяти в C
Статическое выделение памяти в C
Автоматическое выделение памяти в C
Динамическое выделение памяти в C
Проектирование системы управления памятью Python
Выделение областей
Распределители памяти
Распределитель памяти CPython
Относящиеся к делу исходные файлы
Важные термины
Блоки, пулы и арены
Арены
Пулы
Таблицы пулов
Блоки
API выделения блоков
Применение API отладки Python
Области распределителя памяти объекта и PyMem
Применение модуля tracemalloc
Область распределителя сырой памяти
Персональные распределители доменов
Персональные уборщики выделенной памяти
AddressSanitizer
MemorySanitizer
UndeрnedBehaviorSanitizer
Арена памяти PyArena
Относящиеся к делу файлы
Подсчёт ссылок
Создание переменных в Python
Инкрементальные ссылки
Понижаемые ссылки
Подсчёт ссылок в операциях байтового кода
Преимущества подсчёта ссылок CPython
Сборка мусора
Относящиеся к делу исходные файлы
Проектирование сборки мусора
Включённые в сборщик мусора типы контейнеров
Не отслеживаемые объекты и изменяемость
Алгоритм сборки мусора
Выводы
Глава 10. Параллельность и одновременность
Модели параллельности и одновременности
Структура процесса
Многопроцессный параллелизм
Ветвление процесса в POSIX
Многопроцессность в Windows
Пакет multiprocessing
Относящиеся к делу файлы
Порождение и ветвление процессов
Создание дочернего процесса
Конвейеризация данных дочернему процессу
Исполнение дочернего процесса
Обмен данными при помощи очередей и конвейеров
Очереди
Конвейеры
Семафоры
Разделяемые состояния между процессами
Пример приложения
Аннотация мультипроцессности
Многопоточность
GIL
Относящиеся к делу исходные файлы
Старт потоков в Python
Состояние потока
Потоки POSIX
Потоки Windows
Аннотация многопоточности
Асинхронное программирование
Генераторы
Структура генератора
Относящиеся к делу исходные файлы
Создание генераторов
Выполнение генераторов
Сопрограммы
Относящиеся к делу исходные файлы
Циклы событий
Пример
Асинхронные генераторы
Подчинённые интерпретаторы
Относящиеся к делу исходные файлы
Пример
Выводы
Глава 11. Объекты и типы
Примеры в этой главе
Встроенные типы
Объекты и типы переменных объектов
Тип type
Слоты типов
Работа с типами в C
Словари свойств типов
Типы bool и long
Тип long
Пример
Тип строки Unicode
Относящиеся к делу исходные файлы
Обработка позиций кода Unicode
Сопоставление UTF-8 и UTF-16
Совместимость с ASCII
Тип широкого символа
Маркеры порядка байт
Пакет encodings
Модуль Codecs
Реализации Codec
Внутренние Codecs
Пример
Тип словаря
Хэширование
Относящиеся к делу исходные файлы
Структура словаря
Нахождение
Выводы
Глава 12. Стандартная библиотека
Модули Python
Python и модули C
Глава 13. Комплект тестов
Выполнение комплекта тестов в Windows
Выполнение комплекта тестов в Linux или macOS
Флаги теста
Исполнение особых тестов
Модули тестирования
Утилиты тестирования
Выводы
Глава 14. Отладка
Применение обработчика крушений
Компиляция поддержки отладки
Windows
macOS или Linux
Применение LLDB для macOS
Создание точек прерывания
Запуск CPython
Подключение к исполняемому интерпретатору CPython
Обработка точки прерывания
Применение расширения cpython_lldb
Применение GDB
Создание точек прерывания
Запуск CPython
Подключение к исполняемому интерпретатору CPython
Обработка точки прерывания
Применение расширения python-gdb
Применение отладчика Visual Studio
Создание точек прерывания
Запуск отладчика
Обработка точки прерывания
Применение отладчика CLion
Отладка приложения Make
Подключение отладчика
Создание точек прерывания
Выводы
Глава 15. Эталонное тестирование, профилирование и трассировка
Использование timeit для микро- эталонного тестирования
Пример timeit
Применение Комплекта эталонного тестирования Python для эталонного тестирования времени выполнения
Исполнение эталонного тестирования
Сопоставление эталонного тестирования
Профилирование кода Python при помощи cProfile
Экспорт профилей
Профилирование кода C при помощи DTrace
Относящиеся к делу исходные файлы
Установка DTrace
Компиляция поддержки DTrace
Применение DTrace из Clion
Пример DTrace
Выводы
Глава 16. Последующие шаги
Написание расширений C для CPython
Улучшение ваших приложений Python
Вклад в проект CPython
Сортировка проблем
Возбуждение пула запроса на исправление проблемы
Прочий вклад
Продолжайте обучаться
Еженедельные советы для разработчиков Real Python
Библиотека видеокурсов Python
Дополнение A. Введение в C для программистов Python
Препроцессор C
#include
#define
#undef
#if
#pragma
#error
Базовый синтаксис C
В целом
Предложения if
Предложения switch
Циклы
Функции
Указатели
Строки
Структуры
Выводы