- •Об авторе
- •О группе редакторов
- •Предисловие
- •Введение
- •Как использовать эту книгу
- •Загрузка исходного кода 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
- •Выводы
- •Благодарности
Что дальше?
В этой главе рассматриваются три возможных варианта применения информации, изложенной в книге:
1.Написание модулей расширения на C или C++.
2.Улучшение ваших приложений Python.
3.Участие в проекте CPython.
Начнем с написания модулей расширения на C или C++.
СОЗДАНИЕ РАСШИРЕНИЙ C ДЛЯ CPYTHON
Функциональность Python можно расширять несколькими способами. Один из них — написание модулей Python на C или C++. Этот процесс может привести к улучшению производительности и упрощению доступа к библиотечным функциям C и системным функциям.
Если вы хотите написать модуль расширения C, вот вещи, к которым вам стоит вернуться:
zz Настройка компилятора C и компиляция модулей C в главе «Компиляция CPython».
zz Настройка среды разработки для C в главе «Настройка среды разработки».
zz Увеличение и уменьшение счетчика ссылок сгенерированных объектов в разделе «Подсчет ссылок» главы «Управление памятью».
zz Описание PyObject* и его интерфейсов в разделе «Типы объектов» главы «Объекты и типы».
Книги для программистов: https://t.me/booksforits
332 Что дальше?
zz Описание слотов типов и обращения к API типов Python из C в разделе «Слоты типов» главы «Объекты и типы».
zz Добавление точек останова в исходные файлы C для модулей расширения и их отладка в главе «Отладка».
СМ. ТАКЖЕ
Если у вас еще нет опыта написания модулей расширения C,обратитесь кстатье«Building a C Extension Module1»на сайте Real Python.Вней дается конкретный пример построения, компиляции и тестирования модуля расширения.
УЛУЧШЕНИЕ ПРИЛОЖЕНИЙ PYTHON
В книге мы рассмотрели несколько важных тем, которые помогут в улучшении ваших приложений:
zz Использование механизмов параллелизма и конкурентности для сокращения времени выполнения приложений в главе «Параллелизм и конкурентность».
zz Настройка алгоритма сборки мусора для повышения эффективности работы с памятью в приложениях в разделе «Сборка мусора» главы «Управление памятью».
zz Использование отладчиков для расширений C и обработки ошибок
в главе «Отладка».
zz Применение профайлеров для исследования времени выполнения вашего кода в разделе «Профилирование кода Python с использованием cProfile» главы «Бенчмарк, профилирование и трассировка».
zz Анализ выполнения кадров для изучения и отладки сложных проблем
в разделе «Трассировка выполнения кадров» главы «Цикл вычисления».
1 https://realpython.com/build-python-c-extension-module.
Книги для программистов: https://t.me/booksforits
Участие в проекте CPython 333
УЧАСТИЕ В ПРОЕКТЕ CPYTHON
За двенадцать месяцев вышло 12 дополнительных версий CPython, были сделаны сотни преобразований и отчетов об ошибках, а также тысячи коммитов в исходном коде.
CPython — один из самых крупных, динамичных и открытых программных проектов в мире. Знания, полученные в этой книге, помогут вам ориентироваться в нем и принимать участие в его совершенствовании.
Сообщество CPython охотно принимает новых участников. Но прежде чем предлагать какие-то улучшения или исправления, необходимо знать, с чего начать. Например:
1. Устранить ошибки, о которых сообщают разработчики на сайте bugs. python.org.
2. Исправить небольшие, хорошо описанные проблемы.
Рассмотрим каждый из этих вариантов более подробно.
Устранение ошибок
Все отчеты об ошибках и запросы на внесение изменений сначала отправляются на сайт bugs.python.org, также известный как BPO. Этот веб-сайт является баг-трекером проекта CPython. Если вы захотите отправить pull request на GitHub, то вам сначала понадобится номер BPO — код проблемы, созданный BPO.
Для начала зарегистрируйтесь в качестве пользователя; для этого выберите команду User Register в меню слева.
Вид по умолчанию не особенно удобен. В нем отображаются как ошибки, выявленные пользователями, так и ошибки, обнаруженные ключевыми разработчиками, у которых обычно уже имеется решение.
Чтобы избежать этого, после входа в систему выберите команду Your Queries Edit в меню слева. На странице выведется список запросов индексов ошибок, которые вы можете добавить в закладки:
Книги для программистов: https://t.me/booksforits
334 Что дальше?
Замените значение на leave in, чтобы добавить эти запросы в меню Your Queries.
Вот несколько запросов, которые я считаю полезными:
zz Easy Documentation Issues: улучшения документации, которые еще не сделаны.
zz Easy Tasks: задачи, которые были определены как подходящие для начинающих.
zz Recently Created: недавно созданные ошибки.
zz Reports Without Replies: сообщения об ошибках, которые остались без ответа.
zz Unread: непрочитанные сообщения об ошибках.
zz 50 Latest Issues: 50 проблем, которые были недавно обновлены.
Далее вы можете следовать руководству «Triaging an Issue»1, в котором описана последняя версия процесса публикации комментариев об ошибках.
Отправка pull request с решением проблемы
Определившись с проблемой, можно переходить к созданию исправления
иотправке его в проект CPython. При этом используется следующая схема:
1.Убедитесь в том, что у вас имеется номер BPO.
2.Создайте ветвь в вашем форке CPython. За описанием процесса загрузки исходного кода обращайтесь к главе «Загрузка исходного кода CPython».
1 https://devguide.python.org/triaging/.
Книги для программистов: https://t.me/booksforits
Участие в проекте CPython 335
3.Создайте тест для воспроизведения проблемы. Последовательность действий описана в разделе «Модули тестирования» главы «Набор тестов».
4.Внесите изменение, следуя принципам руководств по стилю PEP 7 и PEP 8.
5.Выполните набор регрессионных тестов и убедитесь в том, что все тесты проходят успешно. Регрессионные тесты будут автоматически выполняться на GitHub при отправке pull request, но лучше сначала проверить локально. За описанием процедуры обращайтесь к главе «Набор тестов».
6.Сохраните коммит и отправьте свои изменения на GitHub.
7.Перейдите по адресу github.com/python/cpython и создайте pull request для своей ветви.
Позже запрос будет проанализирован одной из команд отладчиков и закреплен за каким-то ключевым разработчиком (или командой) для рецензирования.
Как упоминалось ранее, проекту CPython требуется больше участников. Между отправкой изменения и его рецензированием может пройти час, неделя или несколько месяцев. Не огорчайтесь, если не получите немедленной реакции. Многие ключевые разработчики работают на добровольной основе, и часто рецензирование или объединение pull-запросов происходит партиями.
ВАЖНО
Важно, чтобы один запрос решал только одну проблему. Если в ходе написания исправления вы обнаружите еще одну проблему, отметьте ее и отправьте во втором запросе.
Чтобы интеграция ваших изменений происходила быстрее, желательно включить хорошее объяснение проблемы, сути и способа решения.
Другие варианты поддержки
Кроме исправления ошибок, существуют и другие виды улучшений, которые можно внести в проект CPython:
Книги для программистов: https://t.me/booksforits