Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Разновидности модели выполнения

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

выполнения, описанный в предыдущем разделе, отражает современную 

стандартную реализацию интерпретатора Python, которая в действительности не

является обязательным требованием самого языка Python. Вследствие этого

модель выполнения склонна изменяться с течением времени. Фактически уже

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

рис. Давайте потратим несколько минут, чтобы ознакомиться с наиболее

заметными изменениями.

Альтернативные реализации Python

В то время когда я писал эту книгу, существовали три основные 

альтернативные реализации языка Python - CPython, Jython и IronPython, а также 

несколько второстепенных реализаций, таких как Stackless Python. В двух 

словах: CPython - это стандартная реализация, а все остальные создавались для

специфических целей и задач. Все они реализуют один и тот же язык Python,

но выполняют программы немного по-разному.

CPython

Оригинальная и стандартная реализация языка Python обычно называется

CPython, особенно когда необходимо подчеркнуть ее отличие от двух других

альтернатив. Это название происходит из того факта, что реализация написана

на переносимом языке ANSI С. Это тот самый Python, который вы загружаете

с сайта http://www.python.org, получаете в составе дистрибутива ActivePython

и который присутствует в большинстве систем Linux и Mac OS X. Если вы 

обнаружили у себя предварительно установленную версию Python, то более чем

вероятно это будет CPython, - при условии, что ваша компания не использует

какую-то специфическую версию.

Если вы не предполагаете создавать приложения на Java или для платформы

.NET, возможно, вам следует отдать предпочтение стандартной реализации

CPython. Поскольку это эталонная реализация языка, она, как правило, 

работает быстрее, устойчивее и лучше, чем альтернативные системы. Рисунок 2.2

отражает модель выполнения CPython.

Jython

Интерпретатор Jython (первоначальное название - JPython) - это 

альтернативная реализация языка Python, основная цель которой - тесная интеграция

с языком программирования Java. Реализация Jython состоит из Java-классов,

которые выполняют компиляцию программного кода на языке Python в байт-

код Java и затем передают полученный байт-код виртуальной машине Java

(Java Virtual Machine, JVM). Программист помещает инструкции на языке

Python в текстовые файлы как обычно, а система Jython подменяет два 

расположенных на рис. 2.2 справа этапа на эквиваленты языка Java.

Цель Jython состоит в том, чтобы позволить программам на языке Python

управлять Java-приложениями, точно так же как CPython может управлять

компонентами на языках С и C++. Эта реализация имеет бесшовную 

интеграцию с Java. Поскольку программный код на языке Python транслируется

в байт-код Java, во время выполнения он ведет себя точно так же, как 

настоящая программа на языке Java. Сценарии на языке Jython могут выступать

в качестве апплетов и сервлетов, создавать графический интерфейс с 

использованием механизмов Java и так далее. Более того, Jython обеспечивает 

поддержку возможности импортировать и использовать Java-классы в программном

коде Python. Тем не менее поскольку реализация Jython обеспечивает более

низкую скорость выполнения и менее устойчива по сравнению с CPython, она

представляет интерес скорее для разработчиков программ на языке Java, 

которым необходим язык сценариев в качестве интерфейса к Java-коду.

IronPython

Третья (и к моменту написания этих строк самая новая) реализация 

языка Python - это IronPython. Она предназначена для обеспечения интеграции

программ Python с приложениями, созданными для работы в среде Microsoft

.NET Framework операционной системы Windows, а также в Mono - открытом

эквиваленте для операционной системы Linux. Платформа .NET и среда 

выполнения языка С# предназначены для обеспечения взаимодействий между

программными объектами - независимо от используемого языка 

программирования, в духе более ранней модели СОМ компании Microsoft. Реализация

IronPython позволяет программам на языке Python играть роль как 

клиентских, так и серверных компонентов, доступных из других языков 

программирования .NET.

Модель реализации IronPython очень напоминает Jython (и фактически 

разрабатывается одним и тем же автором) - она подменяет два этапа на рис. 2.2 

справа на эквиваленты среды .NET. Кроме того, как и Jython, основной интерес

IronPython представляет для разработчиков, которым необходима 

интеграция Python с компонентами .NET. Поскольку разработка ведется компанией

Microsoft, от IronPython, кроме всего прочего, можно было бы ожидать 

существенной оптимизации производительности. К моменту написания этих строк

реализация IronPython еще продолжала разрабатываться. За дополнительной

информацией обращайтесь к ресурсам Python или попробуйте самостоятельно

поискать в Сети.1

Средства оптимизации скорости выполнения

Все три реализации, CPython, Jython и IronPython, реализуют язык Python

похожими способами: исходный программный код компилируют в байт-код

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

машины. Но кроме них существуют и другие реализации, включая 

динамический компилятор Psyco и транслятор Shedskin C++, которые пытаются 

оптимизировать основную модель выполнения. Знание этих реализаций не 

является для вас обязательным на этой стадии изучения языка Python, тем не менее,

краткий обзор их реализации модели выполнения поможет пролить свет на

модель выполнения в целом.

Динамический компилятор Psyco

Система Psyco - это не другая реализация языка Python, а компонент, 

расширяющий модель выполнения байт-кода, что позволяет программам 

выполняться быстрее. В терминах схемы на рис. 2.2 Psyco - это расширение PVM,

которое собирает и использует информацию о типах, чтобы транслировать

части байт-кода программы в истинный двоичный машинный код, который

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

изменения в исходный программный код или производить дополнительную 

компиляцию в ходе разработки.

Грубо говоря, во время выполнения программы Psyco собирает информацию

о типах объектов и затем эта информация используется для генерации 

высокоэффективного машинного кода, оптимизированного для объектов этого

типа. После этого произведенный машинный код замещает соответствующие

участки байт-кода и тем самым увеличивает скорость выполнения программы.

В результате при использовании Psyco существенно уменьшается общее время

выполнения программы. В идеале некоторые участки программного кода под

управлением Psyco могут выполняться так же быстро, как скомпилированный

код языка С.

Поскольку эта компиляция из байт-кода производится во время 

выполнения программы, обычно Psyco называют динамическим (just-in-time, JIT)

компилятором. Однако в действительности Psyco немного отличается от JIT-

компиляторов, которые, возможно, некоторые читатели видели в языке Java.

В действительности Psyco - это специализированный ЛТ-компилятор; он

генерирует машинный код, оптимизированный для типов данных, которые

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

программы использует различные типы данных в разное время, Psyco может

генерировать различные версии машинного кода для поддержки каждой из

комбинаций.

Применение Psyco показывает существенное увеличение скорости 

выполнения программного кода Python. Согласно информации, которая приводится

на домашней странице проекта, Psyco обеспечивает увеличение скорости «от

2 до 100 раз, обычно в 4 раза, при использовании немодифицированного 

интерпретатора Python, неизменного исходного текста, всего лишь за счет 

использования динамически загружаемого модуля расширения на языке С».

При прочих равных условиях наибольший прирост скорости наблюдается для

программного кода, реализующего различные алгоритмы на чистом языке

Python, - именно такой программный код обычно переносят на язык С с 

целью оптимизации. При использовании Psyco необходимость в таком переносе

теряет свою остроту.

До сих пор Psyco не является стандартной частью Python - его нужно 

загружать и устанавливать отдельно. Кроме того, он до сих пор находится на 

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

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

загрузить и установить, но похоже, что большая его часть будет поглощена 

более новым проектом «РуРу», который представляет собой попытку переписать

PVM на языке Python с целью обеспечения высокой степени оптимизации, как

в Psyco.

Пожалуй, самым большим недостатком Psyco является то обстоятельство, что

в настоящее время он способен генерировать машинный код только для 

архитектуры Intel x86, впрочем, на этой архитектуре работают такие операционные

системы, как Windows, Linux и даже Мае. За дополнительной информацией

о расширении Psyco и других попытках реализации JIT-компилятора 

обращайтесь на сайт http://www.python.org. Кроме того, вы можете посетить 

домашнюю страницу проекта Psyco, которая в настоящее время размещается по 

адресу http://psyco.sourceforge.net.

Транслятор Shedskin C++

Shedskin - это еще одна система, которая реализует нетрадиционный подход

к выполнению программ на языке Python. Она преобразует исходный код на

языке Python в исходный код на языке C++, который затем может быть 

скомпилирован в машинный код. Кроме того, эта система реализует платформоне-

зависимый подход к выполнению программного кода Python. К моменту 

написания этих строк система Shedskin еще находилась на экспериментальной

стадии развития и ограничивала программы Python неявным использованием

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

языке Python, поэтому мы не будем углубляться в описание этой системы. Тем

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

чтобы выиграть гонку за скоростью как у стандартной реализации Python, так

и у расширения Psyco, и это весьма многообещающий проект. Сведения о 

текущем состоянии проекта вы можете самостоятельно найти в Сети.

Фиксированные двоичные файлы

Иногда, когда пользователи спрашивают про «настоящий» компилятор языка

Python, в действительности они просто ищут способ создавать из своих 

программ на языке Python самостоятельные исполняемые файлы. Это 

необходимо скорее для упаковки и распространения программ, чем для их исполнения,

но эти две стороны взаимосвязаны между собой. При помощи инструментов

сторонних разработчиков, которые можно загрузить из Сети, вы можете 

превратить свои программы на языке Python в настоящие исполняемые файлы,

которые в мире Python известны как фиксированные двоичные файлы (frozen

binaries).

Фиксированные двоичные файлы объединяют в единый файл пакета байт-код

программ, PVM (интерпретатор) и файлы поддержки, необходимые 

программам. Существуют разные реализации такого подхода, но в конечном 

результате получается единственный исполняемый файл (например, файл с 

расширением .ехе в Windows), который легко можно передать заказчику. Такую модель

можно представить, если на рис. 2.2 объединить байт-код и PVM в единый 

компонент - фиксированный двоичный файл.

На сегодняшний день существует три основных инструмента создания 

фиксированных двоичных файлов: ру2ехе (для Windows), Pylnstaller (напоминает

ру2ехе, но также работает в Linux и UNIX и способен производить 

самоустанавливающиеся исполняемые файлы) и freeze (оригинальная версия). Вам 

придется загружать эти инструменты отдельно от Python, но они 

распространяются совершенно бесплатно. Кроме того, они постоянно развиваются, поэтому

свежую информацию об этих инструментах смотрите на сайте проекта Python

(http://www.python.org) или ищите с помощью поисковых систем. Чтобы дать

вам общее представление об области применения этих инструментов, замечу,

что ру2ехе может создавать автономные программы, использующие 

библиотеки tkinter, PMW, wxPython и PyGTK для создания графического интерфейса;

программы, использующие инструментальные средства создания игр pygame;

клиентские программы win32com и многие другие.

Фиксированные двоичные файлы - это не то же самое, что получается в 

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

код с помощью виртуальной машины. Следовательно, программы в 

фиксированных двоичных файлах исполняются с той же скоростью, что и обычные

файлы с исходными текстами программ, разве что улучшен способ их запуска.

Фиксированные двоичные файлы имеют немалый размер (они содержат в себе

PVM), но по современным меркам их все же нельзя назвать необычно 

большими. Так как интерпретатор Python встроен непосредственно в фиксированные

двоичные файлы, его установка не является обязательным требованием для

запуска программ на принимающей стороне. Более того, поскольку программный код упакован в фиксированный двоичный файл, он надежно скрыт от 

получателя.

Такая схема упаковки программ в единственный файл особенно подходит для

нужд разработчиков коммерческого программного обеспечения. Например,

программа с графическим интерфейсом на базе tkinter может быть упакована

в исполняемый файл и распространяться как самостоятельная программа на

CD или через Интернет. Конечному пользователю не нужно будет 

устанавливать Python (и даже знать о том, что это такое), чтобы запустить 

распространяемую программу.

Другие способы выполнения

Существуют также другие схемы выполнения программ на языке Python, 

преследующие узкоспециализированные цели:

• Система Stackless Python - это разновидность стандартной реализации

CPython, которая не использует стек вызовов языка С. Она упрощает 

перенос Python на архитектуры с небольшим объемом стека, обеспечивает 

дополнительные возможности параллельной обработки данных и поощряет

использование новейших инструментов языка, таких как сопрограммы.

• Система Cython (расширенная версия проекта Ругех) - это гибридный

язык, дополняющий язык Python возможностью вызывать функции на

языке С и использовать объявления типов переменных, аргументов и 

атрибутов классов на языке С. Исходные тексты на языке Cython могут быть

скомпилированы в программный код на языке С, использующий Python/C

API, который в свою очередь может быть скомпилирован в машинный код.

Несмотря на то, что получающийся программный код не полностью 

совместим со стандартным языком Python, Cython может оказаться как 

полезным инструментом для создания оберток вокруг внешних библиотек на

языке С, так и эффективным средством разработки расширений на С для

языка Python.

Дополнительные подробности об этих системах вы без труда найдете в 

Интернете.

Будущие возможности

В заключение обратите внимание, что модель выполнения, обсуждавшаяся

здесь, в действительности является лишь отражением текущей реализации

интерпретатора Python, но не самого языка программирования. Например,

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

актуальность (едва ли она сохранится у кого-нибудь через десять лет), появится

традиционный компилятор для трансляции исходного текста на языке Python

в машинный код. Кроме того, в будущем могут появиться новые варианты 

реализации интерпретатора и разновидности байт-кода. Например:

• Проект Parrot поставил перед собой цель выработать единый формат байт-

кода, единую виртуальную машину и методики оптимизации для 

различных языков программирования (подробности на сайте http://'www.python,

org). Стандартная виртуальная машина PVM в интерпретаторе пока 

выполняет программный код быстрее, чем Parrot, но пока неясно, как будет 

развиваться этот проект.

• Проект РуРу - попытка реализовать PVM непосредственно на языке 

Python, что позволит использовать новые приемы программирования. Его

цель- создать быструю и гибкую реализацию Python.

• Проект Unladen Swallow, поддерживаемый компанией Google, поставил 

перед собой задачу повысить производительность стандартного 

интерпретатора Python по меньшей мере в 5 раз, что позволит использовать его в качестве

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

оптимизации будет создана полностью совместимая версия CPython, 

которая выполняется гораздо быстрее. Участники этого проекта также 

надеются удалить глобальную блокировку Python (Global Interpreter Lock, GIL),

которая препятствует возможности одновременного выполнения 

нескольких потоков управления. В настоящее время этот проект разрабатывается

инженерами из Google как проект с открытыми исходными текстами - 

изначально за основу в нем была принята версия Python 2.6, однако вполне

возможно, что изменения смогут быть внесены и в версию 3.0. 

Дополнительные подробности вы найдете на сайте компании Google.

Подобные грядущие схемы реализации могут несколько изменить схему 

времени выполнения интерпретатора Python, однако, скорее всего компилятор

байт-кода останется стандартом еще какое-то время. Переносимость и 

гибкость байт-кода во время выполнения - это очень важные качества многих 

реализаций Python. Более того, добавление в язык конструкций объявления 

типов с целью обеспечения статической компиляции только повредит гибкости,

осмысленности, простоте и общему духу языка Python. Из-за динамической

природы языка Python любые реализации в будущем, скорее всего, сохранят

некоторые черты нынешней PVM.

«Learning Python, Fourth Edition, by
Mark Lutz. Copyright 2009 O'Reilly Media, Inc., 978-0-596-15806-4».