Глава 3. Компиляция CPython
Содержание
Теперь, когда вы выгрузили некую среду разработки и настроили её, вы можете скомпилировать сам исходный код CPython в некий исполняемый интерпретатор.
В отличии от файлов Python, исходный код C надлежит повторно компилировать всякий раз при его изменении. Вероятно вы пожелаете поместить закладку на данной главе и выучить наизусть некоторые из её шагов, ибо вы будете повторять их много раз.
В нашей предыдущей главе вы увидели как монтировать вашу среду с неким вариантом стадии сборки, которая повторно компилирует CPython. Прежде чем ваши этапы сборки заработают, вам потребуется компилятор С и некоторые инструменты сборки.
Эти инструменты применяются в зависимости от используемой вами операционной системы, а потому перепрыгните сразу в раздел для своей операционной системы.
Замечание | |
---|---|
Если вас беспокоит, что любой из этих шагов помешает имеющимся у вас установкам CPython, не волнуйтесь. Имеющийся каталог исходного кода CPython ведёт себя как некая виртуальная среда. При компиляции CPython или изменении его исходного кода или стандартной библиотеки, это всегда происходит в рамках песочницы его каталога исходного кода. Если вы желаете установить некую индивидуальную версию, этот этап обсуждается в данной главе. |
Компиляция CPython в macOS требует некоторые дополнительные приложения и библиотеки. Прежде всего, вам требуется существенный набор инструментов компилятора C. Вы можете обновить в macOS через App Store прикладное приложение Command Line Tools. Вам требуется выполнить его начальную установку в соответствующем терминале.
Замечание | |
---|---|
Для открытия терминала в macOS пройдите в Applications > Other > Terminal/
Вы захотите сохранить это приложение в своём Dock, |
При помощи терминала установите компилятор C и набор инструментов выполнив следующее:
$ xcode-select --install
После запуска этой команды вы получите приглашение на выгрузку и установку набора инструментов, включающего Git, Make, а также компилятор C GNU.
Вам также потребуется рабочая копия OpenSSL для применения при извлечении пакетов с вебсайта PyPI. Если вы планируете применять эту сборку для установки дополнительных пакетов, тогда потребуется удостоверение SSL.
Наиболее простой способ установки OpenSSL в macOS состоит в использовании Homebrew.
Замечание | |
---|---|
Если у вас нет Homebrew, вы можете выгрузить его напрямую из GitHub и установить при помощи такой команды:
|
После того как у вас имеется установленным 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
уведомит вас что
собраны не все пакеты. Например, пакеты 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 имеет расширение файла Поскольку в macOS файловая система не чувствительна к регистру, разработчики не хотели, чтобы люди случайно сылались на каталог
Если вы позднее запустите |
Для компиляции 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
Смотри также | |
---|---|
За дополнительными сведениями относительно вариантов для |
Проверьте полученный вывод чтобы убедиться что не возникло проблем компиляции с модулем _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,затем скопировать эти упакованные исполняемые файлы в некий каталог в вашем компьютере, который является частью его системного пути.
В качестве разработчика 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
обладает большим числом параметров. Вот некоторые, которые вы найдёте полезными на протяжении
данной книги:
Параметр | Применеие |
---|---|
|
Перекрываемые makefile -ами переменные среды |
|
Не позволяет никакого доступа, но возвращает ошибку |
|
Игнорировать ошибки из команд |
|
Разрешить |
|
Продолжать выполнение, когда некоторые цели не могут быть выполнены |
|
Запускать множество заданий только когда |
|
Выводить команды на печать вместо их выполнения |
|
Не выводить команды эхом |
|
Останавливаться когда цели не могут быть сделаны |
В своём следующем разделе и на протяжении этой книги вы будете выполнять make
с такими параметрами:
$ make -j2 -s [target]
Установленный флаг -о2
позволяет make
выполнять одновременно
два задания. Если у вас имеется четыре и более ядре, тогда вы можете изменить его на четыре или более и компиляция завершится быстрее.
{Прим. пер.: предлагаем некое эмпирическое правило по настройке данного значения в нашем переводе Программирование ядра Linux Кайваня Н Биллимории,
изданной Packt Publishing в марте 2021.}
Установка флага -s
прекращает вывод на печать в консоль всех команд из makefile при их выполнении.
Если вы желаете увидеть что произойдёт, можете удалить этот флаг -s
.
И для Linux, и для macOS вы обнаружите, что вам требуется очищать файлы, сборки или освежать имеющуюся конфигурацию. Приводимые далее разделы
содержат таблицы, структурирующих некоторое число полезных целей make
,
собираемых в makefile CPython.
Следом идцт цели, применяемые для сборки исполняемого файла CPython:
Цель | Назначение |
---|---|
|
Собирает компилятор, библиотеки и модули |
|
Запускает параметр Clinic во всех исходных файлах |
|
Компилирует исполняемый файл Python с руководимой профилем оптимизацией |
|
Повторно вырабатывает все генерируемые файлы |
|
Собирает совместно используемые модули |
Приводимые ниже цели используются для тестирования компилируемого вами исполняемого файла:
Цель | Назначение |
---|---|
|
Скомпилировать и запустить тестирование при помощи |
|
Создать HTML отчёты зоны действия |
|
Запускает более быстрый набор регрессионного тестирования, исключая те тесты, которые требуют большего времени |
|
Запускает базовое регрессионное тестирование |
|
Запускает имеющийся комплект тестов дважды, один раз без файлов |
|
Запускает имеющийся комплект тестов для обеих архитектур в универсальной сборке для OS X |
Первичными целями очистки выступают clean
, clobber
и
distclean
. Цель clean
служит общему удалению скомпилированных и
кэшированных библиотек и файлов .pyc
.
Если вы обнаружите, что clean
не справляется со своим заданием, тогда испытайте
clobber
. Цель clobber
удалит ваш makefile, поэтому вам придётся
снова выполнить ./configure
.
Для полной очистки всей среды вплоть до дистрибутива выполните цель distclean
.
Последующий список включает перечисленные нами только что первичные цели, а также некоторые дополнительные цели очистки:
Цель | Назначение |
---|---|
|
При сборке из исходного кода проверяет что он чистый |
|
Удаляет файлы |
|
Удаляет каталоги |
|
То же что и |
|
То же что и |
|
Удаляет в |
|
Удаляет все профили оптимизации |
|
Удаляет файлы |
Существуют две разновидности целей установки: установленная по умолчанию версия, такая как install
и
версия alt
, такая как altinstall
. Если вы желаете установить
скомпилированную вами версию в своём компьютере, но не желаете чтобы она стала установкой Python 3 версии по умолчанию, пользуйтесь
alt
версией соответствующих команд:
Цель | Назначение |
---|---|
|
Устанавливает собранный интерпретатор |
|
Устанавливает совместные библиотеки, исполняемые файлы и документацию с соответствующим суффиксом версии |
|
Устанавливает пронумерованные версией руководства |
|
Устанавливает все исполняемые файлы, такие как |
|
Устанавливает совместные библиотеки и модули |
|
Устанавливает совместные библиотеки, исполняемые файлы и документацию
(исполнит |
|
Установит совместные библиотеки |
|
Установит все руководства |
|
Динамически загружает модули |
После того как вы выполните установку при помощи make install
, с вашей скомпилированной библиотекой
будет связана соответствующая команда python3
. Однако, если вы воспользовались
make altinstall
, будет установлен лишь python$(VERSION)
, а
существующая привязка к python3
останется нетронутой.
Ниже приводятся некоторые дополнительные цели make
, которые вы можете найти полезными:
Цель | Назначение |
---|---|
|
Автоматически повторно вырабатывает |
|
Вырабатывает сценарий |
|
Повторно исполняет |
|
Проверяет что экспортируемые файлы начинаются с |
|
Создаёт файл тегов для vi |
|
Создаёт файл тегов для Emacs |
В Windows имеются два способа компиляции исполняемых файлов и библиотек CPython:
-
Компиляция из вашей командной строки. Она всё ещё требует наличия компилятора Microsoft Visual C++, который поставляется совместно с Visual Studio.
-
В 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
.
Замечание | |
---|---|
Значение суффикса Соответствующие выпуски исполняемых файлов Python.org компилируются в конфигурации, руководимой профилем (PGO). Относительно дополнительных сведений по PGO обртитесь к разделу Проводимая профилем оптимизация в самом конце этой главы. |
Параметры
В build.bat
доступны следующие аргументы:
Флаг | Назначение | Ожидаемое значение |
---|---|---|
|
Архитектура ЦПУ платформы сборки |
|
|
Конфигурация сборки |
|
|
Цель сборки |
|
Флаги
Вот некоторые необязательные флаги, которые вы можете применять для build.bat
:
Флаг | Назначение |
---|---|
|
Verbose mode (Подробный режим): в процессе сборки отображает информационные сообщения |
|
Very Verbose mode (Очень подробный режим): в процессе сборки отображает подробные информационные сообщения |
|
Quiet mode (Тихий режим): в процессе сборки отображает только предупреждения и сообщения об ошибках |
|
Выгружает и устанавливает внешние зависимости (значение по умолчанию) |
|
Не выгружает и не устанавливает внешние зависимости (значение по умолчанию) |
|
Собирает проводимую профилем оптимизацию |
|
Повторно вырабатывает всю грамматику и все лексемы (применяется при обновлении самого языка) |
Для выдачи полного списка выполните build.bat -h
.
Внутри папки 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 в режиме
отладки:
Вы можете запускать свой собранный выпуск изменив конфигурацию сборки с 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
в качестве оконного интерпретатора:
Запустите сеанс REPL, кликнув по Open Interactive Window
в окне
Python Environments
и вы обнаружите REPL для своей скомпилированной
версии Python:
На протяжении данной книги мы будем встречаться с сеансами REPL с примерами команд. В случае если вы желаете входить во все точки прерываний внутри своего кода, я призываю вас применять дла запуска такого REPL отладочный исполняемый файл.
Чтобы проще перемещаться по вашему коду, в представлении Solution
кликните по кнопке next
за иконкой
Home
чтобы переключиться на представление
Folder
:
Все процессы сборки 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 в какую- то промышленную среду, тогда вам следует
запускать |
Поскольку оптимизация специфична для конкретной платформы и архитектуры, для которых выполнялось определённое профилирование, профили PGO не могут совмещаться среди операционных систем и архитектур ЦПУ. Сами дистрибутивы CPython в Python.org уже прошли через PGO, поэтому если вы выполните эталонное тестирование некого унифицированным образом скомпилированного исполняемого файла, он окажется более медленным чем выгружаемый с Python.org .
Проводимые профилем оптимизации Windows, macOS и Linux содержат такие проверки и улучшения:
-
Вложение функции: Если некая функция регулярно вызывается из другой функции, она будет inlined (заключена вовнутрь), или скопирована в свою вызывающую функцию для снижения общего размера стека.
-
Упреждающее исполнение и вложение виртуального вызова: Когда некий вызов виртуальной функции часто имеет целью определённую функцию, тогда PGO способен вставлять условное исполнение, напрямую исполняющее вызов такой функции. Подобный непосредственный вызов затем может быть заключён вовнутрь.
-
Оптимизация выделения регистров: На основании результатов данных профилирования PGO оптимизирует выделение регистров.
-
Оптимизация базового блока: Оптимизация базового блока делает возможным помещение обычно выполняемых базовых блоков, которые временно выполняются внутри заданного кадра в ту же самую локальность, или набор страниц. Это минимизирует общее число используемых страниц с одновременной минимизацией накладных расходов оперативной памяти.
-
Оптимизация горячих точек: Те функции, на которые соответствующая программа тратит максимальное время выполнения могут быть оптимизированы в отношении скорости.
-
Оптимизация схемы функции: После того как PGO проанализирует граф вызовов, те функции, которые обладают тенденцией располагаться в одном и том же пути выполнения перемещаются в один и тот же раздел своего компилируемого приложения.
-
Оптимизация условного ветвления: PGO способен рассматривать ветвления решений, таких как операторы
if … else if
илиswitch
и замечать наиболее часто используемые пути. Например, когда в неком оператореswitch
имеется десять вариантов , а один из них используется в 9 процентах раз, тогда этот вариант может быть перемещён вверх с тем, чтобы он выполнялся немедленно в пути своего кода. -
Выделение мёртвых мест: Код, который не исполняется на протяжении PGO перемещается в отдельный раздел вашего приложения.
В этой главе вы увидели как компилировать исходный код CPython в некий рабочий интерпретатор. Вы будете применять эти знания на протяжении всей книги, по мере того как вы будете исследовать и адаптировать этот исходный код.
Вам придётся повторять эти шаги компиляции десятки и даже сотни раз при работе с CPython. Если вы можете приспособить свою среду разработки под создание закладок повторной компиляции, тогда лучше воспользоваться этим теперь, чтобы сберечь вам много времени.