Лутц М. - Изучаем Python (1077325), страница 14
Текст из файла (страница 14)
Реализация 1гопРу1Ьоп позволяет программам на языке РуФЬоп играть роль как клиентских, так и серверных компонентов, доступных из других языков программирования .ХЕТ. Модель реализации 1гопРу(Ьоп очень напоминает ду(Ьоп (и фактически разрабатывается одним и тем же автором) — она подменяет два этапа на рис. 2.2 справа на эквиваленты среды .НЕТ. Как и ду1Ьоп, основной интерес 1гопРу1Ьоп представляет для разработчиков, которым необходима интеграция РуФЬоп с компонентами .Ь)ЕТ. Поскольку разработка ведется компанией М1сгово11, от 1гопРу1Ьоп, помимо прочего, можно было бы еще ожидать существенной оптимизации производительности.
К моменту написания этих строк реализация 1гопРу1Ьоп еще продолжала разрабатываться. За дополнительной информацией обращайтесь к ресурсам Ру1Ьоп или попробуйте самостоятельно поискать в Сети.' ду1Ьоп в 1гопРузЬоп — это полностью независимые реализации языка Ру1Ьоп, которые компилируют исходный программный код для различных архитектур времени выполнения. Из программ для СРу1Ьоп также можно получить доступ к программным компонентам дача и .МЕТ: например, системы дРуре и РугЬоп для .
ХЕТ позволяют коду, исполняемому интерпретатором СРусЬоп, обращаться к компонентам дача и .1хЕТ. 67 Разновидности модели выполнения Средства оптимизации скорости выполнения Все три реализации, СРу$1топ, ду$1топ и 1гопРуФЬоп, реализуют язык Ру$Ьоп похожими способами: исходный программный код компилируют в байт-код и выполняют полученный байт-код с помощью соответствующей виртуальной машины. Но кроме них существуют и другие реализации, включая динамический компилятор Рзусо и транслятор ЯЬес1зк1п С++, которые пытаются оптимизировать основную модель выполнения. Знание этих реализаций пока не является для вас обязательным, тем не менее краткий обзор их реализации модели выполнения поможет пролить свет на модель выполнения в целом.
Динамический компилятор Ряусо Система Рзусо — это не другая реализация языка РуФЬоп, а компонент, расширяющий модель выполнения байт-кода, что позволяет программам выполняться быстрее. В терминах схемы на рис. 2.2 Рэусо — это расширение РЧМ, которое собирает и использует информацию о типах, чтобы транслировать части байт-кода программы в истинный двоичный машинный код, который выполняется гораздо быстрее. Для такой трансляции не требуется вносить изменения в исходный программный код или производить дополнительную компиляцию в ходе разработки.
Грубо говоря, во время выполнения программы Рвусо собирает информацию о типах объектов, и затем эта информация используется для генерации высокоэффективного машинного кода, оптимизированного для объектов этого типа. После этого произведенный машинный код замещает соответствующие участки байт-кода и тем самым увеличивает скорость выполнения программы.
В результате при использовании Реусо существенно уменьшается общее время выполнения программы. В идеале некоторые участки программного кода под управлением Рзусо могут выполняться так же быстро, как скомпилированный код языка С. Поскольку эта компиляция из байт-кода производится во время выполнения программы, обычно Рзусо называют динамическим О1пзФ-!п-Ф1те, ЛТ) компилятором. Однако в действительности Рзусо немного отличается от ЛТ-компиляторов, которые, возможно, некоторые читатели видели в языке дача. В действительности Рзусо — это специализированный Л1Т-компилятор; он генерирует машинный код, оптимизированный для типов данных, которые фактически используются в программе. Например, если один и тот же участок программы использует различные типы данных в разное время, Рзусо может генерировать различные версии машинного кода для поддержки каждой из комбинаций.
Применение Реусо показывает существенное увеличение скорости выполнения программного кода Ру$Ьоп. Согласно информации, которая приводится на домашней странице проекта, Рвусо обеспечивает увеличение скорости «от 2 до 100 раз, обычно в 4 раза, при использовании немодифицированного интерпретатора Ру$Ьоп, неизменного исходного 68 Глава 2. Как Ругйоп запускает программы текста, всего лишь за счет использования динамически загружаемого модуля расширения на языке С». При прочих равных условиях, наибольший прирост скорости наблюдается для программного кода, реализующего различные алгоритмы на чистом языке Ру1Ьоп, — именно такой программный код обычно переносят на язык С с целью оптимизации.
При использовании Рвусо необходимость в таком переносе теряет свою остроту. До сих пор Рвусо не является стандартной частью Ру1Ьоп — его нужно загружать и устанавливать отдельно. Кроме того, он до сих пор находится на экспериментальной стадии развития, поэтому вам нужно будет следить за его разработкой. В действительности, когда я пишу эти строки, Рвусо все еще можно загрузить и установить, но похоже, что большая его часть будет поглощена более новым проектом «Руру», который представляет собой попытку переписать РУМ на языке Ру1Ьоп с целью обеспечения высокой степени оптимизации, как в Рвусо.
Пожалуй, самым большим недостатком Рвусо является то обстоятельство, что в настоящее время он способен генерировать машинный код только для архитектуры 1п1е1 х86, впрочем, на этой архитектуре работают такие операционные системы, как»т'1пс1очгв, 11ппх и даже Мас. За дополнительной информацией о расширении Рвусо и других попытках реализации «ПТ-компилятора обращайтесь на сайт /зттр://итгега.руИол.огл. Кроме того, вы можете посетить домашнюю страницу проекта Рвусо, которая в настоящее время размещается по адресу /«терс//рауео.аоигее/огяелег.
Транслятор 51зедвИп С++ ЯЬе«1в1«1п — это еще одна система, которая реализует нетрадиционный подход к выполнению программ на языке Ру1Ьоп. Она преобразует исходный код на языке Ру$Ьоп в исходный код на языке С++, который затем может быть скомпилирован в машинный код. Кроме того, эта система реализует платформонезависимый подход к выполнению программного кода Ру1Ьоп.
К моменту написания этих строк система БЬес1эх1п еще находилась на экспериментальной стадии развития и ограничивала программы Ру1Ьоп неявным использованием статических типов, что является ненормальным явлением для программ на языке Ру1Ьоп, поэтому мы не будем углубляться в описание этой системы. Тем не менее, по предварительным результатам, у нее имеется немалый потенциал, чтобы выиграть гонку за скоростью как у стандартной реализации Ру1Ьоп, так и у расширения Рвусо, и это весьма многообещающий проект.
Сведения о текущем состоянии проекта вы можете самостоятельно найти в Сети. Фиксированные двоичные файлы Иногда, когда пользователи спрашивают про «настоящий» компилятор языка Ру1Ьоп, в действительности они просто ищут способ созда- Разновидности модели выполнения 69 вать из своих программ на языке Ру1Ьоп самостоятельные исполняемые файлы. Это необходимо скорее для упаковки и распространения программ, чем для их исполнения, но эти две стороны взаимосвязаны между собой. При помощи инструментов сторонних разработчиков, которые можно загрузить из Сети, вы можете превратить свои программы на языке Ру(Ьоп в настоящие исполняемые файлы, которые в мире Ру1Ьоп известны, как фиксированные двоичные файлы (Ггозеп ЫпаНез). Фиксированные двоичные файлы объединяют в единый файл пакета байт-код программ, РЧМ (интерпретатор) и файлы поддержки, необходимые программам.
Существуют разные реализации такого подхода, но в конечном результате получается единственный исполняемый файл (например, файл с расширением .ехе в тЧ1пс)отче), который легко можно передать заказчику. Такую модель можно представить, если на рис. 2.2 объединить байт-код и РЧМ в единый компонент — фиксированный двоичный файл. На сегодняшний день существует три основных инструмента создания фиксированных двоичных файлов: ру2ехе (для ЧЧ)пс)отче), Ру1пз(а((ег (напоминает ру2ехе, но также работает в Б)ппх и ())ч)1Х и способен производить самоустанавливающиеся исполняемые файлы) и /геезе (оригинальная версия). Вам придется загружать эти инструменты отдельно от Ру(Ьоп, но они распространяются совершенно бесплатно.
Кроме того, они постоянно развиваются, поэтому за дополнительной информацией об этих инструментах обращайтесь на сайт проекта Ру(Ьоп (стерт// шшш ру(йоп.огу) и ЧаиИз о1 Рагпаазие (/ттгрт//шшш.оех.лез/рагпаззиз/). Чтобы дать вам общее представление об области применения этих инструментов, замечу, что ру2ехе может создавать автономные программы, использующие библиотеки Т)с(п$ег, РМЧЧ, тчхРуСЬоп и РуСТК для создания графического интерфейса; программы, использующие инструментальные средства создания игр рудалте; клиентские программы тч1п32сот и многие другие.
Фиксированные двоичные файлы — это не то же самое, что получается в результате работы настоящего компилятора, потому что они выполняют байт-код с помощью виртуальной машины. Следовательно, программы в фиксированных двоичных файлах исполняются с той же скоростью, что и обычные файлы с исходными текстами программ, разве что улучшен способ их запуска. Фиксированные двоичные файлы имеют немалый размер (они содержат в себе РЧМ), но по современным меркам их все же нельзя назвать необычно большими. Так как интерпретатор Ру(Ьоп встроен непосредственно в фиксированные двоичные файлы, его установка не является обязательным требованием для запуска программ на принимающей стороне. Более того, поскольку программный код упакован в фиксированный двоичный файл, он надежно скрыт от получателя.
Такая схема упаковки программ в единственный файл особенно подходит для нужд разработчиков коммерческого программного обеспечения. Глава 2. Как Ругйоп запускает программы Например, программа с графическим интерфейсом на базе Т)с)псег может быть упакована в исполняемый файл и распространятьея как самостоятельная программа на СП или через Интернет. Конечному пользователю не нужно будет устанавливать (и даже знать о том, что это такое) Ру1Ьоп, чтобы запустить распространяемую программу. Будущие возможности В заключение обратите внимание, что модель выполнения, обсуждавшаяся здесь, в действительности является лишь отражением текущей реализации интерпретатора Ру1Ьоп, но не самого языка программирования.