Сравнение программного обеспечения для виртуализации приложений
Эта статья нуждается в дополнительных цитатах для проверки . ( октябрь 2011 г. ) |
Программное обеспечение для виртуализации приложений относится как к виртуальным машинам приложений , так и к программному обеспечению, отвечающему за их реализацию. Виртуальные машины приложений обычно используются для обеспечения байт-кода переносимости приложения на различных компьютерных архитектурах и операционных системах. Приложение обычно запускается на компьютере с использованием интерпретатора или JIT- компиляции . Часто существует несколько реализаций одной виртуальной машины, каждая из которых охватывает свой набор функций.
Сравнение виртуальных машин
[ редактировать ]- Машины JavaScript не включены. Чтобы найти их, см. Список движков ECMAScript .
В таблице приведены элементы, для которых конструкции виртуальных машин должны быть эффективными, а не список возможностей, присутствующих в любой реализации.
Виртуальная машина | Модель машины | Управление памятью | Безопасность кода | Устный переводчик | ТОЧНО в срок | АОТ | Общие библиотеки | Общеязыковая объектная модель | Динамическая типизация |
---|---|---|---|---|---|---|---|---|---|
Среда выполнения Android (ART) | зарегистрироваться | автоматический | Да | Да | Да | Да | ? | Да | Да |
Общеязыковая среда выполнения (CLR) | куча | автоматический или ручной | Да | Да | Да | Да | Да | Да | Да |
Толкай ( Ад ) | зарегистрироваться | автоматический | Да | Да | Да | Да | Да | Да | Да |
DotGNU Portable.NET | куча | автоматический или ручной | Да | Да | Да | Да | Да | Да | Нет |
Виртуальная машина Java (JVM) | куча | автоматический | Да | Да | Да | Да | Да | Да | Да [1] |
ДжикесРВМ | куча | автоматический | Да | Да | Да | Да | ? | Да | Да |
ЛЛВМ | зарегистрироваться | руководство | Нет | Да | Да | Да | Да | Да | Нет |
Мононуклеоз | куча | автоматический или ручной | Да | Да | Да | Да | Да | Да | Да |
Попугай | зарегистрироваться | автоматический | Нет | Да | Нет [2] | Да | Да | Да | Да |
Далвик | зарегистрироваться | автоматический | Да | Да | Да | Нет | ? | Нет | Нет |
Скрип | куча | автоматический | Нет | Да | Да | Нет | Да | Нет | Да |
ЛУЧ ( Эрланг ) | зарегистрироваться | автоматический | ? | Да | Да | Да | Да | Да | Да |
МоарВМ | зарегистрироваться | автоматический | ? | Да | Да | Да | Да | Да | Да |
Инструкции виртуальной машины обрабатывают данные в локальных переменных, используя основную модель вычислений , обычно это стековая машина , регистровая машина или машина с произвольным доступом, часто называемая машиной памяти. Использование этих трех методов мотивировано различными компромиссами между виртуальными машинами и физическими машинами, такими как простота интерпретации, компиляции и проверки безопасности.
Управление памятью в этих портативных виртуальных машинах осуществляется на более высоком уровне абстракции, чем в физических машинах. Некоторые виртуальные машины, такие как популярные виртуальные машины Java (JVM), связаны с адресами таким образом, что требуют безопасного автоматического управления памятью, позволяя виртуальной машине отслеживать ссылки на указатели и запрещая машинным инструкциям вручную создавать указатели на память. . Другие виртуальные машины, такие как LLVM, больше похожи на традиционные физические машины, позволяя напрямую использовать указатели и манипулировать ими. Common Intermediate Language (CIL) предлагает гибрид между ними, позволяющий как контролируемое использование памяти (например, JVM, который обеспечивает безопасное автоматическое управление памятью), так и «небезопасный» режим, который позволяет напрямую манипулировать указателями способами, которые могут нарушать тип. границы и разрешение.
Безопасность кода обычно относится к способности портативной виртуальной машины запускать код, предлагая ей только предписанный набор возможностей. Например, виртуальная машина может разрешать коду доступ только к определенному набору функций или данных. Тот же контроль над указателями, который делает возможным автоматическое управление памятью и позволяет виртуальной машине обеспечить типобезопасный доступ к данным, используется для обеспечения того, чтобы фрагмент кода имел доступ только к определенным элементам памяти и не мог обходить саму виртуальную машину. Затем сверху накладываются другие механизмы безопасности, такие как верификаторы кода, верификаторы стека и другие методы.
Интерпретатор позволяет программам , состоящим из виртуальных инструкций, загружаться и запускаться немедленно без потенциально дорогостоящей компиляции в собственные машинные инструкции. Любая виртуальная машина, которую можно запустить, может быть интерпретирована, поэтому обозначение столбца здесь относится к тому, включает ли проект средства для эффективной интерпретации (для общего использования).
Компиляция «точно в срок» (JIT) относится к методу компиляции собственных инструкций в самое позднее время, обычно непосредственно перед запуском программы или во время него. Задача JIT заключается скорее в реализации, чем в проектировании виртуальных машин, однако в современных проектах начали учитываться соображения, повышающие эффективность. Простейшие методы JIT просто компилируются во фрагмент кода, аналогичный автономному компилятору. Однако часто используются более сложные методы, которые специализируют фрагменты скомпилированного кода на параметрах, известных только во время выполнения (см. Адаптивная оптимизация ).
Предварительная компиляция (AOT) относится к более классическому методу использования прекомпилятора для создания набора собственных инструкций, которые не изменяются во время выполнения программы. Поскольку агрессивная компиляция и оптимизация могут занять время, предварительно скомпилированная программа может запускаться быстрее, чем та, которая для выполнения использует только JIT. Реализации JVM уменьшили эти затраты на запуск за счет первоначальной интерпретации, чтобы ускорить время запуска до тех пор, пока JIT не сможет генерировать фрагменты собственного кода.
Общие библиотеки — это средство повторного использования сегментов собственного кода в нескольких запущенных программах. В современных операционных системах это обычно означает использование виртуальной памяти для совместного использования страниц памяти, содержащих общую библиотеку, между различными процессами, которые защищены друг от друга с помощью защиты памяти . Интересно, что агрессивные методы JIT, такие как адаптивная оптимизация, часто создают фрагменты кода, непригодные для совместного использования несколькими процессами или последовательными запусками программы, что требует компромисса между эффективностью предварительно скомпилированного и совместно используемого кода и преимуществами адаптивно специализированного кода. Например, в CIL предусмотрено несколько конструктивных решений, позволяющих создавать эффективные общие библиотеки, возможно, за счет более специализированного JIT-кода. Реализация JVM в OS X использует общий архив Java. [3] чтобы предоставить некоторые преимущества общих библиотек.
Сравнение реализаций виртуальных машин приложений
[ редактировать ]Помимо описанных выше портативных виртуальных машин, виртуальные машины часто используются в качестве модели выполнения отдельных языков сценариев, обычно с помощью интерпретатора. В этой таблице перечислены конкретные реализации виртуальных машин, как вышеупомянутых портативных виртуальных машин, так и виртуальных машин на языке сценариев.
Виртуальная машина | Языки | Комментарии | Устный переводчик | ТОЧНО в срок | Язык реализации | SLoC |
---|---|---|---|---|---|---|
Общеязыковая среда выполнения (CLR) | C# , C++/CLI , F# , VB.NET | байт-код — CIL ; Среда выполнения .NET Core на GitHub | Нет | Да | С#, С++ | |
Adobe Flash Player (он же Тамарин ) | ActionScript , SWF (формат файла) | интерактивный инструмент веб-разработки. байт-код называется «Байт-код ActionScript (.abc)». | Да | Да | С++ | 135 тыс. (первоначально выпущено) |
Толкай ( Ад ) | Лимбо | Спецификация виртуальной машины Dis | Да | Да | С | 15 тыс. + 2850 за JIT-архив + 500 за ОС хоста |
DotGNU - Portable.NET | Языки CLI , включая: C#. | Клон общеязыковой среды выполнения | Нет | Да | С, С# | |
Форт | Форт | Функции упрощены и обычно включают ассемблер, компилятор, интерпретаторы текстового и двоичного уровня, иногда редактор, отладчик и ОС. Скорость компиляции составляет >20 SKLOC/с и ведет себя почти как JIT. | Да | Нет | Форт, Форт-ассемблер | от 2,8К до 5,6К; продвинутые, профессиональные реализации меньше. |
Глулкс | Информ 6, Информ 7, другие | Да | Нет | Существуют различные реализации | ||
ХХВМ | PHP , Взлом | Это виртуальная машина с открытым исходным кодом, предназначенная для выполнения программ, написанных на Hack и PHP. | Да | Да | С++, OCaml | |
Икона | Икона | Базовый исходный код предоставляет как интерпретатор, так и неподдерживаемую версию для компиляции в C. Код времени выполнения, совместно используемый компилятором и интерпретатором, написан на варианте C, называемом RTT. | Да | Нет | C, RTT (специальный интерфейс для C, поставляемый с базовым исходным кодом для Icon). | ~180 тысяч всего. (источник в байт-код: ~11 КБ, интерпретатор байт-кода: ~ 46 КБ, iconc: ~ 23 КБ, общие/заголовки: ~ 13 КБ, rtt: ~ 15 КБ) |
JVM | Java , Kotlin , Jython , Groovy , JRuby , C , C++ , Clojure , Scala и некоторые другие. | Эталонная реализация от Sun; OpenJDK : код под лицензией GPL ; IcedTea : код и инструменты под лицензией GPL | Да | Да | JDK , OpenJDK и IcedTea с обычным JIT: Java, C, C++, ASM; IcedTea с «нулевым» JIT: Java, C, C++ | JVM составляет около 6500 тыс. строк; TCK — это 80 тысяч тестов и около 1000 тысяч строк. |
ЛЛВМ | C , C++ , Kotlin , Objective-C , Swift , Ada , Fortran и Rust | Поддерживаются выходные данные MSIL, C и C++. Вывод байт-кода ActionScript поддерживается Adobe Alchemy. байт-код называется «Байт-код LLVM (.bc)». сборка называется «Язык ассемблера LLVM (*.ll)». | Да | Да | С++ | 811 тыс. [4] |
Два | Два | Да | ИгратьДополнительно | С | 13к + 7к ЛуаЖИТ | |
ММИКС | ММИКСАЛ | |||||
Мононуклеоз | Языки CLI , включая: C# , VB.NET , IronPython , IronRuby и другие. | Клон общеязыковой среды выполнения | Да | Да | С#, С | 2332к |
НекоВМ | в настоящее время Неко и Хаксе | Да | только x86 | С | 46 тыс. | |
Оз | Оз, Элис | |||||
машина О-кода | БКПЛ | |||||
машина p-кода | Паскаль | UCSD Pascal, широко распространенный в конце 70-х, включая Apple II. | Да | Нет | ассемблер, Паскаль | |
Попугай | Perl 5 , Raku , NQP-rx, PIR , PASM , PBC , BASIC , bc , C99 , ECMAScript , Lisp , Lua , m4 , Tcl , WMLScript , XML и другие. | Да | Да | С, Перл | 111К С, 240К Перл | |
Перл виртуальная машина | Перл | опкодов обходчик дерева | Да | Нет | С, Перл | 175К С, 9К Перл |
CPython | Питон | Да | С | 387k C, 368k Python, 10k ASM, 31k Psyco | ||
PyPy | Питон | Автономная реализация Python, следующее поколение Psyco | Да | Да | Питон | |
Рубиниус | Руби | Виртуальная машина для другой реализации Ruby. | Да | Да | С++, Руби | |
Сильверлайт | С# , VB.NET | Микроверсия Microsoft .NET Framework, позволяющая запускать приложения в изолированной программной среде внутри браузера. | Да | Да | С++ | 7 МБ (первоначально выпущено) |
СкуммВМ | Скамм | Движок компьютерной игры | ||||
SECD | ISWIM , Лиспкит Лисп | |||||
Белка | Белка | Да | Белка_JIT | С++ | 12 тыс. | |
Смолток | Смолток | |||||
SQLite | SQLite-коды операций | Механизм виртуальной базы данных | ||||
Скрип | Писк | Самостоятельная реализация виртуальной машины Squeak. Богатая мультимедийная поддержка. | Да | Ког и Экзюпери | Smalltalk/Сленг | 110 тыс. Смоллток, ~300 тыс. С |
SWI-Пролог | Пролог: SWI-Пролог , YAP | Да | Нет | C, SWI-Пролог | ||
TraceMonkey | JavaScript | На основе Тамарина | Нет | Да | С++ | 173 тыс. |
TrueType | TrueType | Механизм рендеринга шрифтов | Да | Нет | С (обычно) | |
Избирательные ворота | x86 / x86-64 двоичные файлы | Проверка доступа и утечек памяти под Linux | С | 467 тыс. [5] | ||
VisualWorks | Смолток | Нет | Да | С | ||
Vx32 виртуальная машина | x86 двоичные файлы | Виртуализация на уровне приложения для машинного кода | Нет | Да | ||
Он был | Виртуальная машина для небольших устройств, похожая на Java | |||||
Еще одна виртуальная машина Ruby ( YARV ) | Руби | Виртуальная машина эталонной реализации для Ruby 1.9 и более новых версий | Да | Да | С | |
Z-машина | Z-код | |||||
Зенд-движок | PHP | Да | Нет | С | 75 тыс. |
См. также
[ редактировать ]- Виртуализация приложений
- Языковая привязка
- Внешний функциональный интерфейс
- Соглашение о вызовах
- Искажение имени
- Интерфейс прикладного программирования (API)
- Бинарный интерфейс приложения (ABI)
- Сравнение программного обеспечения для виртуализации платформ
- Список движков ECMAScript
- Веб-сборка
Ссылки
[ редактировать ]- ^ «Программа Java Community Process (SM) — JSR: запросы спецификаций Java — подробно JSR № 292» . Jcp.org . Проверено 4 июля 2013 г.
- ^ «JITRewrite – Попугай» . Trac.parrot.org . Проверено 4 июля 2013 г.
- ^ Документы Apple по использованию OS X общего архива Java.
- ^ Инфраструктура компилятора LLVM. Архивировано 31 июля 2012 г. на Wayback Machine , ohloh.net, 30 ноября 2011 г.
- ↑ Valgrind , ohloh.net, 30 ноября 2011 г.