Сравнение программного обеспечения для виртуализации приложений - Comparison of application virtualization software

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

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

JavaScript машины в комплект не входят. Видеть Список движков ECMAScript найти их.

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

Виртуальная машинаМодель машиныУправление памятьюБезопасность кодаУстный переводчикJITАОТОбщие библиотекиОбщий язык Объектная модельДинамический набор текста
Android Runtime (ИЗОБРАЗИТЕЛЬНОЕ ИСКУССТВО)регистравтоматическийдададада?дада
общеязыковая среда выполнения (CLR)кучаавтоматический или ручнойдадададададада
Дис (Inferno )регистравтоматическийдадададададада
DotGNU Portable.NETкучаавтоматический или ручнойдадададададаНет
Виртуальная машина Java (JVM)кучаавтоматическийдадададададада[1]
JikesRVMкучаавтоматическийдададада?дада
LLVMрегистрруководствоНетдададададаНет
Мононуклеозкучаавтоматический или ручнойдадададададада
ПопугайрегистравтоматическийНетдаНет[2]дададада
ДальвикрегистравтоматическийдададаНет?НетНет
ПисккучаавтоматическийНетдадаНетдаНетда
ЛУЧ (Erlang )регистравтоматический?дададададада
MoarVMрегистравтоматический?дададададада

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

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

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

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

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

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

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

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

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

Виртуальная машинаЯзыкиКомментарииУстный переводчикJITЯзык реализацииSLoC
общеязыковая среда выполнения (CLR)C #, C ++ / CLI, F #, VB.NETбайт-код CIL; .NET Core Runtime на GitHubНетдаC #, C ++
Adobe Flash Player (он же Тамарин )ActionScript, SWF (формат файла)интерактивный инструмент веб-разработки. байт-код называется «Байт-код ActionScript (.abc)».дадаC ++135k (изначально выпущено)
Дис (Inferno )ЛимбоСпецификация виртуальной машины DisдадаC15k + 2850 на JIT-арку + 500 на хост-ОС
DotGNU -Portable.NETЯзыки интерфейса командной строки включая: C #Клон Common Language RuntimeНетдаC, C #
ЧетвертыйЧетвертыйФункции упрощены, обычно включают ассемблер, компилятор, интерпретаторы текстового и двоичного уровней, иногда редактор, отладчик и ОС. Скорость компиляции составляет> 20 SKLOC / с и ведет себя как JIT.даНетФорт, Форт Ассемблер2,8–5,6 тыс. продвинутые профессиональные реализации меньше по размеру.
GlulxИнформ 6, Информ 7, другиедаНетСуществуют различные реализации
HHVMPHP, ВзломатьЭто виртуальная машина с открытым исходным кодом, предназначенная для выполнения программ, написанных на Hack и PHP.дадаC ++, OCaml
ЗначокЗначокБазовый исходный код предоставляет как интерпретатор, так и неподдерживаемую версию для компиляции в C. Код времени выполнения, который совместно используется компилятором и интерпретатором, написан на варианте C, называемом RTT.даНетC, RTT (пользовательский интерфейс для C, поставляемый с базовым исходным кодом для Icon).~ 180к итого. (источник в байт-код: ~ 11k, интерпретатор байт-кода: ~ 46k, iconc: ~ 23k, общие / заголовки: ~ 13k, rtt: ~ 15k)
JVMЯва, Котлин, Jython, Groovy, JRuby, C, C ++, Clojure, Scala и несколько другихЭталонная реализация Sun; OpenJDK: код под GPL  ; Чай со льдом: код и инструменты под GPLдадаJDK, OpenJDK & Чай со льдом с обычным JIT: Java, C, ASM; Чай со льдом с "нулевым" JIT: Java, CJVM составляет около 6500 тыс. Строк; TCK это 80к тестов и около 1000к строк
LLVMC, C ++, Котлин, Цель-C, Быстрый, Ада, Фортран, и РжавчинаПоддерживается вывод MSIL, C и C ++. Вывод байтового кода ActionScript поддерживается Adobe Alchemy. Байт-код называется «Байт-код LLVM (.bc)». сборка называется "Язык ассемблера LLVM (* .ll)".дадаC ++811 тыс. [4]
LuaLuaдаLuaJITC13k + 7k LuaJIT
MMIXMMIXAL
МононуклеозЯзыки интерфейса командной строки включая: C #, VB.NET, IronPython, IronRuby, и другиеКлон Common Language RuntimeдадаC #, C2332 тыс.
УнцияОз, Алиса
НекоВМВ данный момент Неко и Haxeдатолько x86C46 тыс.
О-код машинаBCPL
машина p-кодаПаскальUCSD Pascal, широко распространенный в конце 70-х, включая Apple II
ПопугайPerl 5, Раку, NQP-RX, PIR, ПАСМ, КПБ, БАЗОВЫЙ, до н.э, C99, ECMAScript, Лисп, Lua, м4, Tcl, WMLScript, XML, и другиедадаC, Perl111k C, 240k Perl
Виртуальная машина PerlPerlкод операции ходок по деревьямдаНетC, Perl175k C, 9k Perl
CPythonPythonдаPsycoC387k C, 368k Python, 10k ASM, 31k Psyco
PyPyPythonСамостоятельный хостинг реализация Python, следующего поколения PsycoдадаPython
РубиниусРубинВиртуальная машина для другой реализации RubyдадаC ++, Ruby
SilverlightC #, VB.NETМикроверсия Microsoft .NET Framework, позволяющая приложениям работать в изолированной среде браузера.дадаC ++7 МБ (изначально выпущено)
ScummVMПодонокКомпьютерный игровой движок
SECDЯ ПЛАВАЮ, Лиспкит Лисп
БелкаБелкадаБелка_JITC ++12k
БолтовняБолтовня
SQLiteКоды операций SQLiteВиртуальный движок базы данных
ПискПиск БолтовняСамостоятельный хостинг реализация виртуальной машины Squeak. Богатая мультимедийная поддержка.даCog & ExuperySmalltalk / Сленг110 КБ Smalltalk, ~ 300 КБ
TraceMonkeyJavaScriptНа основе ТамаринНетдаC ++173 тыс.
TrueTypeTrueTypeМеханизм визуализации шрифтовдаНетC (обычно)
Валгриндx86 /x86-64 двоичные файлыПроверка доступа к памяти и утечек под LinuxC467 тыс. [5]
VisualWorksБолтовняНетдаC
Vx32 виртуальная машинаx86 двоичные файлыВиртуализация на уровне приложений для машинного кодаНетда
WabaВиртуальная машина для небольших устройств, похожая на Ява
Еще одна Ruby VM (YARV )РубинВиртуальная машина эталонной реализации для Рубин 1.9 и новее версиидадаC
Z-машинаZ-код
Zend EnginePHPдаНетC75 тыс.

Смотрите также

Рекомендации

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