Эта статья требует дополнительных ссылок для проверки . ( октябрь 2011 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
Программное обеспечение виртуализации приложений относится как к виртуальным машинам приложений, так и к программному обеспечению, отвечающему за их реализацию. Виртуальные машины приложений обычно используются для обеспечения переносимости байт-кода приложения на многих компьютерных архитектурах и операционных системах. Приложение обычно запускается на компьютере с использованием интерпретатора или JIT -компиляции . Часто существует несколько реализаций данной виртуальной машины, каждая из которых покрывает свой набор функций.
Сравнение виртуальных машин [ править ]
- Машины JavaScript не включены. См. Список движков ECMAScript, чтобы найти их.
В таблице приведены элементы, для которых конструкция виртуальных машин должна быть эффективной, а не список возможностей, представленных в какой-либо реализации.
Виртуальная машина | Модель машины | Управление памятью | Безопасность кода | Устный переводчик | JIT | АОТ | Общие библиотеки | Общеязыковая объектная модель | Динамический набор текста |
---|---|---|---|---|---|---|---|---|---|
Среда выполнения Android (ART) | регистр | автоматический | да | да | да | да | ? | да | да |
Общеязыковая среда выполнения (CLR) | куча | автоматический или ручной | да | да | да | да | да | да | да |
Дис ( Ад ) | регистр | автоматический | да | да | да | да | да | да | да |
DotGNU Portable.NET | куча | автоматический или ручной | да | да | да | да | да | да | Нет |
Виртуальная машина Java (JVM) | куча | автоматический | да | да | да | да | да | да | Да [1] |
JikesRVM | куча | автоматический | да | да | да | да | ? | да | да |
LLVM | регистр | руководство | Нет | да | да | да | да | да | Нет |
Мононуклеоз | куча | автоматический или ручной | да | да | да | да | да | да | да |
Попугай | регистр | автоматический | Нет | да | Нет [2] | да | да | да | да |
Дальвик | регистр | автоматический | да | да | да | Нет | ? | Нет | Нет |
Писк | куча | автоматический | Нет | да | да | Нет | да | Нет | да |
BEAM ( Эрланг ) | регистр | автоматический | ? | да | да | да | да | да | да |
MoarVM | регистр | автоматический | ? | да | да | да | да | да | да |
Команды виртуальной машины обрабатывают данные в локальных переменных с использованием основной модели вычислений , обычно модели стековой машины , машины регистров или машины произвольного доступа, часто называемой машиной памяти. Использование этих трех методов мотивировано различными компромиссами между виртуальными и физическими машинами, такими как простота интерпретации, компиляции и проверки безопасности.
Управление памятью на этих портативных виртуальных машинах решается на более высоком уровне абстракции, чем на физических машинах. Некоторые виртуальные машины, такие как популярные виртуальные машины Java (JVM), связаны с адресами таким образом, что требуют безопасного автоматического управления памятью, позволяя виртуальной машине отслеживать ссылки на указатели и запрещая машинным инструкциям вручную создавать указатели на память. . Другие виртуальные машины, такие как LLVM, больше похожи на традиционные физические машины, позволяя напрямую использовать указатели и управлять ими. Общий промежуточный язык (CIL) предлагает гибрид между ними, позволяя как контролируемое использование памяти (например, JVM, которое позволяет безопасное автоматическое управление памятью), так и разрешающий `` небезопасный '' режим, который позволяет прямое манипулирование указателями способами, которые могут нарушать границы типов и разрешения. .
Безопасность кода обычно относится к способности портативной виртуальной машины запускать код, предлагая ей только предписанный набор возможностей. Например, виртуальная машина может разрешить коду доступ только к определенному набору функций или данных. Те же элементы управления указателями, которые делают возможным автоматическое управление памятью и позволяют виртуальной машине обеспечивать безопасный доступ к данным, используются для гарантии того, что фрагмент кода разрешен только для определенных элементов памяти и не может обойти саму виртуальную машину. Затем наверху накладываются другие механизмы безопасности, такие как верификаторы кода, верификаторы стека и другие методы.
Интерпретатор позволяет программам из виртуальных инструкций для загрузки и запуска немедленно без потенциально дорогостоящей компиляции в родной машинных команд. Любая виртуальная машина, которая может быть запущена, может быть интерпретирована, поэтому обозначение столбца здесь указывает на то, включает ли проект положения для эффективной интерпретации (для общего использования).
Своевременная компиляция (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 (изначально выпущено) |
Дис ( Ад ) | Лимбо | Спецификация виртуальной машины Dis | да | да | C | 15k + 2850 на JIT-арку + 500 на хост-ОС |
DotGNU - Portable.NET | Языки интерфейса командной строки, включая: C # | Клон Common Language Runtime | Нет | да | C, C # | |
Четвертый | Четвертый | Функции упрощены, обычно включают ассемблер, компилятор, интерпретаторы текстового и двоичного уровней, иногда редактор, отладчик и ОС. Скорость компиляции составляет> 20 SKLOC / с и ведет себя так же, как JIT. | да | Нет | Четвертый, четвертый ассемблер | От 2,8 до 5,6 тыс. продвинутые профессиональные реализации меньше по размеру. |
Glulx | Информ 6, Информ 7, другие | да | Нет | Существуют различные реализации | ||
HHVM | PHP , Взлом | Это виртуальная машина с открытым исходным кодом, предназначенная для выполнения программ, написанных на Hack и PHP. | да | да | C ++, OCaml | |
Значок | Значок | Базовый исходный код предоставляет как интерпретатор, так и неподдерживаемую версию для компиляции в 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, C ++, ASM; IcedTea с "нулевой" JIT: Java, C, 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 [4] |
Lua | Lua | да | LuaJIT | C | 13k + 7k LuaJIT | |
MMIX | MMIXAL | |||||
Мононуклеоз | Языки интерфейса командной строки, включая: C # , VB.NET , IronPython , IronRuby и другие. | Клон Common Language Runtime | да | да | C #, C | 2332 тыс. |
НекоВМ | в настоящее время Неко и Хаксе | да | только x86 | C | 46 тыс. | |
Унция | Оз, Алиса | |||||
О-код машина | BCPL | |||||
машина p-кода | Паскаль | UCSD Pascal, широко распространенный в конце 70-х, включая Apple II | ||||
Попугай | Perl 5 , Рака , NQP-гй, PIR , PASM , РВС , BASIC , BC , C99 , ECMAScript , Lisp , Lua , m4 , Tcl , WMLScript , XML и других | да | да | C, Perl | 111k C, 240k Perl | |
Виртуальная машина Perl | Perl | обходчик дерева кода операции | да | Нет | C, Perl | 175k C, 9k Perl |
CPython | Python | да |
| C | 387k C, 368k Python, 10k ASM, 31k Psyco | |
PyPy | Python | Самостоятельная реализация Python, нового поколения Psyco | да | да | Python | |
Рубиниус | Рубин | Виртуальная машина для другой реализации Ruby | да | да | C ++, Ruby | |
Silverlight | C # , VB.NET | Микроверсия Microsoft .NET Framework, позволяющая приложениям работать в изолированной среде браузера. | да | да | C ++ | 7 МБ (изначально выпущено) |
ScummVM | Подонок | Компьютерный игровой движок | ||||
SECD | ISWIM , Lispkit Lisp | |||||
Белка | Белка | да | Белка_JIT | C ++ | 12 тыс. | |
Болтовня | Болтовня | |||||
SQLite | Коды операций SQLite | Виртуальный движок базы данных | ||||
Писк | Писк Smalltalk | Самостоятельная реализация виртуальной машины Squeak. Богатая мультимедийная поддержка. | да | Cog & Exupery | Smalltalk / Сленг | 110 КБ Smalltalk, ~ 300 КБ |
SWI-Prolog | Пролог: SWI-Prolog , YAP | да | Нет | C, SWI-Prolog | ||
TraceMonkey | JavaScript | По мотивам Тамарина | Нет | да | C ++ | 173 тыс. |
TrueType | TrueType | Механизм визуализации шрифтов | да | Нет | C (обычно) | |
Валгринд | двоичные файлы x86 / x86-64 | Проверка обращений и утечек памяти под Linux | C | 467k [5] | ||
VisualWorks | Болтовня | Нет | да | C | ||
Виртуальная машина Vx32 | двоичные файлы x86 | Виртуализация на уровне приложений для машинного кода | Нет | да | ||
Waba | Виртуальная машина для небольших устройств, похожая на Java | |||||
Еще одна Ruby VM ( YARV ) | Рубин | Виртуальная машина эталонной реализации для Ruby 1.9 и новее | да | да | C | |
Z-машина | Z-код | |||||
Zend Engine | PHP | да | Нет | C | 75 тыс. |
См. Также [ править ]
- Виртуализация приложений
- Привязка к языку
- Интерфейс внешней функции
- Соглашение о вызове
- Изменение имени
- Интерфейс прикладного программирования (API)
- Бинарный интерфейс приложения (ABI)
- Сравнение программного обеспечения для виртуализации платформ
- Список движков ECMAScript
- WebAssembly
Ссылки [ править ]
- ^ "Программа Java Community Process (SM) - JSR: запросы спецификации Java - деталь JSR # 292" . Jcp.org . Проверено 4 июля 2013 .
- ^ "JITRewrite - Parrot" . Trac.parrot.org . Проверено 4 июля 2013 .
- ^ Документы Apple об использовании общего архива Java в OS X
- ^ Инфраструктура компилятора LLVM , ohloh.net, 30 ноября 2011 г.
- ^ Valgrind , ohloh.net, 2011 30 ноября.