Главная страница
Навигация по странице:

  • Виртуальная машина Python (PVM)

  • Производительность

  • Исходный текст

  • Скорость разработки

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

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

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

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

  • Математический анализ. 3е издание


    Скачать 4.86 Mb.
    Название3е издание
    АнкорМатематический анализ
    Дата04.02.2022
    Размер4.86 Mb.
    Формат файлаpdf
    Имя файлаpython_01.pdf
    ТипДокументы
    #351981
    страница9 из 98
    1   ...   5   6   7   8   9   10   11   12   ...   98
    63
    способов распространения программ на языке Python. Интерпретатор запустит файл .pyc, даже если нет оригинальных файлов с исходными текстами. (В разделе «Фиксированные двоичные файлы» описывается еще один способ распространения программ.)
    Виртуальная машина Python (PVM)
    Как только программа будет скомпилирована в байткод (или байткод будет загружен из существующих файлов .pyc), он передается универ
    сальному механизму под названием виртуальная машина Python
    (PVM – для любителей аббревиатур). Аббревиатура PVM выглядит бо
    лее внушительно, чем то, что за ней стоит на самом деле, – это не от
    дельная программа, которую требуется устанавливать. Фактически,
    PVM – это просто большой цикл, который выполняет перебор инст
    рукций в байткоде, одну за одной, и выполняет соответствующие им операции. PVM – это механизм времени выполнения, она всегда при
    сутствует в составе системы Python, и это тот самый программный ком
    понент, который выполняет ваши сценарии. Формально – это послед
    няя составляющая того, что называют «интерпретатором Python».
    На рис. 2.2 показана последовательность действий, которая описыва
    ется здесь. Не забывайте, что все эти сложности преднамеренно спря
    таны от программистов. Компиляция в байткод производится автома
    тически, а PVM – это всего лишь часть системы Python, которую вы установили на свой компьютер. Повторю еще раз, что программисты просто создают программный код на языке Python и запускают файлы с инструкциями.
    Производительность
    Читатели, имеющие опыт работы с компилирующими языками про
    граммирования, такими как C и C++, могут заметить несколько отли
    чий в модели выполнения Python. Первое, что бросается в глаза, – это отсутствие этапа сборки, или вызова утилиты «make»: программный код может запускаться сразу же, как только будет написан. Второе от
    личие: байткод не является двоичным машинным кодом (например,
    Исходный текст
    Байткод
    Выполнение
    PVM
    m.pyc m.py
    Рис. 2.2. Традиционная модель выполнения программ на языке Python:
    исходный текст, который вводится программистом, транслируется в байт+
    код, который затем исполняется виртуальной машиной Python. Исходный
    текст автоматически компилируется и затем интерпретируется

    64
    Глава 2. Как Python запускает программы инструкциями для микропроцессора Intel). Байткод – это внутреннее представление программ на языке Python.
    По этой причине программный код на языке Python не может выпол
    няться так же быстро, как программный код на языке C или C++, о чем уже говорилось в главе 1. Обход инструкций выполняет виртуальная машина, а не микропроцессор, и чтобы выполнить байткод, необходи
    ма дополнительная интерпретация, инструкции которого требуют на выполнение больше времени, чем машинные инструкции микропро
    цессора. С другой стороны, в отличие от классических интерпретато
    ров, здесь присутствует дополнительный этап компиляции – интерпре
    татору не требуется всякий раз снова и снова анализировать инструк
    ции исходного текста. В результате Python способен обеспечить ско
    рость выполнения гдето между традиционными компилирующими и традиционными интерпретирующими языками программирования.
    Подробнее о проблеме производительности рассказывается в главе 1.
    Скорость разработки
    С другой стороны, в модели выполнения Python отсутствуют различия между средой разработки и средой выполнения. То есть системы, кото
    рые компилируют и выполняют исходный текст, – это суть одна и та же система. Для читателей, имеющих опыт работы с традиционными ком
    пилирующими языками, это обстоятельство может иметь некоторое значение, но в Python компилятор всегда присутствует во время выпол
    нения и является частью механизма, выполняющего программы.
    Это существенно увеличивает скорость разработки. Не нужно всякий раз выполнять компиляцию и связывание программ, прежде чем за
    пустить их, – вы просто вводите исходный текст и запускаете его. Это также придает языку некоторый динамизм – вполне возможно, а не
    редко и удобно, когда программы на языке Python создаются и выпол
    няются другими программами Python во время выполнения. Напри
    мер, встроенные инструкции eval и exec принимают и выполняют стро
    ки, содержащие программный код на языке Python. Благодаря такой возможности Python может использоваться для настройки продуктов –
    программный код Python может изменяться «на лету», а пользователи могут изменять части системы, написанные на языке Python, без необ
    ходимости перекомпилировать систему целиком.
    Имейте в виду, если смотреть с более фундаментальных позиций, то все,
    что имеется в Python, работает на этапе времени выполнения – здесь пол
    ностью отсутствует этап предварительной компиляции, все, что необхо
    димо, производится во время выполнения программы. Сюда относятся даже такие операции, как создание функций и классов и связывание мо
    дулей. Эти события в более статичных языках происходят перед выпол
    нением, но в программах на языке Python происходят во время выпол
    нения. В результате процесс программирования приобретает больший динамизм, чем тот, к которому привыкли некоторые читатели.

    Разновидности модели выполнения
    65
    Разновидности модели выполнения
    Прежде чем двинуться дальше, я должен заметить, что внутренний поток выполнения, описанный в предыдущем разделе, отражает со
    временную стандартную реализацию интерпретатора Python, которая в действительности не является обязательным требованием самого языка Python. Вследствие этого модель выполнения склонна изме
    няться с течением времени. Фактически уже существуют системы, ко
    торые несколько меняют картину, представленную на рис. 2.2. Давай
    те потратим несколько минут, чтобы ознакомиться с наиболее замет
    ными изменениями.
    Альтернативные реализации Python
    В то время, когда я писал эту книгу, существовали три основные альтер
    нативные реализации языка Python – CPython, Jython и IronPython,
    а также несколько второстепенных реализаций, таких как Stackless
    Python
    . В двух словах: CPython – это стандартная реализация, а все остальные создавались для специфических целей и задач. Все они реа
    лизуют один и тот же язык Python, но выполняют программы немного поразному.
    CPython
    Оригинальная и стандартная реализация языка Python обычно назы
    вается CPython, особенно когда необходимо подчеркнуть ее отличие от двух других альтернатив. Это название происходит из того факта, что реализация написана на переносимом языке ANSI C. Это тот самый
    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 в текстовые файлы

    66
    Глава 2. Как Python запускает программы как обычно, а система Jython подменяет два расположенных на рис. 2.2
    справа этапа на эквиваленты языка Java.
    Цель Jython состоит в том, чтобы позволить программам на языке Py
    thon управлять Javaприложениями, точно так же, как CPython может управлять компонентами на языках C и C++. Эта реализация имеет бес
    шовную интеграцию с Java. Поскольку программный код на языке Py
    thon транслируется в байткод Java, во время выполнения он ведет себя точно так же, как настоящая программа на языке Java. Сценарии на языке Jython могут выступать в качестве апплетов и сервлетов, созда
    вать графический интерфейс с использованием механизмов Java и т. д.
    Более того, Jython обеспечивает поддержку возможности импортиро
    вать и использовать Javaклассы в программном коде Python. Тем не менее, поскольку реализация Jython обеспечивает более низкую ско
    рость выполнения и менее устойчива по сравнению с CPython, она пред
    ставляет интерес скорее для разработчиков программ на языке Java,
    которым необходим язык сценариев в качестве интерфейса к Javaкоду.
    IronPython
    Третья (и, к моменту написания этих строк, самая новая) реализация языка Python – это IronPython. Она предназначена для обеспечения интеграции программ Python с приложениями, созданными для рабо
    ты в среде Microsoft .NET Framework операционной системы Win
    dows, а также в Mono – открытом эквиваленте для Linux. Платформа
    .NET и среда выполнения языка C# предназначены для обеспечения взаимодействий между программными объектами – независимо от ис
    пользуемого языка программирования, в духе более ранней модели
    COM компании Microsoft. Реализация IronPython позволяет програм
    мам на языке Python играть роль как клиентских, так и серверных компонентов, доступных из других языков программирования .NET.
    Модель реализации IronPython очень напоминает Jython (и фактически разрабатывается одним и тем же автором) – она подменяет два этапа на рис. 2.2 справа на эквиваленты среды .NET. Как и Jython, основной ин
    терес IronPython представляет для разработчиков, которым необходи
    ма интеграция Python с компонентами .NET. Поскольку разработка ве
    дется компанией Microsoft, от IronPython, помимо прочего, можно бы
    ло бы еще ожидать существенной оптимизации производительности.
    К моменту написания этих строк реализация IronPython еще продол
    жала разрабатываться. За дополнительной информацией обращайтесь к ресурсам Python или попробуйте самостоятельно поискать в Сети.
    1 1
    Jython и IronPython – это полностью независимые реализации языка Py
    thon, которые компилируют исходный программный код для различных архитектур времени выполнения. Из программ для CPython также можно получить доступ к программным компонентам Java и .NET: например, сис
    темы JPype и Python для .NET позволяют коду, исполняемому интерпрета
    тором CPython, обращаться к компонентам Java и .NET.

    Разновидности модели выполнения
    67
    Средства оптимизации скорости выполнения
    Все три реализации, CPython, Jython и IronPython, реализуют язык
    Python похожими способами: исходный программный код компили
    руют в байткод и выполняют полученный байткод с помощью соот
    ветствующей виртуальной машины. Но кроме них существуют и дру
    гие реализации, включая динамический компилятор Psyco и трансля
    тор Shedskin C++, которые пытаются оптимизировать основную мо
    дель выполнения. Знание этих реализаций пока не является для вас обязательным, тем не менее краткий обзор их реализации модели вы
    полнения поможет пролить свет на модель выполнения в целом.
    Динамический компилятор Psyco
    Система Psyco – это не другая реализация языка Python, а компонент,
    расширяющий модель выполнения байткода, что позволяет програм
    мам выполняться быстрее. В терминах схемы на рис. 2.2 Psyco – это расширение PVM, которое собирает и использует информацию о типах,
    чтобы транслировать части байткода программы в истинный двоич
    ный машинный код, который выполняется гораздо быстрее. Для такой трансляции не требуется вносить изменения в исходный программный код или производить дополнительную компиляцию в ходе разработки.
    Грубо говоря, во время выполнения программы Psyco собирает инфор
    мацию о типах объектов, и затем эта информация используется для ге
    нерации высокоэффективного машинного кода, оптимизированного для объектов этого типа. После этого произведенный машинный код замещает соответствующие участки байткода и тем самым увеличи
    вает скорость выполнения программы. В результате при использова
    нии Psyco существенно уменьшается общее время выполнения про
    граммы. В идеале некоторые участки программного кода под управле
    нием Psyco могут выполняться так же быстро, как скомпилированный код языка C.
    Поскольку эта компиляция из байткода производится во время выпол
    нения программы, обычно Psyco называют динамическим (justintime,
    JIT) компилятором. Однако в действительности Psyco немного отлича
    ется от JITкомпиляторов, которые, возможно, некоторые читатели ви
    дели в языке Java. В действительности Psyco – это специализированный
    JIT+компилятор
    ; он генерирует машинный код, оптимизированный для типов данных, которые фактически используются в программе.
    Например, если один и тот же участок программы использует различ
    ные типы данных в разное время, Psyco может генерировать различ
    ные версии машинного кода для поддержки каждой из комбинаций.
    Применение Psyco показывает существенное увеличение скорости вы
    полнения программного кода Python. Согласно информации, которая приводится на домашней странице проекта, Psyco обеспечивает увели
    чение скорости «от 2 до 100 раз, обычно в 4 раза, при использовании немодифицированного интерпретатора Python, неизменного исходного

    68
    Глава 2. Как Python запускает программы текста, всего лишь за счет использования динамически загружаемого модуля расширения на языке C». При прочих равных условиях, наи
    больший прирост скорости наблюдается для программного кода, реа
    лизующего различные алгоритмы на чистом языке Python, – именно такой программный код обычно переносят на язык C с целью оптими
    зации. При использовании Psyco необходимость в таком переносе те
    ряет свою остроту.
    До сих пор Psyco не является стандартной частью Python – его нужно загружать и устанавливать отдельно. Кроме того, он до сих пор нахо
    дится на экспериментальной стадии развития, поэтому вам нужно бу
    дет следить за его разработкой. В действительности, когда я пишу эти строки, Psyco все еще можно загрузить и установить, но похоже, что большая его часть будет поглощена более новым проектом «PyPy», ко
    торый представляет собой попытку переписать PVM на языке Python с целью обеспечения высокой степени оптимизации, как в Psyco.
    Пожалуй, самым большим недостатком Psyco является то обстоятель
    ство, что в настоящее время он способен генерировать машинный код только для архитектуры Intel x86, впрочем, на этой архитектуре рабо
    тают такие операционные системы, как Windows, Linux и даже Mac.
    За дополнительной информацией о расширении Psyco и других попыт
    ках реализации JITкомпилятора обращайтесь на сайт http://www.py+
    thon.org
    . Кроме того, вы можете посетить домашнюю страницу проек
    та Psyco, которая в настоящее время размещается по адресу http://psy+
    co.sourceforge.net
    Транслятор Shedskin C++
    Shedskin – это еще одна система, которая реализует нетрадиционный подход к выполнению программ на языке Python. Она преобразует ис
    ходный код на языке Python в исходный код на языке C++, который затем может быть скомпилирован в машинный код. Кроме того, эта система реализует платформонезависимый подход к выполнению про
    граммного кода Python. К моменту написания этих строк система
    Shedskin еще находилась на экспериментальной стадии развития и ог
    раничивала программы Python неявным использованием статических типов, что является ненормальным явлением для программ на языке
    Python, поэтому мы не будем углубляться в описание этой системы.
    Тем не менее, по предварительным результатам, у нее имеется нема
    лый потенциал, чтобы выиграть гонку за скоростью как у стандартной реализации Python, так и у расширения Psyco, и это весьма многообе
    щающий проект. Сведения о текущем состоянии проекта вы можете самостоятельно найти в Сети.
    Фиксированные двоичные файлы
    Иногда, когда пользователи спрашивают про «настоящий» компиля
    тор языка Python, в действительности они просто ищут способ созда

    Разновидности модели выполнения
    69
    вать из своих программ на языке Python самостоятельные исполняе
    мые файлы. Это необходимо скорее для упаковки и распространения программ, чем для их исполнения, но эти две стороны взаимосвязаны между собой. При помощи инструментов сторонних разработчиков, ко
    торые можно загрузить из Сети, вы можете превратить свои программы на языке Python в настоящие исполняемые файлы, которые в мире Py
    thon известны, как фиксированные двоичные файлы (frozen binaries).
    Фиксированные двоичные файлы объединяют в единый файл пакета байткод программ, PVM (интерпретатор) и файлы поддержки, необ
    ходимые программам. Существуют разные реализации такого подхо
    да, но в конечном результате получается единственный исполняемый файл (например, файл с расширением .exe в Windows), который легко можно передать заказчику. Такую модель можно представить, если на рис. 2.2 объединить байткод и PVM в единый компонент – фиксиро
    ванный двоичный файл.
    На сегодняшний день существует три основных инструмента создания фиксированных двоичных файлов: py2exe (для Windows), PyInstaller
    (напоминает py2exe, но также работает в Linux и UNIX и способен про
    изводить самоустанавливающиеся исполняемые файлы) и freeze (ори
    гинальная версия). Вам придется загружать эти инструменты отдельно от Python, но они распространяются совершенно бесплатно. Кроме то
    го, они постоянно развиваются, поэтому за дополнительной информа
    цией об этих инструментах обращайтесь на сайт проекта Python (http://
    www.python.org
    ) и Vaults of Parnassus (http://www.vex.net/parnassus/).
    Чтобы дать вам общее представление об области применения этих ин
    струментов, замечу, что py2exe может создавать автономные програм
    мы, использующие библиотеки Tkinter, PMW, wxPython и PyGTK для создания графического интерфейса; программы, использующие инст
    рументальные средства создания игр pygame; клиентские программы win32com и многие другие.
    Фиксированные двоичные файлы – это не то же самое, что получается в результате работы настоящего компилятора, потому что они выпол
    няют байткод с помощью виртуальной машины. Следовательно, про
    граммы в фиксированных двоичных файлах исполняются с той же скоростью, что и обычные файлы с исходными текстами программ,
    разве что улучшен способ их запуска. Фиксированные двоичные фай
    лы имеют немалый размер (они содержат в себе PVM), но по современ
    ным меркам их все же нельзя назвать необычно большими. Так как интерпретатор Python встроен непосредственно в фиксированные дво
    ичные файлы, его установка не является обязательным требованием для запуска программ на принимающей стороне. Более того, посколь
    ку программный код упакован в фиксированный двоичный файл, он надежно скрыт от получателя.
    Такая схема упаковки программ в единственный файл особенно подхо
    дит для нужд разработчиков коммерческого программного обеспечения.

    1   ...   5   6   7   8   9   10   11   12   ...   98


    написать администратору сайта