Лутц М. - Изучаем Python (1077325), страница 13
Текст из файла (страница 13)
Компиляция — это просто этап перевода программы, а байт-код — это низкоуровневое, платформонезависимое представление исходного текста программы. РуФЬоп транслирует каждую исходную инструкцию в группы инструкций байт-кода, разбивая ее на отдельные составляющие. Такая трансляция в байт-код производится для повышения скорости — байт-код выполняется намного быстрее, чем исходные инструкции в текстовом файле. В предыдущем параграфе вы могли заметить фразу — практически незаметно для вас.
Если интерпретатор Руь)топ на вашем компьютере обладает правом записи, он будет сохранять байт-код вашей программы в виде файла с расширением .рус («.рус» — это компилированный исходный файл «.ру»). Вы будете обнаруживать эти файлы после запуска программ по соседству с файлами, содержащими исходные тексты (то есть в том же каталоге). Интерпретатор сохраняет байт-код для ускорения запуска программ. В следующий раз, когда вы попробуете запустить евою программу, РуФ)топ загрузит файл .рус и минует этап компиляции — при условии, что исходный текст программы не изменялся с момента последней компиляции. Чтобы определить, необходимо ли выполнять перекомпиляцию, Руь)топ автоматически сравнит время последнего изменения файла с исходным текстом и файла с байт-кодом.
Если исходный текст сохранялся на диск после компиляции, при следующем его запуске интерпретатор автоматически выполнит повторную компиляцию программы. Если Ру1)топ окажется не в состоянии записать файл с байт-кодом на диск, программа от этого не пострадает, просто байт-код будет сгенерирован в памяти и уничтожен по завершении программы.' Однако, поскольку файлы .рус повышают скорость запуска программы, вам может потребоваться иметь возможность сохранять их, особенно для больших программ. Кроме того, файлы с байт-кодом — это еще один из Строго говоря, байт-кол сохраняется только для импортируемых файлов, но не для файла самой программы.
Об импорте мы поговорим в главе 3 и снова вернемся к нему в части ту. Байт-код также никогда не сохраняется для инструкций, введенных в интерактивном режиме, который описывается в главе 3. 63 Выполнение программы способов распространения программ на языке Ругпоп. Интерпретатор запустит файл .рус, даже если нет оригинальных файлов с исходными текстами. (В разделе «Фиксированные двоичные файлы» описывается еще один способ распространения программ.) Виртуальная машина Ру1Ьоп (РЧМ) Как только программа будет скомпилирована в байт-код (или байт-код будет загружен из существующих файлов .рус), он передается универсальному механизму под названием виртуальная машина РуФЬоп (РЧМ вЂ” для любителей аббревиатур). Аббревиатура РЧМ выглядит более внушительно, чем то, что за ней стоит на самом деле, — это не отдельная программа, которую требуется устанавливать.
Фактически, РЧМ вЂ” это просто большой цикл, который выполняет перебор инструкций в байт-коде, одну за одной, и выполняет соответствующие им операции. РЧМ вЂ” это механизм времени выполнения, она всегда присутствует в составе системы РуФЬоп, и это тот самый программный компонент, который выполняет ваши сценарии. Формально — это последняя составляющая того, что называют «интерпретатором Ру»Ьоп». На рис. 2.2 показана последовательность действий, которая описывается здесь. Не забывайте, что все эти сложности преднамеренно спрятаны от программистов.
Компиляция в байт-код производится автоматически, а РЧМ вЂ” это всего лишь часть системы Ру»Ьоп, которую вы установили на свой компьютер. Повторю еще раз, что программисты просто создают программный код на языке Руепоп и запускают файлы с инструкциями. Рис.2.2. Традиционная модель выполнения программ на языке Ругйопг исходный текст, который вводится программистом, транслируется в Оийт.
код, который затем исполняется виртуальной машиной Ругйоп. Исходный текст автоматически компилируется и затем интерпретируется Производительность Читатели, имеющие опыт работы с компилирующими языками программирования, такими как С и С++, могут заметить несколько отличий в модели выполнения Ру$)гоп. Первое, что бросается в глаза, — это отсутствие этапа сборки, или вызова утилиты атаКе»: программный код может запускаться сразу же, как только будет написан. Второе отличие: байт-код не является двоичным машинным кодом (например, 64 Глава 2. Как РутЬоп запускает программы инструкциями для микропроцессора 1п$е1). Байт-код — это внутреннее представление программ на языке Ру$Ьоп.
По этой причине программный код на языке РуФЬоп не может выполняться так же быстро, как программный код на языке С или С++, о чем уже говорилось в главе 1. Обход инструкций выполняет виртуальная машина, а не микропроцессор, и чтобы выполнить байт-код, необходима дополнительная интерпретация, инструкции которого требуют на выполнение больше времени, чем машинные инструкции микропроцессора.
С другой стороны, в отличие от классических интерпретаторов, здесь присутствует дополнительный этап компиляции — интерпретатору не требуется всякий раз снова и снова анализировать инструкции исходного текста. В результате РуФЬоп способен обеспечить скорость выполнения где-то между традиционными компилирующими н традиционными интерпретирующими языками программирования.
Подробнее о проблеме производительности рассказывается в главе 1. Скорость разработки С другой стороны, в модели выполнения РуФЬоп отсутствуют различия между средой разработки и средой выполнения. 'Го есть системы, которые компилируют и выполняют исходный текст, — это суть одна и та же система. Для читателей, имеющих опыт работы с традиционными компилирующими языками, это обстоятельство может иметь некоторое значение, но в РуФЬоп компилятор всегда присутствует во время выполнения и является частью механизма, выполняющего программы.
Это существенно увеличивает скорость разработки. Не нужно всякий раз выполнять компиляцию и связывание программ, прежде чем запустить их, — вы просто вводите исходный текст и запускаете его. Это также придает языку некоторый динамизм — вполне возможно, а нередко и удобно, когда программы на языке РуФоп создаются и выполняются другими программами Ру1Ьоп во время выполнения. Например, встроенные инструкции еэа1 и ехес принимают и выполняют строки, содержащие программный код на языке РуФЬоп.
Благодаря такой возможности РуФЬоп может использоваться для настройки продуктов— программный код РуФЬоп может изменяться «на лету», а пользователи могут изменять части системы, написанные на языке РуФЬоп, без нсобходимости перекомпилировать систему целиком.
Имейте в виду, если смотреть с более фундаментальных позиций, то все, что имеется в РутЬоп, работает на этапе времени выполнения — здесь полностью отсутствует этап предварительной компиляции, все, что необходимо, производится во время выполнения программы. Сюда относятся даже такие операции, как создание функций и классов и связывание модулей. Эти события в более статичных языках происходят перед выполнением, но в программах на языке РуФЬоп происходят во время выполнения. В результате процесс программирования приобретает больший динамизм, чем тот, к которому привыкли некоторые читатели.
Разновидности модели выполнения Разновидности модели выполнения Прежде чем двинуться дальше, я должен заметить, что внутренний поток выполнения, описанный в предыдущем разделе, отражает современную стандартную реализацию интерпретатора Ру(Ьоп, которая в действительности не является обязательным требованием самого языка Ру1Ьоп. Вследствие этого модель выполнения склонна изменяться с течением времени. Фактически уже существуют системы, которые несколько меняют картину, представленную на рис. 2.2. Давайте потратим несколько минут, чтобы ознакомиться с наиболее заметными изменениями. Альтернативные реализации РуФол В то время, когда я писал эту книгу, существовали три основные альтернативные реализации языка Ру1Ьоп — СРут)зол, гауз)зоп и 1гопРут)топ, а также несколько второстепенных реализаций, таких как ЯтасЫевэ Руз)топ.
В двух словах: СРуСЬоп — это стандартная реализация, а все остальные создавались для специфических целей и задач. Все они реализуют один и тот же язык Ру1Ьоп, но выполняют программы немного по-разному. СРу11зоп Оригинальная и стандартная реализация языка Ру1Ьоп обычно называется СРу1Ьоп, особенно когда необходимо подчеркнуть ее отличие от двух других альтернатив.
Это название происходит из того факта, что реализация написана на переносимом языке АЫЯ1 С. Это тот самый Ру1Ьоп, который вы загружаете с сайта ЬГГру(шшш рут)топ.огц, получаете в составе дистрибутива Ас(1чеРу1Ьоп и который присутствует в большинстве систем 1 1пих и Мас ОБ Х. Если вы обнаружили у себя предварительно установленную версию Ру(Ьоп, то более чем вероятно, что это будет СРу1Ьоп, — при условии, что ваша компания не использует какую-то специфическую версию. Если вы не предполагаете создавать приложения на дача или для платформы .1чЕТ, возможно, вам следует отдать предпочтение стандартной реализации СРу1Ьоп.
Поскольку это эталонная реализация языка, она, как правило, работает быстрее, устойчивее и лучше, чем альтернативные системы. Рисунок 2.2 отражает модель выполнения СРу1Ьоп. зух11оп Интерпретатор )у(Ьоп (первоначальное название — )Ру1Ьоп) — это альтернативная реализация языка Ру1Ьоп, основная цель которой — тесная интеграция с языком программирования дача. Реализация )у1Ьоп состоит из )ача-классов, которые выполняют компиляцию программного кода на языке Ру1Ьоп в байт-код Ъача и затем передают полученный байт-код виртуальной машине дача ()ача Ч1г$иа1 МасЫпе, ЮЧМ).
Программист помещает инструкции на языке Ру$Ьоп в текстовые файлы 66 Глава 2. Как Ру1Ьоп запускает программы как обычно, а система дуФЬоп подменяет два расположенных на рис. 2. 2 справа этапа на эквиваленты языка дача, Цель ду1Ьоп состоит в том, чтобы позволить программам на языке Ру1Ьоп управлять дача-приложениями, точно так же, как СРу(Ьоп может управлять компонентами на языках С и С++.
Эта реализация имеет бесшовную интеграцию с дача. Поскольку программный код на языке РуФЬоп транслируется в байт-код дача, во время выполнения он ведет себя точно так же, как настоящая программа на языке дача. Сценарии на языке дуФЬоп могут выступать в качестве апплетов и сервлетов, создавать графический интерфейс с использованием механизмов дача и т. д. Более того, ду1Ьоп обеспечивает поддержку возможности импортировать и использовать дача-классы в программном коде Ру1Ьоп. Тем не менее, поскольку реализация ду1Ьоп обеспечивает более низкую скорость выполнения и менее устойчива по сравнению с СРуФЬоп, она представляет интерес скорее для разработчиков программ на языке дача, которым необходим язык сценариев в качестве интерфейса к дача-коду. 1ГОПРУФОП Третья (и, к моменту написания этих строк, самая новая) реализация языка Ру1Ьоп — это 1гопРуФЬоп.
Она предназначена для обеспечения интеграции программ Ру1Ьоп с приложениями, созданными для работы в среде М1сгово11 .ЫЕТ Ргатпечгог)с операционной системы %1пс)отче, а также в Мопо — открытом эквиваленте для 1 зппх. Платформа .НЕТ и среда выполнения языка С№ предназначены для обеспечения взаимодействий между программными объектами — независимо от используемого языка программирования, в духе более ранней модели СОМ компании М1сгово11.