Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Виртуальная машина





Проблем с переносимостью программ не существовало, если бы процессоры имели одинаковый универсальный набор инструкций. Однако, как уже говорилось, добиться этого на аппаратном уровне не удалось из-за конкуренции фирм-производителей и прочих причин. Но такой процессор (виртуальную машину) вполне можно реализовать на программном уровне.

Имея в распоряжении виртуальную машину можно производить трансляцию в два этапа: сначала компилировать программу с языка высокого уровня в промежуточный машинный код виртуальной машины (т.н. байт-код [8]), после чего интерпретировать с байт-кода в машинные коды конкретного вычислителя. Разбивка процесса трансляции на два этапа приносит значительные преимущества.

Первый этап трансляции самый сложный в реализации и самый затратный по времени выполнения (из-за сложных абстракций исходного языка, см. выше). Второй этап существенно проще, поскольку байт-код существенно менее абстрактен, более компактен и приближен к машинному коду, поэтому интерпретаторы байт-кода (их же называют виртуальными машинами) гораздо проще и производительнее. Простота интерпретаторов байт-кода позволяет сравнительно легко и быстро разработать виртуальную машину для появившейся новой платформы.

Интересно, что компилятор первого этапа (из исходного кода в байт-код) написан на самом же компилируемом языке высокого уровня. Компилируется новая версия компилятора с помощью компилятора предыдущей версии (первая простая версия пишется на другом языке, например, на С). Такой рекурсивный метод разработки называется bootstrapping.

Таким образом, сложный компилятор первого этапа трансляции имеет единственную реализацию исходного кода[9], а не их множество (можно сказать: разрабатывается для единственной платформы). Кроссплатформенность обеспечивается написанием сравнительно небольших и несложных интерпретаторов байт-кода для разных платформ.

В гетерогенной системе применение байт-кода позволяет реализовать очень гибкие технологии. Например, откомпилированные в байт-код прикладные программы хранятся на сервере. При необходимости эти программы передаются по сети клиентам, где они выполняются (интерпретируются) на соответствующей виртуальной машине. Если на клиенте не установлена виртуальная машина, то она предварительно загружается по сети с сервера и устанавливается автоматически. Если добавляемый узел реализован на новой платформе, то достаточно зарегистрировать на сервере соответствующую виртуальную машину. Таким образом, удается полностью автоматизировать процесс адаптации новых узлов в гетерогенной системе.

Использование байт-кода позволяет элегантно решить не только проблему кроссплатформенности, но и проблему «многоязыковости». Достаточно, чтобы языки высокого уровня компилировались в байт-код. Полученные модули с байт-кодом компонуются в программу обычным способом независимо от того, на каких языках они были написаны изначально.

Упрощается также и задача разработчиков компиляторов языков высокого уровня. Теперь им не нужно разрабатывать компиляторы для каждой новой платформы, достаточно вести один проект для компиляции в байт-код. Кроссплатформенность обеспечивается виртуальными машинами.

Виртуальная машина или абстрактный процессор являются красивым и очень эффективным примером промежуточного (декомпозирующего) слоя, который позволяет не только увязывать между собой (и наращивать) разные технологии нижележащих подсистем, но и вышележащих.

Любопытно, что увязка производится на низком уровне абстракции – на уровне байт-кода, а не на языке высокого уровня (так же, как и в случае увязки модулей, откомпилированных в нативный машинный код, например DLL). Объяснение тому видится следующим. Байт-код, с одной стороны, существенно более прост, с другой стороны, менее нагляден и более громоздок из-за своих низкоуровневых конструкций. Простота байт-кода позволяет легче автоматизировать работу с ним, в частности, разработать интерпретатор. В свою очередь для интерпретатора (автомата), наглядность и громоздкость программы особой роли не играют. По-сути, абстрагирование, декомпозиция и пр. приемы важны только для разработчика, т. е. человека с его ограниченными возможностями одновременного восприятия большого объема информации.

Основной недостаток виртуальной машины – снижение производительности за счет интерпретации кода во время выполнения программы. Это те накладные расходы, которыми приходится расплачиваться за множество преимуществ. В большинстве случаев эти расходы пренебрежимо малы. Кроме того, разработаны способы, существенно ускоряющие выполнение байт-кода. Например, некоторые виртуальные машины не интерпретируют байт-код, а компилируют его «на лету» (JIT-компиляция, Just In Time) в машинные коды процессора. При следующем запуске программа уже не будет компилироваться, а будет запущена ее ранее откомпилированная версия, сохраненная в кэше. Известны также примеры аппаратной реализации виртуальных машин (Jazzele, ObjectCore, picoJava и пр.). Тем не менее, есть приложения, где медленное выполнение байт-кода не допустимо. Чаще всего – это встраиваемые системы реального времени.

Date: 2015-09-24; view: 573; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию