- •Об авторе
- •О группе редакторов
- •Предисловие
- •Введение
- •Как использовать эту книгу
- •Загрузка исходного кода CPython
- •Что в исходном коде?
- •Настройка среды разработки
- •IDE или редактор?
- •Настройка Visual Studio
- •Настройка Visual Studio Code
- •Настройка Vim
- •Выводы
- •Компиляция CPython
- •Компиляция CPython на macOS
- •Компиляция CPython на Linux
- •Установка специализированной версии
- •Знакомство с Make
- •Make-цели CPython
- •Компиляция CPython на Windows
- •Профильная оптимизация
- •Выводы
- •Грамматика и язык Python
- •Спецификация языка Python
- •Генератор парсеров
- •Повторное генерирование грамматики
- •Выводы
- •Конфигурация и ввод
- •Конфигурация состояния
- •Структура данных конфигурации среды выполнения
- •Конфигурация сборки
- •Сборка модуля из входных данных
- •Выводы
- •Генерирование конкретного синтаксического дерева
- •Парсер/токенизатор CPython
- •Абстрактные синтаксические деревья
- •Важные термины
- •Пример: добавление оператора «почти равно»
- •Выводы
- •Компилятор
- •Исходные файлы
- •Важные термины
- •Создание экземпляра компилятора
- •Флаги будущей функциональности и флаги компилятора
- •Таблицы символических имен
- •Основная компиляция
- •Ассемблер
- •Создание объекта кода
- •Использование Instaviz для вывода объекта кода
- •Пример: реализация оператора «почти равно»
- •Выводы
- •Цикл вычисления
- •Исходные файлы
- •Важные термины
- •Построение состояния потока
- •Построение объектов кадров
- •Выполнение кадра
- •Стек значений
- •Пример: добавление элемента в список
- •Выводы
- •Управление памятью
- •Выделение памяти в C
- •Проектирование системы управления памятью Python
- •Аллокаторы памяти CPython
- •Область выделения объектной памяти и PyMem
- •Область выделения сырой памяти
- •Нестандартные области выделения памяти
- •Санитайзеры выделенной памяти
- •Арена памяти PyArena
- •Подсчет ссылок
- •Сборка мусора
- •Выводы
- •Параллелизм и конкурентность
- •Модели параллелизма и конкурентности
- •Структура процесса
- •Многопроцессорный параллелизм
- •Многопоточность
- •Асинхронное программирование
- •Генераторы
- •Сопрограммы
- •Асинхронные генераторы
- •Субинтерпретаторы
- •Выводы
- •Объекты и типы
- •Примеры этой главы
- •Встроенные типы
- •Типы объектов
- •Тип type
- •Типы bool и long
- •Тип строки Юникода
- •Словари
- •Выводы
- •Стандартная библиотека
- •Модули Python
- •Модули Python и C
- •Набор тестов
- •Запуск набора тестов в Windows
- •Запуск набора тестов в Linux или macOS
- •Флаги тестирования
- •Запуск конкретных тестов
- •Модули тестирования
- •Вспомогательные средства тестирования
- •Выводы
- •Отладка
- •Обработчик сбоев
- •Компиляция поддержки отладки
- •LLDB для macOS
- •Отладчик Visual Studio
- •Отладчик CLion
- •Выводы
- •Бенчмаркинг, профилирование и трассировка
- •Использование timeit для микробенчмарка
- •Использование набора тестов производительности Python
- •Профилирование кода Python с использованием cProfile
- •Выводы
- •Что дальше?
- •Создание расширений C для CPython
- •Улучшение приложений Python
- •Участие в проекте CPython
- •Дальнейшее обучение
- •Препроцессор C
- •Базовый синтаксис C
- •Выводы
- •Благодарности
Книги для программистов: https://t.me/booksforits
CPYTHON
PYTHON
2023
Книги для программистов: https://t.me/booksforits
ББК 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 |
Книги для программистов: https://t.me/booksforits
Оглавление
Об авторе........................................................................................................................... |
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 |
Книги для программистов: https://t.me/booksforits
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 |
Книги для программистов: https://t.me/booksforits
Оглавление |
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 |
Книги для программистов: https://t.me/booksforits
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 |
Книги для программистов: https://t.me/booksforits
Оглавление |
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 |
Книги для программистов: https://t.me/booksforits
10 Оглавление |
|
Что дальше?........................................................................................ |
331 |
Создание расширений C для CPython.................................................................. |
331 |
Улучшение приложений Python............................................................................. |
332 |
Участие в проекте CPython....................................................................................... |
333 |
Дальнейшее обучение................................................................................................. |
336 |
Приложение. Введение в C для Python-программистов................. |
338 |
Препроцессор C............................................................................................................ |
338 |
Базовый синтаксис C.................................................................................................. |
341 |
Выводы............................................................................................................................. |
348 |
Благодарности..................................................................................... |
349 |
ОТ ИЗДАТЕЛЬСТВА
Ваши замечания, предложения, вопросы отправляйте на comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
Книги для программистов: https://t.me/booksforits
Что говорят читатели о книге
«Внутри CPython»
Мне бы очень хотелось, чтобы такая книга была у меня много лет назад, когда я только изучала Python. После чтения этой книги ваша квалификация повысится, и вы сможете решать еще более сложные задачи, которые улучшат наш мир.
Кэрол Уиллинг, ключевой разработчик CPython и участница управляющего совета CPython
Глава «Параллелизм и конкурентность» — одна из моих любимых. Я уже давно старался глубже разобраться в теме, и ваша книга оказалась чрезвычайно полезной.
Конечно, после чтения этой главы я не смог устоять перед искушением прочитать остальное. С нетерпением жду свой печатный экземпляр, когда он выйдет! Ранее я прочитал вашу статью «Guide to the CPython Source Code», которая разожгла во мне желание больше узнать о внутреннем устройстве CPython.
О Python написаны десятки обучающих книг, но я еще не встречал ни одной, которая объясняла бы самым любознательным тонкости внутреннего устройства.
В настоящее время я сам обучаю языку Python свою дочь, и эта книга входит в ее список обязательного чтения. Сейчас она изучает информационные системы в Университете штата Джорджия.
Милан Пател, вице-президент (крупного инвестиционного банка)
В книге Энтони меня больше всего впечатляет то, как все шаги по внесению изменений в кодовую базу CPython объединяются в доступную и понятную процедуру. Книга воспринимается как своего рода «недостающее руководство». Разобраться в языке C, основе Python, было очень интересно, и я нашел для себя ответы на некоторые давнишние вопросы. Особенно много полезного — в главе, посвященной управлению памятью в CPython. «Внутри
Книги для программистов: https://t.me/booksforits
CPython» — превосходный (и уникальный) ресурс для всех, кто желает вывести свои знания Python на более высокий уровень.
Дэн Бейдер, автор книги «Python Tricks»1 и редактор сайта Real Python
Книга помогла мне лучше понять, как работает лексический анализ и парсинг в Python. Я рекомендую ее, если вы действительно хотите разобраться в теме.
Флориан Далиц, питонист
Исчерпывающее описание внутренних механизмов Python. Как ни странно, по этой теме почти нет хороших источников информации. Материал излагается доступно как для начинающих, так и для опытных пользователей Python.
Абхишек Шарма, специалист по Data Science
1 Бейдер Д. Чистый Python. Тонкости программирования для профи. — СПб.: Питер.
Книги для программистов: https://t.me/booksforits
ОБ АВТОРЕ
Энтони Шоу — заядлый питонист, участник Python Software Foundation.
Энтони занимался программированием с 12 лет. Любовь к Python он обрел спустя 15 лет, когда ему пришлось какое-то время просидеть в отеле в Сиэттле (штат Вашингтон). С тех пор Энтони исследует Python, пишет о нем и создает учебные курсы, забыв обо всех остальных языках, которые он прежде изучал.
Энтони также участвует в малых и больших проектах с открытым исходным кодом, включая CPython, и является участником Apache Software Foundation.
Страсть Энтони — разбираться в сложных системах, упрощать их и обучать других людей.
О ГРУППЕ РЕДАКТОРОВ
Джим Андерсон давно программирует на разных языках. Он работал над встроенными системами, разрабатывал распределенные системы сборки, занимался управлением сторонними исполнителями и участвовал во многих, многих собраниях.
Джоанна Яблонски — редактор сайта Real Python. Естественные языки интересуют ее не меньше, чем языки программирования. Ее любовь к головоломкам, поиску закономерностей и всевозможным мелочам привела к тому, что она выбрала карьеру переводчика. Прошло совсем немного времени, и она влюбилась в новый язык — Python! Джоанна присоединилась к команде Real Python в 2018 году и с тех пор помогает питонистам повышать их профессиональный уровень.
Джейкоб Шмитт уже много лет занимается редактированием академических
итехнологических образовательных материалов — как в печатном виде, так
ив интернете. После присоединения к команде Real Python в 2020 году он редактирует учебники, статьи и книги, написанные разносторонней командой талантливых писателей и разработчиков.
Книги для программистов: https://t.me/booksforits