Виртуализация приложений: модели, управление памятью и безопасность кода.
Comparison of application virtualization software
Виртуализация приложений: что это такое? Узнайте о виртуальных машинах для запуска приложений на разных ОС и архитектурах, интерпретаторах и JIT-компиляции.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Программное обеспечение для виртуализации приложений относится как к виртуальным машинам приложений, так и к программному обеспечению, обеспечивающему их работу. Виртуальные машины приложений обычно используются для обеспечения переносимости байт-кода приложения на различные компьютерные архитектуры и операционные системы. Приложение обычно выполняется на компьютере с помощью интерпретатора или JIT-компиляции (компиляции во время выполнения). Существует множество реализаций одной и той же виртуальной машины, каждая из которых поддерживает свой набор функций.
None
Application virtualization software refers to both application virtual machines and software responsible for implementing them. Application virtual machines are typically used to allow application bytecode to run portably on many different computer architectures and operating systems. The application is usually run on the computer using an interpreter or just in time compilation (JIT). There are often several implementations of a given virtual machine, each covering a different set of functions.
Сравнение виртуальных машин
JavaScript-машины не включены. См. Список движков ECMAScript, чтобы найти их. Таблица здесь суммирует элементы, для которых конструкции виртуальных машин должны быть эффективными, а не перечень возможностей, присутствующих в любой реализации. Виртуальная машинаМодель машиныУправление памятьюБезопасность кодаИнтерпретаторJITАОТОбщие библиотекиОбщая объектная модельCommon Language Object ModelДинамическая типизацияAndroid Runtime (ART) регистр автоматическийCommon Language Runtime (CLR) стек автоматический или ручнойDis (Inferno) регистр автоматическийDotGNU Portable. NET стек автоматический или ручнойJava Virtual Machine (JVM) стек автоматический ✔JikesRVM стек автоматическийLLVM регистр ручнойMono стек автоматический или ручнойParrot регистр автоматическийDalvik регистр автоматическийSqueak стек автоматическийBEAM (Erlang) регистр автоматическийMoarVM регистр автоматический
JavaScript machines not included. See List of ECMAScript engines to find them. The table here summarizes elements for which the virtual machine designs are intended to be efficient, not the list of abilities present in any implementation. Virtual machineMachine modelMemory managementCode securityInterpreterJITAOTShared librariesCommon Language Object ModelDynamic typing Android Runtime (ART) register automatic Common Language Runtime (CLR) stack automatic or manual Dis (Inferno) register automatic DotGNU Portable. NET stack automatic or manual Java virtual machine (JVM) stack automatic ✔ JikesRVM stack automatic LLVM register manual Mono stack automatic or manual Parrot register automatic Dalvik register automatic Squeak stack automatic BEAM (Erlang) register automatic MoarVM register automatic
Инструкции виртуальной машины обрабатывают данные в локальных переменных, используя основную модель вычислений, как правило, модель стековой машины, регистровой машины или машины с произвольным доступом к памяти, часто называемую машиной памяти. Использование этих трех методов обусловлено различными компромиссами между виртуальными и физическими машинами, такими как простота интерпретации, компиляции и проверки безопасности. Управление памятью в этих переносимых виртуальных машинах осуществляется на более высоком уровне абстракции, чем в физических машинах. Некоторые виртуальные машины, такие как популярные Java Virtual Machines (JVM), взаимодействуют с адресами таким образом, что требуют безопасного автоматического управления памятью, позволяя виртуальной машине отслеживать ссылки на указатели и запрещать машинным инструкциям вручную создавать указатели в память. Другие виртуальные машины, такие как LLVM, больше похожи на традиционные физические машины, позволяя прямое использование и манипулирование указателями. Common Intermediate Language (CIL) предлагает гибридный подход, позволяя как контролируемое использование памяти (как в JVM, обеспечивающей безопасное автоматическое управление памятью), так и "небезопасный" режим, который позволяет прямое манипулирование указателями способами, которые могут нарушать границы типов и разрешения. Безопасность кода обычно относится к способности переносимой виртуальной машины запускать код, предоставляя ей только предписанный набор возможностей. Например, виртуальная машина может разрешить коду доступ только к определенному набору функций или данных. Те же средства контроля над указателями, которые обеспечивают автоматическое управление памятью и позволяют виртуальной машине гарантировать типобезопасный доступ к данным, используются для обеспечения того, чтобы фрагмент кода имел доступ только к определенным элементам памяти и не мог обходить саму виртуальную машину. Другие механизмы безопасности затем добавляются поверх, такие как верификаторы кода, верификаторы стека и другие методы. Интерпретатор позволяет загружать и запускать программы, состоящие из виртуальных инструкций, без потенциально дорогостоящей компиляции в машинные инструкции. Любую виртуальную машину можно интерпретировать, поэтому обозначение столбца здесь относится к тому, включает ли конструкция положения для эффективной интерпретации (для общего использования). Компиляция "точно в срок" (JIT) относится к методу компиляции в машинные инструкции в самый последний момент, обычно непосредственно перед или во время выполнения программы. Сложность JIT заключается скорее в реализации, чем в проектировании виртуальной машины, однако современные конструкции начали учитывать факторы, способствующие повышению эффективности. Самые простые методы JIT просто компилируют фрагмент кода, аналогичный оффлайн-компилятору. Однако часто используются более сложные методы, которые специализируют скомпилированные фрагменты кода на параметрах, известных только во время выполнения (см. Адаптивная оптимизация). Компиляция заранее (AOT) относится к более классическому методу использования прекомпилятора для генерации набора машинных инструкций, которые не изменяются во время выполнения программы. Поскольку агрессивная компиляция и оптимизация могут занимать время, предварительно скомпилированная программа может запускаться быстрее, чем та, которая полагается только на JIT для выполнения. Реализации JVM смягчили эту стоимость запуска, сначала используя интерпретацию для ускорения времени запуска, пока не будут сгенерированы фрагменты машинного кода с помощью JIT. Общие библиотеки — это средство повторного использования сегментов машинного кода между несколькими запущенными программами. В современных операционных системах это обычно означает использование виртуальной памяти для совместного использования страниц памяти, содержащих общую библиотеку, между различными процессами, которые защищены друг от друга с помощью защиты памяти. Интересно, что агрессивные методы JIT, такие как адаптивная оптимизация, часто создают фрагменты кода, непригодные для совместного использования между процессами или последовательными запусками программы, что требует компромисса между эффективностью предварительно скомпилированного и совместно используемого кода и преимуществами адаптивно специализированного кода. Например, несколько конструктивных положений CIL предназначены для обеспечения эффективных общих библиотек, возможно, за счет более специализированного JIT-кода. Реализация JVM на OS X использует Java Shared Archive для обеспечения некоторых преимуществ общих библиотек.
Virtual machine instructions process data in local variables using a main model of computation, typically that of a stack machine, register machine, or random access machine often called the memory machine. Use of these three methods is motivated by different tradeoffs in virtual machines vs physical machines, such as ease of interpreting, compiling, and verifying for security. Memory management in these portable virtual machines is addressed at a higher level of abstraction than in physical machines. Some virtual machines, such as the popular Java virtual machines (JVM), are involved with addresses in such a way as to require safe automatic memory management by allowing the virtual machine to trace pointer references, and disallow machine instructions from manually constructing pointers to memory. Other virtual machines, such as LLVM, are more like traditional physical machines, allowing direct use and manipulation of pointers. Common Intermediate Language (CIL) offers a hybrid in between, allowing both controlled use of memory (like the JVM, which allows safe automatic memory management), while also allowing an 'unsafe' mode that allows direct pointer manipulation in ways that can violate type boundaries and permission. Code security generally refers to the ability of the portable virtual machine to run code while offering it only a prescribed set of abilities. For example, the virtual machine might only allow the code access to a certain set of functions or data. The same controls over pointers which make automatic memory management possible and allow the virtual machine to ensure typesafe data access are used to assure that a code fragment is only allowed to certain elements of memory and cannot bypass the virtual machine itself. Other security mechanisms are then layered on top as code verifiers, stack verifiers, and other methods. An interpreter allows programs made of virtual instructions to be loaded and run immediately without a potentially costly compile into native machine instructions. Any virtual machine which can be run can be interpreted, so the column designation here refers to whether the design includes provisions for efficient interpreting (for common usage). Just in time compilation (JIT), refers to a method of compiling to native instructions at the latest possible time, usually immediately before or during the running of the program. The challenge of JIT is more one of implementation than of virtual machine design, however, modern designs have begun to make considerations to help efficiency. The simplest JIT methods simply compile to a code fragment similar to an offline compiler. However, more complex methods are often employed, which specialize compiled code fragments to parameters known only at runtime (see Adaptive optimization). Ahead of time compilation (AOT) refers to the more classic method of using a precompiler to generate a set of native instructions which do not change during the runtime of the program. Because aggressive compiling and optimizing can take time, a precompiled program may launch faster than one which relies on JIT alone for execution. JVM implementations have mitigated this startup cost by initial interpreting to speed launch times, until native code fragments can be generated by JIT. Shared libraries are a facility to reuse segments of native code across multiple running programs. In modern operating systems, this generally means using virtual memory to share the memory pages containing a shared library across different processes which are protected from each other via memory protection. It is interesting that aggressive JIT methods such as adaptive optimization often produce code fragments unsuitable for sharing across processes or successive runs of the program, requiring a tradeoff be made between the efficiencies of precompiled and shared code and the advantages of adaptively specialized code. For example, several design provisions of CIL are present to allow for efficient shared libraries, possibly at the cost of more specialized JIT code. The JVM implementation on OS X uses a Java Shared Archive to provide some of the benefits of shared libraries.
Сравнение приложений в реализациях виртуальных машин
В дополнение к портативным виртуальным машинам, описанным выше, виртуальные машины часто используются в качестве модели исполнения для отдельных языков сценариев, обычно посредством интерпретатора. В данной таблице перечислены конкретные реализации виртуальных машин, как портативных, так и виртуальных машин для языков сценариев.
In addition to the portable virtual machines described above, virtual machines are often used as an execution model for individual scripting languages, usually by an interpreter. This table lists specific virtual machine implementations, both of the above portable virtual machines, and of scripting language virtual machines. Virtual machine Languages Comments Interpreter JIT Implementation language SLoC Common Language Runtime (CLR) C#, C++/CLI, F#, VB. NET bytecode is CIL; NET Core Runtime on GitHub C#, C++ Adobe Flash Player (aka Tamarin) ActionScript, SWF (file format) interactive web authoring tool. bytecode is named "ActionScript Byte Code (. abc)" C++ 135k (initially released) Dis (Inferno) Limbo Dis Virtual Machine Specification C 15k + 2850 per JIT arch + 500 per host OS DotGNU Portable. NET CLI languages including: C# Common Language Runtime clone C, C# Forth Forth Features are simplified, usually include assembler, compiler, text level and binary level interpreters, sometimes editor, debugger and OS. Compiling speeds are >20 SKLOC/S and behave much like JIT. Forth, Forth Assembler 2.8K to 5.6K; advanced, professional implementations are smaller. Glulx Inform 6, Inform 7, others Various implementations exist HHVM PHP, Hack Is an open source virtual machine designed for executing programs written in Hack and PHP. C++, OCaml Icon Icon Base source code provides both the interpreter as well as an unsupported compile to C version. The runtime code, that is shared between the compiler and the interpreter, is written in a variant of C called RTT. C, RTT (a custom front end to C, provided with the base source for Icon). ~180k total. (source to bytecode: ~11k, bytecode interpreter: ~46k, iconc: ~23k, common/headers: ~13k, rtt: ~15k) JVM Java, Kotlin, Jython, Groovy, JRuby, C, C++, Clojure, Scala and several others Reference implementation by Sun ; OpenJDK: code under GPL ; IcedTea: code and tools under GPL JDK, OpenJDK & IcedTea with regular JIT : Java, C, C++, ASM ; IcedTea with the "Zero" JIT : Java, C, C++ JVM is around 6500k lines; TCK is 80k tests and around 1000k lines LLVM C, C++, Kotlin, Objective C, Swift, Ada, Fortran, and Rust MSIL, C and C++ output are supported. ActionScript Byte Code output is supported by Adobe Alchemy. bytecode is named "LLVM Bytecode (. bc)". assembly is named "LLVM Assembly Language (*. ll)". C++ 811k Lua Lua LuaJIT C 13k + 7k LuaJIT MMIX MMIXAL Mono CLI languages including: C#, VB. NET, IronPython, IronRuby, and others Common Language Runtime clone C#, C 2332k NekoVM currently Neko and Haxe x86 only C 46k Oz Oz, Alice O code machine BCPL p code machine Pascal UCSD Pascal, widespread in late 70s including Apple IIassembly, Pascal Parrot Perl 5, Raku, NQP rx, PIR, PASM, PBC, BASIC, bc, C99, ECMAScript, Lisp, Lua, m4, Tcl, WMLScript, XML, and others C, Perl 111k C, 240k Perl Perl virtual machine Perl op code tree walker C, Perl 175k C, 9k Perl CPython Python Psyco, Unladen Swallow C 387k C, 368k Python, 10k ASM, 31k Psyco PyPy Python Self hosting implementation of Python, next generation of Psyco Python Rubinius Ruby Virtual machine for another Ruby implementation C++, Ruby Silverlight C#, VB. NET A Micro version of Microsoft NET Framework to let applications run sandboxed inside browser C++ 7MB (initially released) ScummVM Scumm Computer game engine SECD ISWIM, Lispkit Lisp Squirrel Squirrel Squirrel JIT C++ 12k Smalltalk Smalltalk SQLite SQLite opcodes Virtual database engine Squeak Squeak Smalltalk Self hosting implementation of Squeak virtual machine. Rich multi media support. Smalltalk/Slang 110k Smalltalk, ~300K CSWI PrologProlog: SWI Prolog, YAP C, SWI Prolog TraceMonkey JavaScript Based on Tamarin C++ 173k TrueType TrueType Font rendering engine C (typically) Valgrind x86/x86 64 binaries Checking of memory accesses and leaks under Linux C 467k VisualWorks Smalltalk C Vx32 virtual machine x86 binaries Application level virtualization for native code Waba Virtual machine for small devices, similar to Java Yet Another Ruby VM (YARV) Ruby Virtual machine of the reference implementation for Ruby 1.9 and newer versionsC Z machine Z Code Zend Engine PHP C 75k
Языки виртуальных машин | Комментарии | Интерпретатор | 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 Byte Code (.abc)" | | | C++ | 135k (первоначально выпущен)
Dis (Inferno) | Limbo Dis Virtual Machine Specification | | | C | 15k + 2850 на JIT архитектуру + 500 на хост OS
DotGNU Portable. NET | CLI языки, включая: C#; Common Language Runtime clone | | | C, C# |
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 | Base предоставляет как интерпретатор, так и неподдерживаемую компиляцию в C. Код времени выполнения, используемый компилятором и интерпретатором, написан на варианте C, называемом RTT. | | | C, RTT (специализированный интерфейс для C, поставляемый с базовым исходным кодом Icon) | ~180k (исходник в байт-код: ~11k, интерпретатор байт-кода: ~46k, iconc: ~23k, common/headers: ~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 с "Zero" JIT: Java, C, C++ | ~6500k строк; TCK: 80k тестов и ~1000k строк
LLVM | C, C++, Kotlin, Objective C, Swift, Ada, Fortran, Rust; поддерживаются MSIL, C и C++ выходные данные. Поддержка вывода байт-кода ActionScript через Adobe Alchemy. Байт-код называется "LLVM Bytecode (.bc)". Ассемблерный код называется "LLVM Assembly Language (*.ll)". | | | C++ | 811k
Lua | | LuaJIT | | C | 13k + 7k LuaJIT
MMIX | MMIXAL | | | |
Mono | CLI языки, включая: C#, VB. NET, IronPython, IronRuby и другие; Common Language Runtime clone | | | C#, C | 2332k
NekoVM | Neko и Haxe | | | C | 46k (только x86)
Oz | Oz, Alice | | | |
Pascal | UCSD Pascal, широко распространенный в конце 70-х, включая Apple II assembly | | | |
Parrot | Perl 5, Raku, NQP; rx, PIR, PASM, PBC, BASIC, bc, C99, ECMAScript, Lisp, Lua, m4, Tcl, WMLScript, XML и другие | | | C, Perl | 111k C, 240k Perl
Perl virtual machine | Perl op code tree walker | | | C, Perl | 175k C, 9k Perl
CPython | Python | Psyco, Unladen Swallow | | C | 387k C, 368k Python, 10k ASM, 31k Psyco
PyPy | Python; самохостинг реализация Python, следующее поколение Psyco | | | Python |
Rubinius | Ruby; виртуальная машина для другой реализации Ruby | | | C++, Ruby |
Silverlight | C#, VB. NET; микроверсия Microsoft .NET Framework для запуска приложений в изолированной среде браузера | | | C++ | 7MB (первоначально выпущен)
ScummVM | Scumm; компьютерный игровой движок | | | |
SECD | ISWIM, Lispkit Lisp | | | |
Squirrel | Squirrel; Squirrel JIT | | | C++ | 12k
Smalltalk | Smalltalk | | | |
SQLite | SQLite opcodes; виртуальный движок базы данных | | | |
Squeak | Squeak Smalltalk; самохостинг реализация виртуальной машины Squeak. Богатая мультимедийная поддержка. | | | Smalltalk | 110k Smalltalk, ~300K
CSWI | PrologProlog: SWI Prolog, YAP | | | C, SWI Prolog |
TraceMonkey | JavaScript; на основе Tamarin | | | C++ | 173k
TrueType | TrueType; движок рендеринга шрифтов | | | C (обычно) |
Valgrind | x86/x86 64 бинарные файлы; проверка доступа к памяти и утечек под Linux | | | C | 467k
VisualWorks Smalltalk | | | | C |
Vx32 virtual machine | x86 бинарные файлы; виртуализация на уровне приложения для нативного кода | | | |
Waba | Виртуальная машина для небольших устройств, аналогичная Java | | | |
Yet Another Ruby VM (YARV) | Ruby; виртуальная машина референсной реализации для Ruby 1.9 и более новых версий | | | C |
Z machine | Z Code | | | |
Zend Engine | PHP | | | C | 75k
In addition to the portable virtual machines described above, virtual machines are often used as an execution model for individual scripting languages, usually by an interpreter. This table lists specific virtual machine implementations, both of the above portable virtual machines, and of scripting language virtual machines. Virtual machine Languages Comments Interpreter JIT Implementation language SLoC Common Language Runtime (CLR) C#, C++/CLI, F#, VB. NET bytecode is CIL; NET Core Runtime on GitHub C#, C++ Adobe Flash Player (aka Tamarin) ActionScript, SWF (file format) interactive web authoring tool. bytecode is named "ActionScript Byte Code (. abc)" C++ 135k (initially released) Dis (Inferno) Limbo Dis Virtual Machine Specification C 15k + 2850 per JIT arch + 500 per host OS DotGNU Portable. NET CLI languages including: C# Common Language Runtime clone C, C# Forth Forth Features are simplified, usually include assembler, compiler, text level and binary level interpreters, sometimes editor, debugger and OS. Compiling speeds are >20 SKLOC/S and behave much like JIT. Forth, Forth Assembler 2.8K to 5.6K; advanced, professional implementations are smaller. Glulx Inform 6, Inform 7, others Various implementations exist HHVM PHP, Hack Is an open source virtual machine designed for executing programs written in Hack and PHP. C++, OCaml Icon Icon Base source code provides both the interpreter as well as an unsupported compile to C version. The runtime code, that is shared between the compiler and the interpreter, is written in a variant of C called RTT. C, RTT (a custom front end to C, provided with the base source for Icon). ~180k total. (source to bytecode: ~11k, bytecode interpreter: ~46k, iconc: ~23k, common/headers: ~13k, rtt: ~15k) JVM Java, Kotlin, Jython, Groovy, JRuby, C, C++, Clojure, Scala and several others Reference implementation by Sun ; OpenJDK: code under GPL ; IcedTea: code and tools under GPL JDK, OpenJDK & IcedTea with regular JIT : Java, C, C++, ASM ; IcedTea with the "Zero" JIT : Java, C, C++ JVM is around 6500k lines; TCK is 80k tests and around 1000k lines LLVM C, C++, Kotlin, Objective C, Swift, Ada, Fortran, and Rust MSIL, C and C++ output are supported. ActionScript Byte Code output is supported by Adobe Alchemy. bytecode is named "LLVM Bytecode (. bc)". assembly is named "LLVM Assembly Language (*. ll)". C++ 811k Lua Lua LuaJIT C 13k + 7k LuaJIT MMIX MMIXAL Mono CLI languages including: C#, VB. NET, IronPython, IronRuby, and others Common Language Runtime clone C#, C 2332k NekoVM currently Neko and Haxe x86 only C 46k Oz Oz, Alice O code machine BCPL p code machine Pascal UCSD Pascal, widespread in late 70s including Apple IIassembly, Pascal Parrot Perl 5, Raku, NQP rx, PIR, PASM, PBC, BASIC, bc, C99, ECMAScript, Lisp, Lua, m4, Tcl, WMLScript, XML, and others C, Perl 111k C, 240k Perl Perl virtual machine Perl op code tree walker C, Perl 175k C, 9k Perl CPython Python Psyco, Unladen Swallow C 387k C, 368k Python, 10k ASM, 31k Psyco PyPy Python Self hosting implementation of Python, next generation of Psyco Python Rubinius Ruby Virtual machine for another Ruby implementation C++, Ruby Silverlight C#, VB. NET A Micro version of Microsoft NET Framework to let applications run sandboxed inside browser C++ 7MB (initially released) ScummVM Scumm Computer game engine SECD ISWIM, Lispkit Lisp Squirrel Squirrel Squirrel JIT C++ 12k Smalltalk Smalltalk SQLite SQLite opcodes Virtual database engine Squeak Squeak Smalltalk Self hosting implementation of Squeak virtual machine. Rich multi media support. Smalltalk/Slang 110k Smalltalk, ~300K CSWI PrologProlog: SWI Prolog, YAP C, SWI Prolog TraceMonkey JavaScript Based on Tamarin C++ 173k TrueType TrueType Font rendering engine C (typically) Valgrind x86/x86 64 binaries Checking of memory accesses and leaks under Linux C 467k VisualWorks Smalltalk C Vx32 virtual machine x86 binaries Application level virtualization for native code Waba Virtual machine for small devices, similar to Java Yet Another Ruby VM (YARV) Ruby Virtual machine of the reference implementation for Ruby 1.9 and newer versionsC Z machine Z Code Zend Engine PHP C 75k