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:
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.
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.
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 ).
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 .
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 jaotc
comando crea un ejecutable. [19] El indicador experimental -XX:+EnableJVMCIProduct
permite 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]
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.
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.
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.
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]
GraalVM se utiliza en varios escenarios industriales:
AOT presenta una nueva herramienta llamada 'jaotc' que utiliza Graal como backend (para generar código)
Compilar las clases Java de una aplicación en código nativo antes de iniciar la máquina virtual.
Compilar clases Java en código nativo antes de iniciar la máquina virtual.
JEP 317: Compilador JIT experimental basado en Java
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.
GraalVM ofrece un conjunto de herramientas para desarrolladores, integradores y administradores de TI para depurar y monitorizar GraalVM y las aplicaciones implementadas.
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.