stringtranslate.com

GraalVM

GraalVM es un kit de desarrollo de Java (JDK) escrito en Java. La distribución de código abierto de GraalVM se basa en OpenJDK y la distribución empresarial se basa en Oracle JDK. Además de la compilación en tiempo real (JIT) , GraalVM puede compilar una aplicación Java con anticipación. Esto permite una inicialización más rápida, un mayor rendimiento en tiempo de ejecución y un menor consumo de recursos, pero el ejecutable resultante solo puede ejecutarse en la plataforma para la que fue compilado.

Proporciona lenguajes de programación y modos de ejecución adicionales. La primera versión lista para producción, GraalVM 19.0, se distribuyó en mayo de 2019. [4] La versión más reciente es GraalVM para JDK 22, que estará disponible en marzo de 2024. [5]

Los principales diferenciadores de GraalVM en comparación con el JDK base incluyen:

Objetivos

Historia

GraalVM tiene sus raíces en el proyecto Maxine Virtual Machine de Sun Microsystems Laboratories (ahora Oracle Labs ). El objetivo del proyecto era escribir una máquina virtual Java en Java para evitar los problemas de desarrollo en C++, en particular la gestión manual de la memoria, y beneficiarse de las optimizaciones metacirculares . El proyecto cambió su enfoque al compilador y a conectarlo al entorno de ejecución de HotSpot tanto como fuera posible. El compilador GraalVM, Graal, se inició convirtiendo manualmente el código del compilador del cliente HotSpot (llamado "C1") en Java, reemplazando al compilador Maxine anterior. [9]

Graal se incluyó en las versiones JDK basadas en HotSpot, como OpenJDK, desde Java SE 9 hasta 15, para proporcionar una compilación experimental anticipada. La opción UseJVMCICompiler también permitió el uso de Graal como reemplazo del compilador de servidor (llamado "C2"). [10] La opción se eliminó en Java SE 16 para eliminar el esfuerzo duplicado de mantener una versión en el JDK y una versión independiente de GraalVM. La herramienta de versiones independientes de GraalVM proporciona una función similar para crear un ejecutable nativo a partir de una aplicación Java native-image. La herramienta procesa las clases de una aplicación Java y otros metadatos para crear un binario para un sistema operativo y una arquitectura específicos. Se puede utilizar para crear un ejecutable nativo o una biblioteca compartida nativa.

Lanzamientos

GraalVM está disponible como Oracle GraalVM bajo la licencia GraalVM Free Terms and Conditions (GFTC), como Oracle GraalVM Enterprise Edition accesible al aceptar el "Acuerdo de licencia OTN Oracle GraalVM Enterprise Edition que incluye licencia para versiones de adopción temprana", [11] o como Community Edition con una licencia de código abierto. Oracle Corporation anunció el lanzamiento de Oracle GraalVM Enterprise Edition el 8 de mayo de 2019 y Oracle GraalVM el 13 de junio de 2023, introduciendo una nueva licencia GraalVM Free Terms and Conditions (GFTC). GraalVM puede sustituir a un JDK predeterminado en plataformas Linux y macOS en CPU x64 y AArch64, y en una plataforma Windows x64. El cronograma de lanzamiento se encuentra en el Centro de ayuda de Oracle y el sitio web de GraalVM.

Componentes

El compilador GraalVM, Graal, se entrega con los componentes de una máquina virtual Java normal ( OpenJDK ). Se incluyen componentes adicionales en GraalVM para habilitar nuevos modos de ejecución ( GraalVM Native Image ) o lenguajes de programación ( LLVM runtime , GraalVM JavaScript como posible reemplazo del obsoleto motor Nashorn , TRegex como motor de expresiones regulares ).

Compilador GraalVM

El compilador GraalVM, Graal, es un compilador Java (JIT) moderno . Complementa o reemplaza a los compiladores existentes (C1/C2 en HotSpot ). A diferencia de esos compiladores existentes, Graal está escrito de manera modular, mantenible y extensible en Java. Se publica bajo la versión 2 de GPL con la excepción de classpath .

Imagen nativa de GraalVM

GraalVM Native Image es una tecnología de compilación avanzada que produce binarios ejecutables de archivos de clase. [12] Se lanza como una tecnología de adopción temprana, lo que significa que está lista para producción, pero puede incluir actualizaciones incompatibles con el backport en futuras versiones.

Esta funcionalidad admite lenguajes basados ​​en JVM, pero opcionalmente puede ejecutar lenguajes dinámicos, desarrollados sobre GraalVM con el marco Truffle. El archivo ejecutable no se ejecuta en una JVM y utiliza los componentes de tiempo de ejecución necesarios, como la programación de subprocesos o la recolección de basura, desde una máquina virtual mínima y personalizada llamada Substrate VM. Dado que el binario nativo resultante ya incluye clases de aplicación, dependencias y bibliotecas de JDK, el tiempo de inicio y ejecución se reduce significativamente.

La imagen nativa de GraalVM es compatible oficialmente con los marcos de trabajo Java Fn, Gluon, Helidon, Micronaut , Picocli, Quarkus , Vert.x y Spring Boot . [13] [14]

En septiembre de 2016, Oracle detalló los planes para agregar compilación anticipada al OpenJDK usando el compilador GraalVM para Java SE 9. [ 15] [16] Esta propuesta, seguida por JEP 295: Compilación anticipada, se incluyó en Java SE 9. [17] El uso experimental de GraalVM como compilador justo a tiempo se agregó para la plataforma Linux x64 para Java SE 10. [ 18]

En las versiones 9 a 15 de Java SE, el jaotccomando crea un ejecutable. [19] El indicador experimental -XX:+EnableJVMCIProductpermite el uso del compilador JIT de Graal. [20] La funcionalidad está disponible desde entonces en el componente Native Image de las versiones independientes de GraalVM. [21]

Marco de implementación del lenguaje Truffle

En asociación con GraalVM, Oracle Labs desarrolló un intérprete de árbol de sintaxis abstracta (AST) de lenguaje llamado "Truffle" que le permitiría implementar lenguajes sobre GraalVM. [22] [23] Se han implementado muchos lenguajes en Truffle, incluido un intérprete de C que afirma ser tan rápido como GCC y Clang . [24]

El marco Truffle y su parte dependiente, GraalVM SDK, se publican bajo la Licencia Permisiva Universal, versión 1.0, para fomentar el uso del marco en proyectos que no quieran estar sujetos a los derechos de autor u otros derechos principales.

Soporte de herramientas basado en instrumentación

Una de las principales ventajas del ecosistema GraalVM es la compatibilidad con instrumentación totalmente dinámica, independiente del lenguaje , integrada directamente en el entorno de ejecución de la máquina virtual. Los clientes de API pueden capturar eventos de ejecución con una sobrecarga extremadamente baja en un código totalmente optimizado. [25] [26]

La instalación principal de GraalVM proporciona un depurador, un generador de perfiles, un visualizador de montón y otros elementos independientes del lenguaje basados ​​en la instrumentación y otros soportes de VM. [27] GraalVM también incluye una implementación de backend del protocolo de depuración remota Chrome Inspector. [28] Aunque fue diseñado originalmente para la depuración de JavaScript, se puede utilizar para depurar todos los lenguajes de GraalVM desde un navegador.

Incorporación de idiomas

Otra ventaja de GraalVM es la posibilidad de incrustar código de un lenguaje invitado en Java y escribir aplicaciones "políglotas". [8] Un desarrollador puede integrar JavaScript, Python u otros lenguajes compatibles dentro del código fuente de Java, otorgándoles las ventajas características de esos lenguajes. Una aplicación Java anfitriona y un lenguaje invitado pasan datos de ida y vuelta en el mismo espacio de memoria. Esto es posible gracias al marco de implementación del lenguaje Truffle [29] y la API poliglota de GraalVM. A continuación se muestra un ejemplo de cómo llamar a una función definida en Python desde Java:

intentar ( Contexto contexto = Contexto . crear ()) {      Función valor = contexto.eval ( "python" , "lambda x : x + 1" ) ;     función assert .canExecute ( );  int x = función . ejecutar ( 41 ). asInt ();    afirmar x == 42 ;   }

La función Python incrementa en una unidad el valor proporcionado y luego lo devuelve al lenguaje anfitrión. En Java, por motivos de seguridad, primero preguntamos si la función variable se puede ejecutar mediante la canExecute()llamada y luego invocamos la función con la execute()llamada. Encuentre más ejemplos en la documentación de referencia de lenguajes de incrustación.

Compatibilidad con lenguaje y tiempo de ejecución

GraalVM está escrito en y para el ecosistema Java . Puede ejecutar aplicaciones escritas en todos los lenguajes que compilan en formato de bytecode de Java , por ejemplo, Java, Scala , Kotlin y más.

Basados ​​en el marco de implementación del lenguaje Truffle, los siguientes lenguajes adicionales están diseñados para usarse con GraalVM:

Los usuarios de GraalVM pueden implementar compatibilidad con idiomas adicionales. Algunas implementaciones de lenguajes de terceros notables son grCuda, [37] SOMns, [38] TruffleSqueak, [39] [40] y Yona. [41]

Adopción

GraalVM se utiliza en varios escenarios industriales:

Referencias

  1. ^ "Descargas".
  2. ^ "Preguntas frecuentes sobre GraalVM". Archivado desde el original el 13 de abril de 2020. Consultado el 25 de abril de 2018 .
  3. ^ "graal/README.md". GitHub . Consultado el 25 de abril de 2018 .
  4. ^ "Para crear programas que se ejecuten más rápido en cualquier lugar: Oracle GraalVM Enterprise Edition". Oracle Corporation . Consultado el 21 de enero de 2022 .
  5. ^ "Notas de la versión de GraalVM para JDK 22". Notas de la versión de GraalVM para JDK 22 . Oracle Corporation . Consultado el 26 de marzo de 2024 .
  6. ^ ab "Por qué GraalVM" . Consultado el 25 de abril de 2018 .
  7. ^ "Graal: un compilador dinámico para Java". limondeinformatique.fr. 2012-02-13 . Consultado el 23 de agosto de 2013 .
  8. ^ ab "Manual de referencia para aplicaciones políglotas". Archivado desde el original el 23 de octubre de 2020. Consultado el 25 de abril de 2018 .
  9. ^ ""La metacircularidad está cerca", GraalVM, Truffle--airhacks.fm podcast: blog de Adam Bien". Archivado desde el original el 29 de mayo de 2020.
  10. ^ "OpenJDK: Graal".
  11. ^ https://www.oracle.com/technetwork/licenses/graalvm-otn-license-5486575.html [ URL básica ]
  12. ^ "Imágenes nativas". www.graalvm.org . Archivado desde el original el 20 de abril de 2018.
  13. ^ "Ecosistema de código abierto GraalVM". Oracle Corporation . Consultado el 11 de septiembre de 2019 .
  14. ^ "Documentación de Spring Native Image". Spring Framework . Consultado el 26 de octubre de 2021 .
  15. ^ "La compilación anticipada (AOT) puede llegar a OpenJDK HotSpot en Java 9". InfoQ.com. 2016-10-01 . Consultado el 2016-10-06 . AOT presenta una nueva herramienta llamada 'jaotc' que utiliza Graal como backend (para generar código)
  16. ^ Vladimir Kozlov (14 de septiembre de 2016). "JDK-8166089: Compilación anticipada". Oracle Corporation . Consultado el 6 de octubre de 2016. Compilar las clases Java de una aplicación en código nativo antes de iniciar la máquina virtual.
  17. ^ Vladimir Kozlov (13 de octubre de 2016). "JEP 295: Compilación anticipada". Oracle Corporation . Consultado el 13 de octubre de 2016. Compilar clases Java en código nativo antes de iniciar la máquina virtual.
  18. ^ Vladimir Kozlov (2017-10-20). "JEP 317: Compilador JIT experimental basado en Java". Oracle Corporation . Consultado el 21 de enero de 2018. JEP 317: Compilador JIT experimental basado en Java
  19. ^ "OpenJDK: Graal". openjdk.java.net .
  20. ^ "[JDK-8232118] Agregar opción JVM para habilitar compiladores JVMCI en modo de producto". bugs.openjdk.java.net .
  21. ^ "GraalVM: Manual de referencia: Imagen nativa". graalvm.org .
  22. ^ "Truffle: un sistema de ejecución en tiempo de ejecución con optimización automática" (PDF) . Oracle Corporation . Consultado el 23 de agosto de 2013 .
  23. ^ "Trufa servida en un Santo Grial: Graal y Trufa para la interpretación de lenguas políglotas en la JVM". 2017-12-05 . Consultado el 2018-04-25 .
  24. ^ "Trufa: lenguajes y materiales". Gist .
  25. ^ Van De Vanter, Michael; Seaton, Chris; Haupt, Michael; Humer, Christian; Würthinger, Thomas (9 de marzo de 2018). "Soporte de instrumentación rápido, flexible y políglota para depuradores y otras herramientas". El arte, la ciencia y la ingeniería de la programación . 2 (3, artículo 14): 30. arXiv : 1803.10201 . doi :10.22152/programming-journal.org/2018/2/14. S2CID  4382172.
  26. ^ "Introducción a los instrumentos en GraalVM". www.graalvm.org . Consultado el 8 de abril de 2019 . Los instrumentos de Truffle pueden realizar un seguimiento de eventos de ejecución de nivel de máquina virtual de grano muy fino para perfilar, inspeccionar y analizar el comportamiento de ejecución de las aplicaciones que se ejecutan en GraalVM.
  27. ^ "Herramientas de depuración y monitorización de GraalVM". www.graalvm.org . Archivado desde el original el 25 de abril de 2019 . Consultado el 8 de abril de 2019 . GraalVM ofrece un conjunto de herramientas para desarrolladores, integradores y administradores de TI para depurar y monitorizar GraalVM y las aplicaciones implementadas.
  28. ^ "Chrome DevTools". developer.google.com . Consultado el 8 de abril de 2019. Chrome DevTools es un conjunto de herramientas para desarrolladores web integradas directamente en el navegador Google Chrome. DevTools puede ayudarte a editar páginas sobre la marcha y diagnosticar problemas rápidamente, lo que, en última instancia, te ayuda a crear mejores sitios web, más rápido.
  29. ^ "Truffle: un sistema de ejecución en tiempo de ejecución con optimización automática" (PDF) . Oracle Corporation . Consultado el 23 de agosto de 2013 .
  30. ^ Repositorio de JavaScript de GraalVM en Github
  31. ^ Repositorio de Github de GraalPython
  32. ^ Repositorio de Github de GraalVM LLVM Runtime
  33. ^ "Repositorio de Github de GraalWasm". GitHub .
  34. ^ Prokopec, Aleksandar (2 de diciembre de 2019). "Anuncio de GraalWasm, un motor WebAssembly en GraalVM". Medium . Consultado el 15 de enero de 2020 .
  35. ^ Repositorio de Github de TruffleRuby
  36. ^ Repositorio github GraalVM FastR
  37. ^ Repositorio de GitHub grCuda
  38. ^ Repositorio de GitHub de SOMns
  39. ^ Repositorio de GitHub de TruffleSqueak
  40. ^ Niephaus, Fabio; Felgentreff, Tim; Hirschfeld, Robert (2019). "GraalSqueak: Hacia una plataforma de herramientas basada en Smalltalk para programación políglota". Actas de la 16.ª Conferencia internacional ACM SIGPLAN sobre lenguajes de programación gestionados y tiempos de ejecución - MPLR 2019. Biblioteca digital ACM. págs. 14–26. doi :10.1145/3357390.3361024. ISBN 9781450369770. S2CID  204728643 . Consultado el 8 de noviembre de 2020 .
  41. ^ Idioma Yona
  42. ^ "Mejora de la productividad de los desarrolladores en Disney con código abierto y sin servidor | Blog de código abierto de AWS". aws.amazon.com . 2022-11-09 . Consultado el 2023-07-05 .
  43. ^ "GraalVM en Facebook". 10 de julio de 2021.
  44. ^ "Cómo Oracle GraalVM potenció la plataforma de microservicios de Twitter" (PDF) .
  45. ^ "¿Una máquina virtual para gobernarlos a todos? Lecciones aprendidas con GraalVM | Curry On London! 2019". www.curry-on.org . Consultado el 5 de julio de 2023 .

Enlaces externos