Глава 3. Компиляция CPython

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

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

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

Эти инструменты применяются в зависимости от используемой вами операционной системы, а потому перепрыгните сразу в раздел для своей операционной системы.

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

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

При компиляции CPython или изменении его исходного кода или стандартной библиотеки, это всегда происходит в рамках песочницы его каталога исходного кода.

Если вы желаете установить некую индивидуальную версию, этот этап обсуждается в данной главе.

Компиляция CPython в macOS

Компиляция CPython в macOS требует некоторые дополнительные приложения и библиотеки. Прежде всего, вам требуется существенный набор инструментов компилятора C. Вы можете обновить в macOS через App Store прикладное приложение Command Line Tools. Вам требуется выполнить его начальную установку в соответствующем терминале.

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

Для открытия терминала в macOS пройдите в Applications > Other > Terminal/ Вы захотите сохранить это приложение в своём Dock, Ctrl + Click его иконку и выберите Keep in Dock.

При помощи терминала установите компилятор C и набор инструментов выполнив следующее:


$ xcode-select --install
		

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

Вам также потребуется рабочая копия OpenSSL для применения при извлечении пакетов с вебсайта PyPI. Если вы планируете применять эту сборку для установки дополнительных пакетов, тогда потребуется удостоверение SSL.

Наиболее простой способ установки OpenSSL в macOS состоит в использовании Homebrew.

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

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


$ /usr/bin/ruby -e "$(curl -fsSL \
  https://raw.githubusercontent.com/Homebrew/install/master/install)"
		

После того как у вас имеется установленным Homebrew, вы можете установить необходимые зависимости для CPython при помощи команды brew install:


$ brew install openssl xz zlib gdbm sqlite
		

Теперь, когда у вас имеются необходимые зависимости, вы можете выполнить сценарий configure

Команда Homebrew brew --prefix <package> снабдит вас каталогом, в котором установлен <package>. Компилируя то местоположение, которое применяет Homebrew, вы включаете поддержку SSL.

Установка флага --with-pydebug включает специальные точки входа отладки. Если вы намерены выполнять отладку для целей разработки или тестирования, добавьте этот флаг. Отладка CPython рассматривается в Главе 14. Отладка.

Этап настройки необходимо выполнить только один раз, причём определив местоположение zlib:


$ CPPFLAGS="-I$(brew --prefix zlib)/include" \
  LDFLAGS="-L$(brew --prefix zlib)/lib" \
  ./configure --with-openssl=$(brew --prefix openssl) \
  --with-pydebug
		

Запуск ./configure выработает некий makefile в корне данного репозитория. Вы можете применять его для автоматизации своего процесса сборки.

Теперь вы можете собрать свой исполняемый файл CPython, выполнив такую команду:


$ make -j2 -s
		
[Совет]Смотри также

За дополнительными сведениями относительно вариантов для make обратитесь к разделу Краткое руководство по Make.

В процессе сборки вы можете получать некоторые ошибки. В итоге своей сборки make уведомит вас что собраны не все пакеты. Например, пакеты ossaudiodev, spwd и _tkinter завершились неудачей при сборке при данном наборе инструкций. Это допустимо если вы не планируете разработку таких пакетов. Если же вы всё- таки планируете такое, обратитесь к Python Developer’s Guide за дополнительными сведениями.

Нашей сборке потребуется несколько минут и она выработает исполняемый файл с названием python.exe. Всякий раз, когда вы вносите изменения в свой исходный код, вам потребуется повторно запускать make с теми же самыми флагами.

Ваш исполняемый файл python.exe это исполняемый файл CPython для отладки. Чтобы увидеть работающим REPL, запустите python.exe:


$ ./python.exe
Python 3.9 (tags/v3.9:9cf67522, Oct 5 2020, 10:00:00)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
		
[Замечание]Замечание

Да, всё верно. ваша сборка macOS имеет расширение файла .exe. Это расширение вовсе не потому что это исполняемый файл Windows!.

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

Если вы позднее запустите make install или make altinstall, тогда файл будет переименован в python до того как он установится в вашей системе.

Компиляция CPython в Linux

Для компиляции CPython в Linux вам вначале требуется выгрузить и установить make, gcc, configure и pkgconfig.

Для Fedora Core, RHEL, CentOS или прочих основанных на YUM {Прим. пер.: DNF} систем воспользуйтесь такой командой:


$ sudo yum install yum-utils
или
$ sudo dnf -y install dnf-utils
		

Для Debian, Ubuntu или прочих основанных на APT системах воспользуйтесь такой командой:


$ sudo apt install build-essential
		

Затем установите некоторые дополнительные требующиеся пакеты.

Для Fedora Core, RHEL, CentOS или прочих систем на основе YUM {DNF} воспользуйтесь следующей командой:


$ sudo yum-builddep python3
или
$ sudo dnfbuilddep python3
		

Для Debian, Ubuntu или прочих, основанных на APT система= применяйте такую команду:


$ sudo apt install libssl-dev zlib1g-dev libncurses5-dev \
  libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev \
  libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev libffi-dev
		

Теперь, когда вы получили зависимости, вы можете выполнить сценарий configure, причём с необязательным включением особых точек входа отладки --with-pydebug:


$ ./configure --with-pydebug
		

Далее, исполнив выработанный makefile, вы можете собрать исполняемый файл CPython:


$ make -j2 -s
		
[Совет]Смотри также

За дополнительными сведениями относительно вариантов для make обратитесь к разделу Краткое руководство по Make.

Проверьте полученный вывод чтобы убедиться что не возникло проблем компиляции с модулем _ssl. Если таковые возникли, проверьте свой дистрибутив относительно инструкций по установке необходимых заголовков для OpenSSL.

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

Сама сборка займёт несколько минут и сгенерирует исполняемый файл с названием python. Это исполняемый файл CPython, предназначенный для отладки. Чтобы увидеть рабочий REPL, выполните ./python:


$ ./python
Python 3.9 (tags/v3.9:9cf67522, Oct 5 2020, 10:00:00)
[Clang 10.0.1 (clang-1001.0.46.4)] on Linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
		

Установка персональной версии

Если вы остались довольны своими изменениями и хотите применять их внутри своей системы, тогда вы можете установить исполняемый файл Python из своего репозитория исходного кода в качестве некой индивидуальной версии.

Для macOS и Linux воспользуйтесь командой altinstall, которая не буде устанавливать символическую ссылку для python3 и установит обособленную версию:


$ make altinstall
		

Для Windows вам придётся изменить конфигурацию из Debug to Release,затем скопировать эти упакованные исполняемые файлы в некий каталог в вашем компьютере, который является частью его системного пути.

Краткое руководство по Make

В качестве разработчика Python вы могли раньше не встречаться с make. Или же у вас и был такой опыт, но вы не тратили на него слишком много времени.

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

Было бы нереальным ожидать от конкретного разработчика, что он знает местоположение всех этих библиотек и скопирует со вставкой их в свою командную строку. Поэтому в проектах C/C++ для автоматизации сценария создания и сборки обычно используются make и configure.

Когда вы выполняете ./configure, autoconf выполняет поиск необходимых CPython библиотек и копирует их пути в некий makefile.

Выработка makefile аналогична некоторому сценарию оболочки и разбивается на разделы, именуемые targets (целями).

Неким примером выступает цель docclean. Эта цель удаляет некоторые файлы документации применяя команду rm:


docclean:
    -rm -rf Doc/build
    -rm -rf Doc/tools/sphinx Doc/tools/pygments Doc/tools/docutils
 	   

Для выполнения этй цели, исполните make docclean. docclean это всего лишь цель, которая выполняет лишь две команды.

Вот соглашение для выполнения цели make:


$ make [options] [target]
		

Если вы вызовите make без определения некой цели, тогда make выполнит установленную первой предписанную в соответствующем makefile цель. Для Cpython это цель all, которая выполняет сборку всех частей CPython.

make обладает большим числом параметров. Вот некоторые, которые вы найдёте полезными на протяжении данной книги:

Таблица 3-1. Некоторые параметры make
Параметр Применеие

-d, --debug[=FLAGS]

Перекрываемые makefile -ами переменные среды

-e, --environment-overrides

Не позволяет никакого доступа, но возвращает ошибку

-i, --ignore-errors

Игнорировать ошибки из команд

-j [N], --jobs[=N]

Разрешить N заданий за раз или неограниченное число заданий в противном случае

--k, --keep-going

Продолжать выполнение, когда некоторые цели не могут быть выполнены

-l [N], --load-average[=N], --max-load[=N]

Запускать множество заданий только когда load < N

-n, --dry-run

Выводить команды на печать вместо их выполнения

-s, --silent

Не выводить команды эхом

-S, --stop

Останавливаться когда цели не могут быть сделаны

В своём следующем разделе и на протяжении этой книги вы будете выполнять make с такими параметрами:


$ make -j2 -s [target]
		

Установленный флаг -о2 позволяет make выполнять одновременно два задания. Если у вас имеется четыре и более ядре, тогда вы можете изменить его на четыре или более и компиляция завершится быстрее. {Прим. пер.: предлагаем некое эмпирическое правило по настройке данного значения в нашем переводе Программирование ядра Linux Кайваня Н Биллимории, изданной Packt Publishing в марте 2021.}

Установка флага -s прекращает вывод на печать в консоль всех команд из makefile при их выполнении. Если вы желаете увидеть что произойдёт, можете удалить этот флаг -s.

Цели Make CPython

И для Linux, и для macOS вы обнаружите, что вам требуется очищать файлы, сборки или освежать имеющуюся конфигурацию. Приводимые далее разделы содержат таблицы, структурирующих некоторое число полезных целей make, собираемых в makefile CPython.

  Цели сборки

Следом идцт цели, применяемые для сборки исполняемого файла CPython:

Таблица 3-2. Цели сборки исполняемого файла CPython
Цель Назначение

all (по умолчанию)

Собирает компилятор, библиотеки и модули

clinic

Запускает параметр Clinic во всех исходных файлах

profile-opt

Компилирует исполняемый файл Python с руководимой профилем оптимизацией

regen-all

Повторно вырабатывает все генерируемые файлы

sharedmods

Собирает совместно используемые модули

  Цели тестирования

Приводимые ниже цели используются для тестирования компилируемого вами исполняемого файла:

Таблица 3-3. Цели тестирования исполняемого файла CPython
Цель Назначение

coverage

Скомпилировать и запустить тестирование при помощи gcov

coverage-lcov

Создать HTML отчёты зоны действия

quicktest

Запускает более быстрый набор регрессионного тестирования, исключая те тесты, которые требуют большего времени

test

Запускает базовое регрессионное тестирование

testall

Запускает имеющийся комплект тестов дважды, один раз без файлов .pyc и один раз с ними

testuniversal

Запускает имеющийся комплект тестов для обеих архитектур в универсальной сборке для OS X

  Цели очистки

Первичными целями очистки выступают clean, clobber и distclean. Цель clean служит общему удалению скомпилированных и кэшированных библиотек и файлов .pyc.

Если вы обнаружите, что clean не справляется со своим заданием, тогда испытайте clobber. Цель clobber удалит ваш makefile, поэтому вам придётся снова выполнить ./configure.

Для полной очистки всей среды вплоть до дистрибутива выполните цель distclean.

Последующий список включает перечисленные нами только что первичные цели, а также некоторые дополнительные цели очистки:

Таблица 3-4. Цели очистки каталога исходного кода
Цель Назначение

check-clean-src

При сборке из исходного кода проверяет что он чистый

clean

Удаляет файлы .pyc, скомпилированные библиотеки и профили

cleantest

Удаляет каталоги test_python_* ранее отказавших заданий тестирования

clobber

То же что и clean, но также удаляет библиотеки, теги, конфигурации и сборки

distclean

То же что и clobber, но помимо этого также удаляет всё выработанное из исходного кода, например makefile

docclean

Удаляет в Doc/ собранную документацию

profile-removal

Удаляет все профили оптимизации

pycremoval

Удаляет файлы .pyc

  Цели установки

Существуют две разновидности целей установки: установленная по умолчанию версия, такая как install и версия alt, такая как altinstall. Если вы желаете установить скомпилированную вами версию в своём компьютере, но не желаете чтобы она стала установкой Python 3 версии по умолчанию, пользуйтесь alt версией соответствующих команд:

Таблица 3-5. Цели установки исполняемого файла CPython
Цель Назначение

altbininstall

Устанавливает собранный интерпретатор python с дополненным номером версии, например, python3.9

altinstall

Устанавливает совместные библиотеки, исполняемые файлы и документацию с соответствующим суффиксом версии

altmaninstall

Устанавливает пронумерованные версией руководства

bininstall

Устанавливает все исполняемые файлы, такие как python, idle и 2to3

commoninstall

Устанавливает совместные библиотеки и модули

install

Устанавливает совместные библиотеки, исполняемые файлы и документацию (исполнит commoninstall, bininstall и maninstall)

libinstall

Установит совместные библиотеки

maninstall

Установит все руководства

sharedinstall

Динамически загружает модули

После того как вы выполните установку при помощи make install, с вашей скомпилированной библиотекой будет связана соответствующая команда python3. Однако, если вы воспользовались make altinstall, будет установлен лишь python$(VERSION), а существующая привязка к python3 останется нетронутой.

  Различные цели

Ниже приводятся некоторые дополнительные цели make, которые вы можете найти полезными:

Таблица 3-6. Различные дополнительные цели
Цель Назначение

autoconf

Автоматически повторно вырабатывает configure и pyconfig.h.in

python-config

Вырабатывает сценарий python-config

recheck

Повторно исполняет configure с теми же самыми параметрами, которые применялись в последний раз

smelly

Проверяет что экспортируемые файлы начинаются с Py или _Py (см. PEP 7)

tags

Создаёт файл тегов для vi

TAGS

Создаёт файл тегов для Emacs

Компиляция CPython в Windows

В Windows имеются два способа компиляции исполняемых файлов и библиотек CPython:

  1. Компиляция из вашей командной строки. Она всё ещё требует наличия компилятора Microsoft Visual C++, который поставляется совместно с Visual Studio.

  2. В Visual Studio откройте PCbuild/pcbuild.sln и непосредственно выполняйте сборку.

В приводимых далее разделах мы опишем оба этих варианта.

  Установка необходимых зависимостей

Для обоих решений, и сценария компиляции из вашей командной строки, и для Visual Studio, вам потребуется установить различные внешние инструменты, библиотеки и заголовки C.

Внутри папки PCbuild имеется файл .bat, который автоматизирует это процесс для вас. Откройте окно своей командной строки внутри PCbuild и выполните PCbuild/get_externals.bat:


> get_externals.bat
Using py -3.7 (found 3.7 with py.exe)
Fetching external libraries...
Fetching bzip2-1.0.6...
Fetching sqlite-3.28.0.0...
Fetching xz-5.2.2...
Fetching zlib-1.2.11...
Fetching external binaries...
Fetching openssl-bin-1.1.1d...
Fetching tcltk-8.6.9.0...
Finished.
		

Теперь вы можете выполнять компиляцию либо из приглашения командной строки, либо из Visual Studio.

  Компиляция из вашей командной строки

Для компиляции из приглашения командной строки вам требуется выбрать архитектуру того ЦПУ, под который вы желаете выполнять компиляцию. Установленной по умолчанию является win32, но имеется шанс, что вы пожелаете исполняемый 64- битный файл (amd64).

Если вы выполняете некую отладку, тогда отладочная сборка будет поставляться с возможностью подключения к вашему исходному коду точек прерывания. Для включения отладочной сборки вы добавляете -c Debug , предписывая необходимость сборочной конфигурации.

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


> build.bat -p x64 -c Debug
		

Эта команда произведёт исполняемый файл Python PCbuild/amd64/python_d.exe. Запустит это исполняемый файл непосредственно из приглашения командной строки:


> amd64\python_d.exe

Python 3.9 (tags/v3.9:9cf67522, Oct 5 2020, 10:00:00)
 [MSC v.1922 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
		

Теперь вы пребываете внутри REPL своего откомпилированного исполняемого файла CPython.

Для компиляции выпуска исполняемого кода воспользуйтесь этой командой:


> build.bat -p x64 -c Release
		

Данная команда создаст исполняемый файл PCbuild/amd64/python.exe.

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

Значение суффикса _d определяет, что CPython был собран в отладочной конфигурации.

Соответствующие выпуски исполняемых файлов Python.org компилируются в конфигурации, руководимой профилем (PGO). Относительно дополнительных сведений по PGO обртитесь к разделу Проводимая профилем оптимизация в самом конце этой главы.

 

Параметры

В build.bat доступны следующие аргументы:

Таблица 3-7. Различные дополнительные цели
Флаг Назначение Ожидаемое значение

-p

Архитектура ЦПУ платформы сборки

x64, Win32 (значение по умолчанию), ARM, ARM64

-c

Конфигурация сборки

Release (значение по умолчанию), Debug, PGInstrument или PGUpdate

-t

Цель сборки

Build (значение по умолчанию), Rebuild, Clean, CleanAll

 

Флаги

Вот некоторые необязательные флаги, которые вы можете применять для build.bat:

Таблица 3-8. Различные дополнительные цели
Флаг Назначение

-v

Verbose mode (Подробный режим): в процессе сборки отображает информационные сообщения

-vv

Very Verbose mode (Очень подробный режим): в процессе сборки отображает подробные информационные сообщения

-q

Quiet mode (Тихий режим): в процессе сборки отображает только предупреждения и сообщения об ошибках

-e

Выгружает и устанавливает внешние зависимости (значение по умолчанию)

-E

Не выгружает и не устанавливает внешние зависимости (значение по умолчанию)

--pgo

Собирает проводимую профилем оптимизацию

--regen

Повторно вырабатывает всю грамматику и все лексемы (применяется при обновлении самого языка)

Для выдачи полного списка выполните build.bat -h.

  Компиляция из Visual Studio

Внутри папки PCbuild находится файл решения Visual Studio, PCbuild/pcbuild.sln, предназначенный для сборки и исследования исходного кода CPython.

Когда это файл загружен, он попросит у вас повторно ввести цель проекта внутри данного решения для той версии компилятора C/C++, что была установлена вами. Visual Studio также установит цель на установленный вами выпуск Windows SDK.

Убедитесь что установленная версия Windows SDK является самой новой установленной версией и что набор инструментов вашей платформы самый последний. Если вы пропустили это окно, вы можете потом кликнуть правой кнопкой по своему файлу решения в окне Solutions and Projects и выбрать Retarget Solution.

Переместитесь в Build > Configuration Manager и проверьте что ваш ниспадающий перечень Active Solution Configuration установлен в Debug, а Active Solution Platform настроена на x64 для 64- битной архитектуры ЦПУ или на win32 для 32- битной.

Затем, нажав Ctrl + Shift + B или выбрав Build > Build Solution выполните сборку CPython. Если вы столкнётесь с ошибкой об отсутствии Windows SDK, убедитесь что вы правильно настроили целевые установки в своём окне Retarget Solution . Вы долны также видеть папку Windows Kits в своём меню Пуска с Windows Software Development Kit внутри неё.

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

Для запуска отладочной версии CPython нажмите F5 и CPython запустит ваш REPL в режиме отладки:

 

Рисунок 3-1



Вы можете запускать свой собранный выпуск изменив конфигурацию сборки с Debug на Release в верхней полосе меню и посторно запустив Build > Build Solution. Теперь у вас внутри PCbuild/amd64/ имеются обе версии исполняемого файла CPython, и отладочная, и сборка выпуска.

Вы можете настроить Visual Studio способным открывать REPL либо со сборкой выпуска, либо с отладочной, выбрав Tools > Python > Python Environments в своём меню сверху. в Панели Python Environments кликните Add Environment и далее укажите целью исполняемый файл отладки или выпуска. Отладочный исполняемый файл будет завершаться на _d.exe, например, python_d.exe или pythonw_d.exe.

Скорее всего вы пожелаете применять отладочный исполняемый файл, так как он поставляется с поддержкой отладки в Visual Studio и будет полезен по мере чтения вами этой книги.

В окне Add Environment укажите целью файл python_d.exe, так как это интерпретатор внутри PCbuild/amd64, а pythonw_d.exe в качестве оконного интерпретатора:

 

Рисунок 3-2



Запустите сеанс REPL, кликнув по Open Interactive Window в окне Python Environments и вы обнаружите REPL для своей скомпилированной версии Python:

 

Рисунок 3-3



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

Чтобы проще перемещаться по вашему коду, в представлении Solution кликните по кнопке next за иконкой Home чтобы переключиться на представление Folder:

 

Рисунок 3-4



Проводимая профилем оптимизация

Все процессы сборки macOS, Linux и Windows обладают флагами для PGO (proрle-guided optimization, проводимой профилем оптимизации). PGO не является чем- то, создаваемым командой Python, а просто некой функциональной возможностью большого числа компиляторов, включая и те, что применяются для CPython.

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

Для CPython этап профилирования запускается python -m test --pgo, что выполняет регрессивное тестирование, определяемое в Lib/test/libregrtest/pgo.py. Эти тесты выбраны намеренно, так как они применяют широко используемые модули и типы C.

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

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

Если же вы желаете распространять некую индивидуально скомпилированную версию CPython в какую- то промышленную среду, тогда вам следует запускать Code с флагом ./configure --with-pgo в Linux и macOS, а также применять флаг --pgo для build.bat для Windows.

Поскольку оптимизация специфична для конкретной платформы и архитектуры, для которых выполнялось определённое профилирование, профили PGO не могут совмещаться среди операционных систем и архитектур ЦПУ. Сами дистрибутивы CPython в Python.org уже прошли через PGO, поэтому если вы выполните эталонное тестирование некого унифицированным образом скомпилированного исполняемого файла, он окажется более медленным чем выгружаемый с Python.org .

Проводимые профилем оптимизации Windows, macOS и Linux содержат такие проверки и улучшения:

  • Вложение функции: Если некая функция регулярно вызывается из другой функции, она будет inlined (заключена вовнутрь), или скопирована в свою вызывающую функцию для снижения общего размера стека.

  • Упреждающее исполнение и вложение виртуального вызова: Когда некий вызов виртуальной функции часто имеет целью определённую функцию, тогда PGO способен вставлять условное исполнение, напрямую исполняющее вызов такой функции. Подобный непосредственный вызов затем может быть заключён вовнутрь.

  • Оптимизация выделения регистров: На основании результатов данных профилирования PGO оптимизирует выделение регистров.

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

  • Оптимизация горячих точек: Те функции, на которые соответствующая программа тратит максимальное время выполнения могут быть оптимизированы в отношении скорости.

  • Оптимизация схемы функции: После того как PGO проанализирует граф вызовов, те функции, которые обладают тенденцией располагаться в одном и том же пути выполнения перемещаются в один и тот же раздел своего компилируемого приложения.

  • Оптимизация условного ветвления: PGO способен рассматривать ветвления решений, таких как операторы if … else if или switch и замечать наиболее часто используемые пути. Например, когда в неком операторе switch имеется десять вариантов , а один из них используется в 9 процентах раз, тогда этот вариант может быть перемещён вверх с тем, чтобы он выполнялся немедленно в пути своего кода.

  • Выделение мёртвых мест: Код, который не исполняется на протяжении PGO перемещается в отдельный раздел вашего приложения.

Выводы

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

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