В Н У Т Р И C P Y T H ON ГИД ПО ИНТЕРПРЕТАТОРУ PYTHON Энтони Шоу 2023 ББК 32.973.2-018.1 УДК 004.43 Ш81 Шоу Энтони Ш81 Внутри CPYTHON: гид по интерпретатору Python. — СПб.: Питер, 2023. — 352 с.: ил. — (Серия «Библиотека программиста»). ISBN 978-5-4461-1925-7 CPython, самая популярная реализация Python, абстрагируется от сложностей ОС и предо- ставляет платформу для создания масштабируемых и высокопроизводительных приложений. Каждому python-разработчику на какой-то стадии необходимо будет узнать, как работает CPython. Это позволит в полной мере использовать его мощь и оптимизировать приложения. Вы разберетесь с основными концепциями внутреннего устройства CPython и научитесь: читать исходный код интерпретатора CPython и свободно ориентироваться в нем; вносить изменения в синтаксис Python и компилировать их в вашу собственную версию CPython; понимать вну- треннюю реализацию таких структур, как списки, словари и генераторы; управлять памятью CPython; масштабировать код Python за счет параллелизма и конкурентного выполнения; до- полнять базовые типы новой функциональностью; выполнять наборы тестов; профилировать и проводить бенчмарк Python-кода и исполнительной среды; отлаживать код C и Python на про- фессиональном уровне; изменять или обновлять компоненты библиотеки CPython, чтобы они могли использоваться в будущих версиях. 16+ (В соответствии с Федеральным законом от 29 декабря 2010 г. № 436-ФЗ.) ББК 32.973.2-018.1 УДК 004.43 Права на издание получены по соглашению с DevAcademy Media Inc. Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав. Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги. Издательство не несет ответственности за доступ- ность материалов, ссылки на которые вы можете найти в этой книге. На момент подготовки книги к изданию все ссылки на интернет-ресурсы были действующими. ISBN 978-1775093343 англ. © Real Python (realpython.com) ISBN 978-5-4461-1925-7 © Перевод на русский язык ООО «Прогресс книга», 2022 © Издание на русском языке, оформление ООО «Прогресс книга», 2022 © Серия «Библиотека программиста», 2022 Оглавление Об авторе ..........................................................................................................................13 О группе редакторов .....................................................................................................13 Предисловие ........................................................................................14 Введение ...............................................................................................16 Как использовать эту книгу .......................................................................................17 Дополнительные материалы и учебные ресурсы ...............................................18 Загрузка исходного кода CPython .......................................................21 Что в исходном коде? ...................................................................................................22 Настройка среды разработки .............................................................24 IDE или редактор? ........................................................................................................24 Настройка Visual Studio ..............................................................................................25 Настройка Visual Studio Code ...................................................................................28 Настройка Vim ................................................................................................................36 Выводы ..............................................................................................................................40 Компиляция CPython ...........................................................................41 Компиляция CPython на macOS ..............................................................................42 Компиляция CPython на Linux ................................................................................44 6 Оглавление Установка специализированной версии ................................................................46 Знакомство с Make ........................................................................................................46 Make-цели CPython ......................................................................................................48 Компиляция CPython на Windows ..........................................................................51 Профильная оптимизация ..........................................................................................56 Выводы ..............................................................................................................................58 Грамматика и язык Python ...................................................................59 Почему CPython написан на C, а не на Python ...................................................60 Спецификация языка Python ....................................................................................62 Генератор парсеров ........................................................................................................66 Повторное генерирование грамматики ..................................................................67 Выводы ..............................................................................................................................71 Конфигурация и ввод ..........................................................................73 Конфигурация состояния ...........................................................................................75 Структура данных конфигурации среды выполнения .....................................77 Конфигурация сборки ..................................................................................................79 Сборка модуля из входных данных .........................................................................80 Выводы ..............................................................................................................................85 Лексический анализ и парсинг с использованием синтаксических деревьев ....................................................................87 Генерирование конкретного синтаксического дерева .......................................88 Парсер/токенизатор CPython ...................................................................................91 Абстрактные синтаксические деревья ....................................................................96 Важные термины ..........................................................................................................104 Пример: добавление оператора «почти равно» .................................................104 Выводы ............................................................................................................................109 Оглавление 7 Компилятор ........................................................................................110 Исходные файлы ..........................................................................................................111 Важные термины ..........................................................................................................111 Создание экземпляра компилятора ......................................................................112 Флаги будущей функциональности и флаги компилятора ..........................114 Таблицы символических имен ................................................................................116 Основная компиляция ...............................................................................................121 Ассемблер .......................................................................................................................128 Создание объекта кода ...............................................................................................131 Использование Instaviz для вывода объекта кода ............................................133 Пример: реализация оператора «почти равно» .................................................134 Выводы ............................................................................................................................139 Цикл вычисления ...............................................................................140 Исходные файлы ..........................................................................................................141 Важные термины ..........................................................................................................141 Построение состояния потока .................................................................................142 Построение объектов кадров ...................................................................................143 Выполнение кадра .......................................................................................................150 Стек значений ...............................................................................................................153 Пример: добавление элемента в список ...............................................................157 Выводы ............................................................................................................................161 Управление памятью .........................................................................163 Выделение памяти в C ...............................................................................................163 Проектирование системы управления памятью Python ................................167 Аллокаторы памяти CPython ..................................................................................169 Область выделения объектной памяти и PyMem ............................................178 8 Оглавление Область выделения сырой памяти ........................................................................181 Нестандартные области выделения памяти .......................................................181 Санитайзеры выделенной памяти .........................................................................183 Арена памяти PyArena ...............................................................................................185 Подсчет ссылок .............................................................................................................186 Сборка мусора ...............................................................................................................192 Выводы ............................................................................................................................201 Параллелизм и конкурентность .......................................................203 Модели параллелизма и конкурентности ...........................................................205 Структура процесса ....................................................................................................205 Многопроцессорный параллелизм ........................................................................208 Многопоточность .........................................................................................................230 Асинхронное программирование ...........................................................................242 Генераторы ......................................................................................................................243 Сопрограммы ................................................................................................................249 Асинхронные генераторы .........................................................................................254 Субинтерпретаторы ....................................................................................................255 Выводы ............................................................................................................................259 Объекты и типы ..................................................................................260 Примеры этой главы ...................................................................................................261 Встроенные типы .........................................................................................................262 Типы объектов ..............................................................................................................263 Тип type ...........................................................................................................................264 Типы bool и long ...........................................................................................................268 Тип строки Юникода ..................................................................................................272 Словари ...........................................................................................................................282 Выводы ............................................................................................................................287 Оглавление 9 Стандартная библиотека ...................................................................288 Модули Python .............................................................................................................288 Модули Python и C .....................................................................................................290 Набор тестов .......................................................................................293 Запуск набора тестов в Windows ............................................................................293 Запуск набора тестов в Linux или macOS ...........................................................294 Флаги тестирования ...................................................................................................295 Запуск конкретных тестов ........................................................................................295 Модули тестирования ................................................................................................296 Вспомогательные средства тестирования ...........................................................297 Выводы ............................................................................................................................298 Отладка ...............................................................................................299 Обработчик сбоев ........................................................................................................299 Компиляция поддержки отладки ...........................................................................300 LLDB для macOS .........................................................................................................301 GDB ..................................................................................................................................305 Отладчик Visual Studio ..............................................................................................307 Отладчик CLion ............................................................................................................309 Выводы ............................................................................................................................314 Бенчмаркинг, профилирование и трассировка ..............................315 Использование timeit для микробенчмарка .......................................................316 Использование набора тестов производительности Python ........................318 Профилирование кода Python с использованием cProfile ............................322 Профилирование кода C в DTrace .........................................................................325 Выводы ............................................................................................................................330 10 Оглавление Что дальше? ........................................................................................331 Создание расширений C для CPython .................................................................331 Улучшение приложений Python .............................................................................332 Участие в проекте CPython ......................................................................................333 Дальнейшее обучение .................................................................................................336 Приложение. Введение в C для Python-программистов ................338 Препроцессор C ............................................................................................................338 Базовый синтаксис C ..................................................................................................341 Выводы ............................................................................................................................348 Благодарности ....................................................................................349 ОТ ИЗДАТЕЛЬСТВА Ваши замечания, предложения, вопросы отправляйте на [email protected] ( издательство «Питер», компьютерная редакция). Мы будем рады узнать ваше мнение! На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.