La Máquina Da Vinci , también llamada Máquina Virtual Multi-Lenguaje , fue un proyecto de Sun Microsystems con el objetivo de crear un prototipo de la extensión de la Máquina Virtual Java (JVM) para agregar soporte para lenguajes dinámicos .
![]() | |
Desarrollador (es) | Microsistemas solares |
---|---|
Sistema operativo | Multiplataforma |
Tipo | Biblioteca |
Licencia | Excepción de vinculación GPL + |
Sitio web | openjdk |
Ya era posible ejecutar lenguajes dinámicos sobre la JVM, pero el objetivo es facilitar las implementaciones de nuevos lenguajes dinámicos y aumentar su rendimiento. Este proyecto fue la implementación de referencia de JSR 292 ( Soporte de lenguajes tipados dinámicamente en la plataforma Java ). [1]
Historia
![Java virtual machine architecture.svg](http://wikiimg.tojsiabtv.com/wikipedia/commons/thumb/3/3a/Java_virtual_machine_architecture.svg/150px-Java_virtual_machine_architecture.svg.png)
Antes de Java 7, la máquina virtual Java no tenía soporte integrado para lenguajes escritos dinámicamente :
- El conjunto de instrucciones JVM existente se escribe de forma estática . [2]
- JVM tiene soporte limitado para modificar dinámicamente clases y métodos existentes. Actualmente funciona solo en un entorno de depuración .
JSR 292 ( Soporte de lenguajes escritos dinámicamente en la plataforma Java ) [1] propone:
- agregar una nueva
invokedynamic
instrucción en el nivel de JVM, para permitir la invocación del método basándose en la verificación dinámica de tipos , [3] [4] [5] - para poder cambiar clases y métodos en tiempo de ejecución de forma dinámica en un entorno de producción.
Tras el éxito de la implementación de JRuby Java , el proyecto Da Vinci se inició a finales de enero de 2008. [6] Se planeó agregar las capacidades experimentadas por Da Vinci a Java 7 . Su objetivo es crear un prototipo de este JSR, pero también de otras extensiones de menor prioridad. [7] El primer prototipo funcional, desarrollado como parche en OpenJDK , se anunció y estuvo disponible a finales de agosto de 2008. [8] [9] [10]
Desde entonces, el equipo de JRuby ha conectado con éxito la invocación dinámica en su código base. La invocación dinámica se envió con la versión 1.1.5 y se desactivará en las JVM sin invokedynamic
capacidades. [11]
Desde entonces, el proyecto se integró en la base de código JDK 7 [12] y luego se integró en la versión de Java 7 .
Arquitectura
La invocación dinámica se basa en el hecho de que, incluso si Java es un lenguaje fuertemente estático a nivel de lenguaje, la información de tipo es mucho menos frecuente a nivel de código de bytes .
Sin embargo, las implementaciones de lenguajes dinámicos deben poder utilizar la compilación justo a tiempo (en lugar de la reflexión ) para lograr un buen rendimiento y, por lo tanto, compilar scripts en código de bytes en tiempo de ejecución. [ cita requerida ] Para que la máquina virtual Java pueda ejecutarlos , estos códigos de bytes deben verificarse antes de la ejecución, y el verificador debe verificar que los tipos sean estáticos en todo el código. Esto conduce a que estas implementaciones tengan que crear muchos códigos de bytes diferentes para los diferentes contextos de una llamada a un método, cada vez que cambia la firma de los argumentos .
Esto no solo usa mucha memoria, sino que también llena un área de memoria llamada Metaspace (Generación permanente antes de Java 8), una parte del montón utilizado por la JVM para almacenar información sobre clases . La memoria utilizada en esta área casi nunca se recolecta como basura porque almacena datos inmutables en el contexto de los programas Java; y debido a eso, las implementaciones de lenguajes dinámicos solo pueden compilar una pequeña parte de los scripts. [13]
JSR 292 propone:
- proporcionar un mecanismo mediante el cual una clase existente se pueda cargar y modificar, produciendo una nueva clase con esas modificaciones pero compartiendo el resto de su estructura y datos, por lo que no llene el espacio de Generación Permanente ,
- proporcionar el nuevo
invokedynamic
código de bytes que permite a la JVM optimizar las llamadas de este tipo. [3]
Ver también
- Secuencias de comandos para la plataforma Java
- Lista de lenguajes JVM
- Dynamic Language Runtime : un entorno de Microsoft que brinda soporte para lenguajes dinámicos a .NET Framework Common Language Runtime
- Nashorn (motor JavaScript) : basado en la máquina Da Vinci
Referencias
- ^ a b ver JSR 292
- ↑ Nutter, Charles (3 de enero de 2007). "InvokeDynamic: ¿realmente útil?" . Consultado el 6 de febrero de 2008 .
- ^ a b Ed Ort (julio de 2009). "Nueva característica de JDK 7: soporte para lenguajes escritos dinámicamente en la máquina virtual Java" . Consultado el 26 de julio de 2009 .
- ^ Jeff Friesen (16 de diciembre de 2014). "Cómo invocar dinámico" . JavaWorld . Consultado el 10 de junio de 2020 .
- ^ Rafael Winterhalter (2 de marzo de 2015). "Desmantelamiento invocado dinámico" . dzone.com . Consultado el 10 de junio de 2020 .
- ^ Krill, Paul (31 de enero de 2008). "Sun's Da Vinci Machine amplía la cobertura de JVM" . Archivado desde el original el 28 de marzo de 2009 . Consultado el 6 de febrero de 2008 .
- ^ "Subproyectos e Investigaciones" . Sun Microsystems . 2007 . Consultado el 6 de febrero de 2008 .
- ^ Rose, John (26 de agosto de 2008). "¡Feliz Día Internacional de Invocación Dinámica!" . Archivado desde el original el 3 de septiembre de 2008 . Consultado el 3 de septiembre de 2008 .
- ^ Rose, John (2 de septiembre de 2008). "¡Feliz Día Internacional de Invocación Dinámica!" . Consultado el 7 de septiembre de 2008 .
- ^ Lorimer, RJ (1 de septiembre de 2008). "La invocación dinámica se ejecuta en OpenJDK" . infoq.com . Consultado el 3 de septiembre de 2008 .
- ^ Nutter, Charles (11 de septiembre de 2008). "Una primera prueba de InvokeDynamic" . Consultado el 13 de septiembre de 2008 .
¡Logré conectar correctamente InvokeDynamic directamente en el proceso de envío de JRuby! ¡Qué emoción! El código ya está en el tronco de JRuby y se enviará con JRuby 1.1.5 (aunque obviamente estará deshabilitado en las JVM sin InvokeDynamic).
- ^ Rose, John (22 de abril de 2009). "progreso: indy.patch -> JDK7" . Consultado el 30 de abril de 2009 .
La mayoría de indy.patch ha entrado en la máquina virtual JDK7 en el repositorio de integración de mi grupo de trabajo, hoy a las 4:00 a.m. PDT:
- ^ Nutter, Charles (11 de septiembre de 2008). "Una primera prueba de InvokeDynamic" . Consultado el 6 de febrero de 2008 .
El sucio secreto de varias implementaciones de JVM, incluido Hotspot, es que hay un montón separado (o una generación separada del montón) que se usa para tipos especiales de datos como definiciones de clase, metadatos de clase y, a veces, código de bytes o código nativo JIT. Y no podría tener un nombre más aterrador: La Generación Permanente. Excepto en casos raros, los objetos cargados en PermGen nunca se recolectan como basura (porque se supone que son permanentes, ¿entiendes?) Y si no se usan con mucho, mucho cuidado, se llenarán (...)
enlaces externos
- Página del proyecto de la máquina Da Vinci
- Presentación de Sun en el Simposio Lang.NET
- Blog de John Rose (líder del proyecto)
- Documento de presentación JSR 292
- Documento de presentación JSR 292 ACM 2010 [ enlace muerto permanente ]