Программное обеспечение виртуализации приложений относится как к приложениям виртуальным машинам, так и к программному обеспечению отвечает за их выполнение. Виртуальные машины приложений обычно используются, чтобы позволить приложению байт-код работать переносимо на многих различных компьютерных архитектурах и операционных системах. Приложение обычно запускается на компьютере с использованием интерпретатора или своевременной компиляции (JIT). Часто существует несколько реализаций данной виртуальной машины, каждая из которых покрывает свой набор функций.
В таблице приведены элементы, для которых конструкция виртуальных машин должна быть эффективной, а не список возможностей, имеющихся в любой реализации.
Виртуальная машина | Модель машины | Управление памятью | Безопасность кода | Интерпретатор | JIT | AOT | Общие библиотеки | Общий язык Объектная модель | Динамический набор |
---|---|---|---|---|---|---|---|---|---|
Android Runtime (ART) | регистр | автоматический | Да | Да | Да | Да | ? | Да | Да |
Common Language Runtime (CLR) | стек | автоматический или ручной | Да | Да | Да | Да | Да | Да | Да |
Dis (Inferno ) | регистр | автоматический | Да | Да | Да | Да | Да | Да | Да |
DotGNU Portable.NET | стек | автоматический или ручной | Да | Да | Да | Да | Да | Да | Нет |
Виртуальная машина Java (JVM) | стек | автоматически | Да | Да | Да | Да | Да | Да | Да |
JikesRVM | стек | автоматический | Да | Да | Да | Да | ? | Да | Да |
LLVM | регистр | вручную | Нет | Да | Да | Да | Да | Да | Нет |
Монохромный | стек | автоматически или вручную | Да | Да | Да | Да | Да | Да | Да |
Регистр Parrot | автоматический | Нет | Да | No | Да | Да | Да | Да | |
Регистр Dalvik | автоматический | Да | Да | Да | Нет | ? | Нет | Нет | |
Писк | стек | автоматически | Нет | Да | Да | Нет | Да | Нет | Да |
BEAM (Эрланг ) | регистр | автоматический | ? | Да | Да | Да | Да | Да | Да |
MoarVM | регистр | автоматический | ? | Да | Да | Да | Да | Да | Да |
Инструкции виртуальной машины обрабатывают данные в локальных переменных с использованием основной модели com размещение, обычно такое из стековой машины, регистровой машины или машины с произвольным доступом, часто называемой машиной памяти. Использование этих трех методов мотивировано различными компромиссами между виртуальными и физическими машинами, такими как простота интерпретации, компиляции и проверки безопасности.
Управление памятью в этих портативных виртуальных машинах решается на более высоком уровне абстракции, чем на физических машинах. Некоторые виртуальные машины, такие как популярные виртуальные машины Java (JVM), связаны с адресами таким образом, что требуют безопасного автоматического управления памятью, позволяя виртуальной машине отслеживать ссылки на указатели и запрещая машинные инструкции от ручного построения указателей на память. Другие виртуальные машины, такие как LLVM, больше похожи на традиционные физические машины, позволяя напрямую использовать указатели и управлять ими. Common Intermediate Language (CIL) предлагает гибрид между ними, позволяя как контролируемое использование памяти (например, JVM, которое обеспечивает безопасное автоматическое управление памятью), так и допускающий «небезопасный» режим, который позволяет напрямую манипулировать указателем способами, которые могут нарушить границы типов и разрешения.
Безопасность кода обычно относится к способности портативной виртуальной машины запускать код, предлагая ей только предписанный набор возможностей. Например, виртуальная машина может разрешить коду доступ только к определенному набору функций или данных. Те же элементы управления указателями, которые делают возможным автоматическое управление памятью и позволяют виртуальной машине обеспечивать безопасный доступ к данным, используются для гарантии того, что фрагмент кода разрешен только для определенных элементов памяти и не может обойти саму виртуальную машину. Затем наверху накладываются другие механизмы безопасности, такие как верификаторы кода, верификаторы стека и другие методы.
Интерпретатор позволяет программам, созданным из виртуальных инструкций, загружаться и запускаться немедленно без потенциально дорогостоящей компиляции в машинные инструкции. Любая виртуальная машина, которая может быть запущена, может быть интерпретирована, поэтому обозначение столбца здесь указывает на то, включает ли проект положения для эффективной интерпретации (для общего использования).
Своевременная компиляция (JIT) относится к методу компиляции в собственные инструкции в самое позднее время, обычно непосредственно перед или во время выполнения программы. Проблема JIT больше связана с реализацией, чем с проектированием виртуальных машин, однако современные разработки стали учитывать соображения, повышающие эффективность. Простейшие методы JIT просто компилируются в фрагмент кода, аналогичный автономному компилятору. Однако часто используются более сложные методы, которые приспосабливают фрагменты скомпилированного кода к параметрам, известным только во время выполнения (см. Адаптивная оптимизация ).
Компиляция с опережением времени (AOT) относится к более классическому методу использования прекомпилятора для генерации набора собственных инструкций, которые не изменяются во время выполнения программы. Поскольку агрессивная компиляция и оптимизация могут занять время, предварительно скомпилированная программа может запускаться быстрее, чем программа, для выполнения которой используется только JIT. Реализации JVM уменьшили эту стоимость запуска за счет начальной интерпретации для ускорения времени запуска до тех пор, пока JIT не сможет сгенерировать фрагменты собственного кода.
Общие библиотеки - это средство для повторного использования сегментов собственного кода в нескольких запущенных программах. В современных операционных системах это обычно означает использование виртуальной памяти для совместного использования страниц памяти, содержащих общую библиотеку, между различными процессами, которые защищены друг от друга с помощью защиты памяти. Интересно, что агрессивные методы JIT, такие как адаптивная оптимизация, часто создают фрагменты кода, непригодные для совместного использования между процессами или последовательными запусками программы, требуя компромисса между эффективностью предварительно скомпилированного и совместно используемого кода и преимуществами адаптивно специализированного кода. Например, несколько положений CIL позволяют создавать эффективные совместно используемые библиотеки, возможно, за счет более специализированного кода JIT. Реализация JVM в OS X использует общий архив Java для обеспечения некоторых преимуществ общих библиотек.
Помимо переносимых виртуальных машин, описанных выше, виртуальные машины часто используются в качестве модели исполнения для отдельных языков сценариев, обычно с помощью интерпретатора. В этой таблице перечислены конкретные реализации виртуальных машин, как перечисленных выше портативных виртуальных машин, так и виртуальных машин на языке сценариев.
Виртуальная машина | Языки | Комментарии | Интерпретатор | JIT | Язык реализации | SLoC |
---|---|---|---|---|---|---|
Common Language Runtime (CLR) | C#, C ++ / CLI, F#, Байт-код VB.NET | - CIL ;.NET Core Runtime на GitHub | Нет | Да | C #, C ++ | |
Adobe Flash Player (он же Tamarin ) | ActionScript, SWF (формат файла) | интерактивный инструмент веб-разработки. Байт-код называется «Байт-код ActionScript (.abc)» | Да | Да | C ++ | 135k (изначально выпущено) |
Dis (Inferno ) | Limbo | Спецификация виртуальной машины Dis | Да | Да | C | 15k + 2850 на JIT-архитектуру + 500 на хост ОС |
DotGNU - Portable.NET | языки интерфейса командной строки включая: C# | клон среды CLI | Нет | Да | C, C # | |
Forth | Forth | Функции упрощены, обычно включают ассемблер, компилятор, текстовый и двоичный интерпретаторы уровня, иногда редактор, отладчик и ОС. Скорость компиляции составляет>20 SKLOC / S и ведет себя во многом как JIT. | Да | Нет | Forth, Forth Assembler | от 2,8K до 5,6K; расширенные профессиональные реализации меньше. |
Glulx | Inform 6, Inform 7, другие | Да | Нет | Существуют различные реализации | ||
HHVM | PHP, Hack | Является открытым - исходная виртуальная машина, предназначенная для выполнения программ, написанных на Hack и PHP. | Да | Да | C ++, OCaml | |
Icon | Icon | Базовый исходный код предоставляет как интерпретатор, так и неподдерживаемую компиляцию -to-C версия. Код времени выполнения, который совместно используется компилятором и интерпретатором, написан на варианте C, называемом RTT. | Да | Нет | C, RTT (настраиваемый интерфейс для C, предоставляемый с базовым исходным кодом для Icon). | ~ 180 тыс. Всего. (источник в байт-код: ~ 11k, интерпретатор байт-кода: ~ 46k, iconc: ~ 23k, общие / заголовки: ~ 13k, rtt: ~ 15k) |
JVM | Java, Kotlin, Jython, Groovy, JRuby, C, C ++, Clojure, Scala и некоторые другие | Эталонная реализация Sun; OpenJDK : код под GPL ; IcedTea : код и инструменты под GPL | Да | Да | JDK, OpenJDK IcedTea с обычным JIT: Java, C, ASM; IcedTea с "нулевым" JIT: Java, C | JVM занимает около 6500 тыс. Строк; TCK - это 80 тыс. Тестов и около 1000 тыс. Строк |
LLVM | C, C ++, Kotlin, Objective-C, Swift, Ada, Fortran и Rust | Поддержка вывода MSIL, C и C ++. Вывод байтового кода ActionScript поддерживается Adobe Alchemy. Байт-код называется «Байт-код LLVM (.bc)». сборка называется "Язык ассемблера LLVM (*.ll)". | Да | Да | C ++ | 811k |
Lua | Lua | Да | LuaJIT | C | 13k + 7k LuaJIT | |
MMIX | MMIXAL | |||||
Mono | языки интерфейса командной строки, включая: C#, VB.NET, IronPython, IronRuby и другие | клон среды CLR | Да | Да | C #, C | 2332k |
Oz | Oz, Алиса | |||||
NekoVM | в настоящее время Neko и Haxe | Да | только x86 | C | 46k | |
O-code machine | BCPL | |||||
машина p-кода | Pascal | UCSD Pascal, широко распространенная в конце 70-х, включая Apple II | ||||
Parrot | Perl 5, Raku, NQP-rx, PASM, PBC, BASIC, bc, C99, ECMAScript, Lisp, Lua, m4, Tcl, WMLScript, XML и другие | Да | Да | C, Perl | 111k C, 240k Perl | |
Виртуальная машина Perl | Perl | op-code tree walker | Да | Нет | C, Perl | 175k C, 9k Perl |
CPython | Python | Да | Psyco | C | 387k C, 368k Python, 10k ASM, 31k Psyco | |
PyPy | Python | Self-hosting реализация Python, следующее поколение Psyco | Да | Да | Python | |
Rubinius | Ruby | Виртуальная машина для другой реализации Ruby | Да | Да | C ++, Ruby | |
Silverlight | C#, VB.NET | Микроверсия Microsoft.NET Framework, позволяющая приложениям работать в изолированной программной среде внутри браузера | Да | Да | C ++ | 7 МБ (изначально выпущено) |
ScummVM | Scumm | Движок компьютерных игр | ||||
SECD | ISWIM, Lispkit Lisp | |||||
Белка | Белка | Да | Squirrel_JIT | C ++ | 12k | |
Smalltalk | Smalltalk | |||||
SQLite | Коды операций SQLite | Виртуальный движок базы данных | ||||
Squeak | Squeak Smalltalk | Самостоятельный хостинг реализация виртуальной машины Squeak. Богатая мультимедийная поддержка. | Да | Cog Exupery | Smalltalk / Slang | Smalltalk 110k, ~ 300K C |
TraceMonkey | JavaScript | На основе Tamarin | Нет | Да | C ++ | 173k |
TrueType | TrueType | Механизм визуализации шрифтов | Да | Нет | C (обычно) | |
Valgrind | x86 / x86-64 двоичные файлы | Проверка доступ к памяти и утечки в Linux | C | 467k | ||
VisualWorks | Smalltalk | Нет | Да | C | ||
Vx32 виртуальная машина | x86 двоичные файлы | Виртуализация на уровне приложений для машинного кода | Нет | Да | ||
Waba | Виртуальная машина для небольших устройств, аналогичная Java | |||||
Еще один Ruby VM (YARV ) | Ruby | Виртуальная машина эталонной реализации для Ruby 1.9 и более новых версий | Да | Да | C | |
Z -machine | Z-Code | |||||
Zend Engine | PHP | Да | Нет | C | 75k |