stringtranslate.com

Máquina Da Vinci

La Máquina Da Vinci , también llamada Máquina Virtual Multilenguaje , fue un proyecto de Sun Microsystems cuyo objetivo era crear un prototipo de la extensión de la Máquina Virtual Java (JVM) para añadir soporte para lenguajes dinámicos .

Ya era posible ejecutar lenguajes dinámicos sobre la JVM, pero el objetivo es facilitar la implementación de nuevos lenguajes dinámicos y aumentar su rendimiento. Este proyecto fue la implementación de referencia de JSR 292 ( Compatibilidad con lenguajes con tipos dinámicos en la plataforma Java ). [1]

Historia

Antes de Java 7, la máquina virtual Java no tenía soporte integrado para lenguajes tipados dinámicamente :

JSR 292 ( Compatibilidad con lenguajes tipados dinámicamente en la plataforma Java ) [1] propone:

Tras el éxito de la implementación de JRuby en Java , el proyecto Da Vinci se inició a finales de enero de 2008. [6] Se planeó añadir las capacidades experimentadas por Da Vinci a Java 7. Su objetivo es crear prototipos de este JSR, pero también de otras extensiones de menor prioridad. [7] El primer prototipo funcional, desarrollado como un parche en OpenJDK , se anunció y se puso a disposición a finales de agosto de 2008. [8] [9] [10]

Desde entonces, el equipo de JRuby ha logrado conectar con éxito la invocación dinámica en su código base. La invocación dinámica se entregó con la versión 1.1.5 y se deshabilitará en las JVM sin invokedynamiccapacidades. [11]

Desde entonces, el proyecto se ha integrado en la base de código JDK 7 [12] y luego se ha integrado en la versión 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 necesitan poder usar compilación en tiempo real (en lugar de 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 lleva a que estas implementaciones tengan que crear muchos códigos de bytes diferentes para los diferentes contextos de una llamada de método, cada vez que cambia la firma de los argumentos .

Esto no solo utiliza mucha memoria, sino que también llena un área de memoria llamada Metaespacio (Generación Permanente anterior a Java 8), una parte del montón que utiliza la JVM para almacenar información sobre las 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]

La JSR 292 propone:

Véase también

Referencias

  1. ^ ab ver JSR 292
  2. ^ Nutter, Charles (3 de enero de 2007). "InvokeDynamic: ¿realmente útil?" . Consultado el 6 de febrero de 2008 .
  3. ^ ab Ed Ort (julio de 2009). "Nueva característica del JDK 7: compatibilidad con lenguajes tipados dinámicamente en la máquina virtual de Java" . Consultado el 26 de julio de 2009 .
  4. ^ Jeff Friesen (16 de diciembre de 2014). "Cómo invocar dynamic". JavaWorld . Consultado el 10 de junio de 2020 .
  5. ^ Rafael Winterhalter (2 de marzo de 2015). "Desmantelando invokedynamic". dzone.com . Consultado el 10 de junio de 2020 .
  6. ^ Krill, Paul (31 de enero de 2008). «Da Vinci Machine de Sun amplía la cobertura de JVM». Archivado desde el original el 28 de marzo de 2009. Consultado el 6 de febrero de 2008 .
  7. ^ "Subproyectos e investigaciones". Sun Microsystems . 2007 . Consultado el 6 de febrero de 2008 .
  8. ^ Rose, John (26 de agosto de 2008). "¡Feliz Día Internacional de la Invocación Dinámica!". Archivado desde el original el 3 de septiembre de 2008. Consultado el 3 de septiembre de 2008 .
  9. ^ Rose, John (2 de septiembre de 2008). "¡Feliz Día Internacional de la Invocación Dinámica!" . Consultado el 7 de septiembre de 2008 .
  10. ^ 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 .
  11. ^ Nutter, Charles (11 de septiembre de 2008). "Una primera muestra de InvokeDynamic" . Consultado el 13 de septiembre de 2008. ¡Me las arreglé para conectar InvokeDynamic directamente al proceso de envío de JRuby! ¡Qué emoción! El código ya está en el trunk de JRuby y se enviará con JRuby 1.1.5 (aunque obviamente se deshabilitará en las JVM sin InvokeDynamic).
  12. ^ Rose, John (22 de abril de 2009). "progreso: indy.patch -> JDK7" . Consultado el 30 de abril de 2009. La mayor parte de indy.patch ha ingresado a la máquina virtual JDK7 en el repositorio de integración de mi grupo de trabajo, hoy aproximadamente a las 4:00 a. m. (hora del Pacífico):
  13. ^ Nutter, Charles (11 de septiembre de 2008). "A First Taste of InvokeDynamic" (Una primera muestra de InvokeDynamic) . Consultado el 6 de febrero de 2008. El secreto sucio de varias implementaciones de JVM, incluida Hotspot, es que existe un montón separado (o una generación separada del montón) que se utiliza 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, ¿lo entiendes?) y, si no se usan con mucho, mucho cuidado, se llenarán(...)

Enlaces externos