Примечание: автор дезавуирует глубокие знания в этой области.Некоторые утверждения могут быть неверными.
Python фактически компилируется в байт-код, который запускается интерпретатором python.Всякий раз, когда вы используете модуль Python, Python генерирует файл .pyc
с именем, соответствующим модулю.Это эквивалент файла .o
, который создается при компиляции файла C.
Так что, если вы хотите что-то разобрать, файл .pyc
будет таким:)
Процесс, который проходит Python при компиляции модуля, очень похож на то, что gcc
или другой компилятор C делает с исходным кодом C.Основное отличие состоит в том, что это происходит прозрачно как часть выполнения файла.Это также необязательно: при запуске немодульного, то есть скрипта конечного пользователя, Python будет просто интерпретировать код, а не компилировать его вначале.
Поэтому на самом деле ваш вопрос таков: «Почему программы на Python распространяются как исходные тексты?чем скомпилированные модули?Или, говоря по-другому: «Почему приложения C распространяются как скомпилированные двоичные файлы, а не как исходный код?»
Раньше распространенные приложения C распространялись как исходный код.Это было еще до того, как операционные системы и их различные сущности (например, дистрибутивы Linux) стали более устоявшимися.Некоторые дистрибутивы, например gentoo, по-прежнему распространяют приложения в виде исходного кода.Приложения, которые являются немного более передовыми или малоизвестными, все еще распространяются как исходный код для всех платформ, на которые они ориентированы.
Причина этого - совместимость и зависимости.Причина, по которой вы можете запустить предварительно скомпилированный бинарный Safari на Mac или Firefox на Ubuntu Linux, заключается в том, что он был специально создан для этой операционной системы, архитектуры (например, x86_64) и набора библиотек.
К сожалению, компиляциябольшого приложения довольно медленное и должно быть переделано по крайней мере частично каждый раз, когда приложение обновляется.Таким образом, мотивация для бинарных дистрибутивов.
Так почему бы не создать бинарный дистрибутив Python?С одной стороны, как упоминает Аарон , модули необходимо будет перекомпилировать для каждой новой версии байт-кода Python.Но это было бы похоже на перестройку приложения C для связи с более новой версией динамической библиотеки - модули Python в этом смысле аналогичны библиотекам C.
Реальная причина в том, что компиляция Python выполняется намного быстрее, чемС компиляцией.Я думаю, что это отчасти связано с динамической природой языка, а также с тем, что он не так тщателен для компиляции.Это имеет свои недостатки: в частности, приложения Python работают намного медленнее, чем их аналоги на C, потому что Python должен интерпретировать скомпилированный байт-код в инструкции для процессора, тогда как приложение C уже содержит такие инструкции.
При этом существует программа под названием py2exe , которая будет принимать модуль Python и распространять его, а также создавать предварительно скомпилированный исполняемый файл Windows, включая в него логику модуля и его зависимостей, включая сам Python.Я предполагаю, что смысл этого состоит в том, чтобы не заставлять людей устанавливать Python в своей системе Windows только для запуска вашего приложения.Под linux, или я думаю, что даже OS / X, Python обычно уже установлен, поэтому прекомпиляция на самом деле не нужна.В системах Linux также есть менеджеры пакетов super-dandy, которые прозрачно устанавливают такие зависимости, как Python, если они еще не установлены.