Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Сравнение виртуальных машин [ править ]

Машины JavaScript не включены. См. Список движков ECMAScript, чтобы найти их.

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

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

Управление памятью на этих портативных виртуальных машинах решается на более высоком уровне абстракции, чем на физических машинах. Некоторые виртуальные машины, такие как популярные виртуальные машины Java (JVM), связаны с адресами таким образом, что требуют безопасного автоматического управления памятью, позволяя виртуальной машине отслеживать ссылки на указатели и запрещая машинным инструкциям вручную создавать указатели на память. . Другие виртуальные машины, такие как LLVM, больше похожи на традиционные физические машины, позволяя напрямую использовать указатели и управлять ими. Общий промежуточный язык (CIL) предлагает гибрид между ними, позволяя как контролируемое использование памяти (например, JVM, которое позволяет безопасное автоматическое управление памятью), так и разрешающий `` небезопасный '' режим, который позволяет прямое манипулирование указателями способами, которые могут нарушать границы типов и разрешения. .

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

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

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

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

Общие библиотеки - это средство для повторного использования сегментов машинного кода в нескольких запущенных программах. В современных операционных системах это обычно означает использование виртуальной памяти для совместного использования страниц памяти, содержащих общую библиотеку, между различными процессами, которые защищены друг от друга с помощью защиты памяти.. Интересно, что агрессивные методы JIT, такие как адаптивная оптимизация, часто создают фрагменты кода, непригодные для совместного использования между процессами или последовательными запусками программы, требуя компромисса между эффективностью предварительно скомпилированного и совместно используемого кода и преимуществами адаптивно специализированного кода. Например, несколько положений CIL позволяют создавать эффективные совместно используемые библиотеки, возможно, за счет более специализированного кода JIT. Реализация JVM в OS X использует общий архив Java [3], чтобы обеспечить некоторые преимущества разделяемых библиотек.

Сравнение реализаций виртуальных машин приложений [ править ]

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

См. Также [ править ]

  • Виртуализация приложений
  • Привязка к языку
  • Интерфейс внешней функции
  • Соглашение о вызове
  • Изменение имени
  • Интерфейс прикладного программирования (API)
  • Бинарный интерфейс приложения (ABI)
  • Сравнение программного обеспечения для виртуализации платформ
  • Список движков ECMAScript
  • WebAssembly

Ссылки [ править ]

  1. ^ "Программа Java Community Process (SM) - JSR: запросы спецификации Java - деталь JSR # 292" . Jcp.org . Проверено 4 июля 2013 .
  2. ^ "JITRewrite - Parrot" . Trac.parrot.org . Проверено 4 июля 2013 .
  3. ^ Документы Apple об использовании общего архива Java в OS X
  4. ^ Инфраструктура компилятора LLVM , ohloh.net, 30 ноября 2011 г.
  5. ^ Valgrind , ohloh.net, 2011 30 ноября.