El software de virtualización de aplicaciones se refiere tanto a las máquinas virtuales de aplicaciones como al software responsable de implementarlas. Máquinas virtuales de aplicación se utilizan normalmente para permitir la aplicación de código de bytes para ejecutar de forma portátil en muchas diferentes arquitecturas de ordenadores y sistemas operativos. Por lo general, la aplicación se ejecuta en la computadora mediante un intérprete o una compilación justo a tiempo (JIT). A menudo hay varias implementaciones de una máquina virtual determinada, cada una de las cuales cubre un conjunto diferente de funciones.
Comparación de máquinas virtuales
- Máquinas JavaScript no incluidas. Consulte Lista de motores ECMAScript para encontrarlos.
La tabla aquí resume los elementos para los cuales los diseños de la máquina virtual están destinados a ser eficientes, no la lista de habilidades presentes en cualquier implementación.
Máquina virtual | Modelo de máquina | Gestión de la memoria | Seguridad del código | Interprete | JIT | AOT | Bibliotecas compartidas | Modelo de objetos de lenguaje común | Escritura dinámica |
---|---|---|---|---|---|---|---|---|---|
Tiempo de ejecución de Android (ART) | Registrarse | automático | sí | sí | sí | sí | ? | sí | sí |
Common Language Runtime (CLR) | apilar | automático o manual | sí | sí | sí | sí | sí | sí | sí |
Dis ( Infierno ) | Registrarse | automático | sí | sí | sí | sí | sí | sí | sí |
DotGNU Portable.NET | apilar | automático o manual | sí | sí | sí | sí | sí | sí | No |
Máquina virtual Java (JVM) | apilar | automático | sí | sí | sí | sí | sí | sí | Sí [1] |
JikesRVM | apilar | automático | sí | sí | sí | sí | ? | sí | sí |
LLVM | Registrarse | manual | No | sí | sí | sí | sí | sí | No |
Mononucleosis infecciosa | apilar | automático o manual | sí | sí | sí | sí | sí | sí | sí |
Loro | Registrarse | automático | No | sí | No [2] | sí | sí | sí | sí |
Dalvik | Registrarse | automático | sí | sí | sí | No | ? | No | No |
Chirrido | apilar | automático | No | sí | sí | No | sí | No | sí |
HAZ ( Erlang ) | Registrarse | automático | ? | sí | sí | sí | sí | sí | sí |
MoarVM | Registrarse | automático | ? | sí | sí | sí | sí | sí | sí |
Las instrucciones de la máquina virtual procesan datos en variables locales utilizando un modelo principal de cálculo , típicamente el de una máquina de pila , máquina de registro o máquina de acceso aleatorio a menudo llamada máquina de memoria. El uso de estos tres métodos está motivado por diferentes compensaciones en las máquinas virtuales frente a las máquinas físicas, como la facilidad para interpretar, compilar y verificar la seguridad.
La gestión de la memoria en estas máquinas virtuales portátiles se aborda en un nivel más alto de abstracción que en las máquinas físicas. Algunas máquinas virtuales, como las populares máquinas virtuales Java (JVM), están involucradas con direcciones de tal manera que requieren una administración automática segura de la memoria al permitir que la máquina virtual rastree referencias de puntero y no permita que las instrucciones de la máquina construyan manualmente punteros a la memoria. . Otras máquinas virtuales, como LLVM, se parecen más a las máquinas físicas tradicionales, lo que permite el uso directo y la manipulación de punteros. Common Intermediate Language (CIL) ofrece un híbrido intermedio, que permite tanto el uso controlado de la memoria (como la JVM, que permite una gestión automática segura de la memoria), al mismo tiempo que permite un modo 'inseguro' que permite la manipulación directa del puntero en formas que pueden violar el tipo límites y permisos.
La seguridad del código generalmente se refiere a la capacidad de la máquina virtual portátil para ejecutar código mientras le ofrece solo un conjunto prescrito de capacidades. Por ejemplo, es posible que la máquina virtual solo permita que el código acceda a un determinado conjunto de funciones o datos. Los mismos controles sobre los punteros que hacen posible la gestión automática de la memoria y permiten que la máquina virtual garantice el acceso seguro a los datos se utilizan para garantizar que un fragmento de código solo se permita a ciertos elementos de la memoria y no pueda omitir la máquina virtual en sí. Luego, otros mecanismos de seguridad se superponen como verificadores de código, verificadores de pila y otros métodos.
Un intérprete permite que los programas hechos de instrucciones virtuales se carguen y ejecuten inmediatamente sin una compilación potencialmente costosa en instrucciones nativas de la máquina. Se puede interpretar cualquier máquina virtual que se pueda ejecutar, por lo que la designación de columna aquí se refiere a si el diseño incluye disposiciones para una interpretación eficiente (para uso común).
La compilación justo a tiempo (JIT) se refiere a un método de compilación de instrucciones nativas en el último momento posible, generalmente inmediatamente antes o durante la ejecución del programa. El desafío de JIT es más de implementación que de diseño de máquinas virtuales, sin embargo, los diseños modernos han comenzado a hacer consideraciones para ayudar a la eficiencia. Los métodos JIT más simples simplemente compilan en un fragmento de código similar a un compilador fuera de línea. Sin embargo, a menudo se emplean métodos más complejos, que especializan fragmentos de código compilado en parámetros conocidos solo en tiempo de ejecución (consulte Optimización adaptativa ).
La compilación anticipada (AOT) se refiere al método más clásico de usar un precompilador para generar un conjunto de instrucciones nativas que no cambian durante el tiempo de ejecución del programa. Debido a que la compilación y optimización agresivas pueden llevar tiempo, un programa precompilado puede iniciarse más rápido que uno que se basa únicamente en JIT para su ejecución. Las implementaciones de JVM han mitigado este costo inicial mediante la interpretación inicial para acelerar los tiempos de lanzamiento, hasta que JIT pueda generar fragmentos de código nativo.
Las bibliotecas compartidas son una función para reutilizar segmentos de código nativo en múltiples programas en ejecución. En los sistemas operativos modernos, esto generalmente significa usar memoria virtual para compartir las páginas de memoria que contienen una biblioteca compartida entre diferentes procesos que están protegidos entre sí mediante la protección de la memoria . Es interesante que los métodos JIT agresivos, como la optimización adaptativa, a menudo producen fragmentos de código inadecuados para compartir entre procesos o ejecuciones sucesivas del programa, lo que requiere una compensación entre las eficiencias del código precompilado y compartido y las ventajas del código adaptable especializado. Por ejemplo, existen varias disposiciones de diseño de CIL para permitir bibliotecas compartidas eficientes, posiblemente a costa de un código JIT más especializado. La implementación de JVM en OS X utiliza un archivo compartido de Java [3] para proporcionar algunos de los beneficios de las bibliotecas compartidas.
Comparación de implementaciones de máquinas virtuales de aplicaciones
Además de las máquinas virtuales portátiles descritas anteriormente, las máquinas virtuales se utilizan a menudo como modelo de ejecución para lenguajes de scripting individuales, generalmente por un intérprete. Esta tabla enumera implementaciones de máquinas virtuales específicas, tanto de las máquinas virtuales portátiles anteriores como de las máquinas virtuales de lenguaje de secuencias de comandos.
Máquina virtual | Idiomas | Comentarios | Interprete | JIT | Lenguaje de implementación | SLoC |
---|---|---|---|---|---|---|
Common Language Runtime (CLR) | C # , C ++ / CLI , F # , VB.NET | el código de bytes es CIL ; .NET Core Runtime en GitHub | No | sí | C #, C ++ | |
Adobe Flash Player (también conocido como Tamarin ) | ActionScript , SWF (formato de archivo) | herramienta de creación web interactiva. El código de bytes se denomina "Código de bytes de ActionScript (.abc)". | sí | sí | C ++ | 135k (lanzado inicialmente) |
Dis ( Infierno ) | Limbo | Dis Especificación de máquina virtual | sí | sí | C | 15k + 2850 por arco JIT + 500 por sistema operativo host |
DotGNU - Portable.NET | Idiomas CLI que incluyen: C # | Clon de Common Language Runtime | No | sí | C, C # | |
Adelante | Adelante | Las características están simplificadas, por lo general incluyen ensamblador, compilador, intérpretes de nivel de texto y de nivel binario, a veces editor, depurador y sistema operativo. Las velocidades de compilación son> 20 SKLOC / S y se comportan de manera muy similar a JIT. | sí | No | Cuarto, cuarto ensamblador | 2,8 K a 5,6 K; las implementaciones profesionales avanzadas son más pequeñas. |
Glulx | Informar 6, informar 7, otros | sí | No | Existen varias implementaciones | ||
H HVM | PHP , piratear | Es una máquina virtual de código abierto diseñada para ejecutar programas escritos en Hack y PHP. | sí | sí | C ++, OCaml | |
Icono | Icono | El código fuente base proporciona tanto el intérprete como una versión de compilación en C no compatible. El código de tiempo de ejecución, que se comparte entre el compilador y el intérprete, está escrito en una variante de C llamada RTT. | sí | No | C, RTT (un front-end personalizado para C, provisto con la fuente base para Icon). | ~ 180k en total. (fuente a bytecode: ~ 11k, intérprete de bytecode: ~ 46k, iconc: ~ 23k, common / headers: ~ 13k, rtt: ~ 15k) |
JVM | Java , Kotlin , Jython , Groovy , JRuby , C , C ++ , Clojure , Scala y varios otros | Implementación de referencia por Sun; OpenJDK : código bajo GPL ; IcedTea : código y herramientas bajo GPL | sí | sí | JDK , OpenJDK e IcedTea con JIT regular: Java, C, C ++, ASM; IcedTea con el JIT "Zero": Java, C, C ++ | JVM tiene alrededor de 6500k líneas; TCK es de 80k pruebas y alrededor de 1000k líneas |
LLVM | C , C ++ , Kotlin , Objective-C , Swift , Ada , Fortran y Rust | Se admiten salidas MSIL, C y C ++. La salida de código de bytes de ActionScript es compatible con Adobe Alchemy. El código de bytes se denomina "Código de bytes LLVM (.bc)". El ensamblado se denomina "Lenguaje ensamblador LLVM (* .ll)". | sí | sí | C ++ | 811k [4] |
Lua | Lua | sí | LuaJIT | C | 13k + 7k LuaJIT | |
MMIX | MMIXAL | |||||
Mononucleosis infecciosa | Lenguajes CLI que incluyen: C # , VB.NET , IronPython , IronRuby y otros | Clon de Common Language Runtime | sí | sí | C #, C | 2332k |
NekoVM | actualmente Neko y Haxe | sí | solo x86 | C | 46k | |
Onz | Oz, Alice | |||||
Máquina de código O | BCPL | |||||
máquina de código p | Pascal | UCSD Pascal, generalizado a finales de los 70, incluido Apple II | ||||
Loro | Perl 5 , Raku , NQP-rx, PIR , PASM , PBC , BASIC , bc , C99 , ECMAScript , Lisp , Lua , m4 , Tcl , WMLScript , XML y otros | sí | sí | C, Perl | 111k C, 240k Perl | |
Máquina virtual Perl | Perl | caminante de árbol de código de operación | sí | No | C, Perl | 175k C, 9k Perl |
CPython | Pitón | sí |
| C | 387k C, 368k Python, 10k ASM, 31k Psyco | |
PyPy | Pitón | Autoalojamiento implementación de Python, próxima generación de Psyco | sí | sí | Pitón | |
Rubinius | Rubí | Máquina virtual para otra implementación de Ruby | sí | sí | C ++, Ruby | |
Silverlight | C # , VB.NET | Una microversión de Microsoft .NET Framework para permitir que las aplicaciones se ejecuten en un espacio aislado dentro del navegador | sí | sí | C ++ | 7 MB (lanzado inicialmente) |
ScummVM | Escoria | Motor de juegos de computadora | ||||
SECD | ISWIM , Lispkit Lisp | |||||
Ardilla | Ardilla | sí | Squirrel_JIT | C ++ | 12k | |
Charla | Charla | |||||
SQLite | Códigos de operación SQLite | Motor de base de datos virtual | ||||
Chirrido | Chillido Smalltalk | Auto de alojamiento implementación de la máquina virtual de Squeak. Soporte multimedia enriquecido. | sí | Cog & Exupery | Smalltalk / Slang | 110k Smalltalk, ~ 300K C |
SWI-Prolog | Prólogo: SWI-Prolog , YAP | sí | No | C, SWI-Prolog | ||
TraceMonkey | JavaScript | Basado en Tamarin | No | sí | C ++ | 173k |
Tipo verdadero | Tipo verdadero | Motor de renderizado de fuentes | sí | No | C (típicamente) | |
Valgrind | binarios x86 / x86-64 | Comprobación de accesos y fugas de memoria en Linux | C | 467k [5] | ||
VisualWorks | Charla | No | sí | C | ||
Máquina virtual Vx32 | binarios x86 | Virtualización a nivel de aplicación para código nativo | No | sí | ||
Waba | Máquina virtual para dispositivos pequeños, similar a Java | |||||
Otro Ruby VM más ( YARV ) | Rubí | Máquina virtual de la implementación de referencia para Ruby 1.9 y versiones más recientes | sí | sí | C | |
Máquina Z | Código Z | |||||
Motor Zend | PHP | sí | No | C | 75k |
Ver también
- Virtualización de aplicaciones
- Enlace de idioma
- Interfaz de función externa
- Convención de llamadas
- Destrozar nombre
- Interfaz de programación de aplicaciones (API)
- Interfaz binaria de aplicación (ABI)
- Comparación de software de virtualización de plataformas
- Lista de motores ECMAScript
- WebAssembly
Referencias
- ^ "El programa Java Community Process (SM) - JSR: Solicitudes de especificación de Java - detalle JSR # 292" . Jcp.org . Consultado el 4 de julio de 2013 . CS1 maint: parámetro desalentado ( enlace )
- ^ "JITRewrite - Parrot" . Trac.parrot.org . Consultado el 4 de julio de 2013 . CS1 maint: parámetro desalentado ( enlace )
- ^ Documentos de Apple sobre el uso de Java Shared Archive en OS X
- ^ La infraestructura del compilador LLVM , ohloh.net, 30 de noviembre de 2011
- ^ Valgrind , ohloh.net, 30 de noviembre de 2011.