{"id":25111,"date":"2022-06-14T09:41:44","date_gmt":"2022-06-14T07:41:44","guid":{"rendered":"https:\/\/www.makingscience.com\/?p=25111"},"modified":"2022-06-14T09:41:44","modified_gmt":"2022-06-14T07:41:44","slug":"graalvm-y-las-imagenes-nativas","status":"publish","type":"post","link":"https:\/\/www.makingscience.com\/es\/blog\/graalvm-y-las-imagenes-nativas\/","title":{"rendered":"GraalVM y las im\u00e1genes nativas"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">GraalVM, es una m\u00e1quina virtual creada por Oracle Labs como podr\u00eda serlo la tradicional JVM. No obstante, cabe destacar algunas mejoras. En primer lugar, es pol\u00edglota, es decir, una m\u00e1quina virtual capaz de ejecutar c\u00f3digo en diversos lenguajes de programaci\u00f3n. Por otro lado, incorpora un nuevo concepto de compilador de tipo AOT (ahead of time) que predice todo lo que nuestro c\u00f3digo necesitar\u00e1 para ejecutarse. Esto \u00faltimo podr\u00eda pasar desapercibido hasta que hablemos de la utilidad de \u201cnative images\u201d que veremos m\u00e1s adelante.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Desde Java 8 tenemos la posibilidad de probar este nuevo concepto de trabajo, aunque el JDK se presenta con la JVM tradicional, trae consigo algunos features espec\u00edficos para trabajar con Graal.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-25112\" src=\"https:\/\/www.makingscience.com\/wp-content\/uploads\/1\/2022\/06\/Captura-de-pantalla-2022-06-14-a-las-8.47.46-1024x451.png\" alt=\"\" width=\"600\" height=\"264\" \/><\/span><\/p>\n<p><span style=\"font-weight: 400;\">Si bien la JVM tradicional nos deja trabajar con lenguajes como Java, Groove, Scala y Kotlin, Graal nos permite incorporar Node, JS, Ruby, Python, R y C++ entre otros.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><img decoding=\"async\" class=\"alignnone wp-image-25117\" src=\"https:\/\/www.makingscience.com\/wp-content\/uploads\/1\/2022\/06\/Captura-de-pantalla-2022-06-14-a-las-8.47.52-1024x430.png\" alt=\"\" width=\"588\" height=\"247\" \/><\/span><\/p>\n<p><span style=\"font-weight: 400;\"><strong>La forma m\u00e1s simple de entender el concepto de Graal es verla como una JVM vitaminada<\/strong> que en el proceso de compilaci\u00f3n aplica ciertas optimizaciones que, dependiendo de los casos de uso, hacen que el rendimiento de los programas sea significativamente mejor. Es en los programas de larga ejecuci\u00f3n donde se aprecian las mejoras de rendimiento de Graal.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><strong>\u00bfEn qu\u00e9 consiste?<\/strong><\/h3>\n<p><span style=\"font-weight: 400;\">Antes de seguir adelante es importante aclarar que, en definitiva, <strong>GraalVM es un conjunto de herramientas que puede ser utilizado de diversas formas.<\/strong><\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><strong>1.<\/strong> Graal puede entenderse como un<strong> compilador de c\u00f3digo Java tradicional,<\/strong> con la diferencia que podemos \u201celegir\u201d c\u00f3mo compilar ese c\u00f3digo ya que nos deja usar el tipo de compilaci\u00f3n JIT (just in time) o el nuevo AOT (ahead of time).<\/span><\/p>\n<p><strong>2.<\/strong> <strong>SubstrateVM es un runtime necesario para ejecutar el AOT compiler de la JVM<\/strong> y generar las im\u00e1genes nativas.<\/p>\n<p><span style=\"font-weight: 400;\"><strong>3. Truffle es un framework usado dentro de GraalVM como interprete de otros lenguajes como Ruby, R, Python,<\/strong> entre otros.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><strong>4. GraalVM:<\/strong> <strong>el paquete completo de tecnolog\u00edas que puede ser utilizado para diversos casos de uso,<\/strong> ejecutar c\u00f3digo Java compilado con JIT, con AOT, ejecutar otros lenguajes, ejecutar c\u00f3digo mezclando lenguajes, etc.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Native Images<\/strong><\/h3>\n<p><span style=\"font-weight: 400;\">La ejecuci\u00f3n de una aplicaci\u00f3n dentro de una m\u00e1quina virtual Java conlleva costos de inicio y de espacio. <strong>GraalVM tiene la capacidad, junto con Substrate VM de crear im\u00e1genes nativas.<\/strong> En el proceso de generaci\u00f3n de im\u00e1genes nativas emplea un an\u00e1lisis est\u00e1tico para encontrar cualquier c\u00f3digo accesible desde el m\u00e9todo principal de Java y luego realiza una compilaci\u00f3n completa con anticipaci\u00f3n (AOT). El binario nativo resultante contiene todo el programa en forma de c\u00f3digo m\u00e1quina para su ejecuci\u00f3n inmediata.\u00a0 As\u00ed, con Graal, <strong>podemos crear im\u00e1genes nativas para procesos que requieren un startup r\u00e1pido y adem\u00e1s con la m\u00ednima necesidad de dependencias ya que, como hemos dicho, todo se traduce en lenguaje nativo.<\/strong><\/span><\/p>\n<p><span style=\"font-weight: 400;\"><strong>Crear im\u00e1genes nativas significa crear un ejecutable self-contained,<\/strong> es decir, que contenga todas las herramientas y librer\u00edas necesarias para ser ejecutado sin necesidad de nada m\u00e1s. Generando im\u00e1genes nativas, no necesitar\u00edamos ning\u00fan runtime espec\u00edfico para que un programa pueda ser ejecutado.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">La herramienta de Graal que hace uso del compilador \u201cahead of time\u201d y nos permite generar este tipo de ejecutables es \u201cnative-images\u201d. Esta se encarga de analizar todas las clases necesarias, y analiza todos los m\u00e9todos que ser\u00e1n utilizados durante la ejecuci\u00f3n dando como resultado un ejecutable hecho a medida para la arquitectura del sistema operativo que la ha generado.\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Dockerizar im\u00e1genes nativas<\/strong><\/h3>\n<p><span style=\"font-weight: 400;\">En primer lugar, podr\u00edamos pensar que al generar una imagen nativa, <strong>podemos copiar el ejecutable dentro de una imagen Docker y simplemente ejecutarla,<\/strong> pues como hemos dicho no nos hace falta absolutamente mas nada ya que todas las clases y dependencias est\u00e1n auto-contenidas en el ejecutable. No obstante, es importante tener en cuenta que cuando se genera una imagen nativa esta no es cross-platform. Es decir,<strong> si he generado mi imagen en una plataforma espec\u00edfica, por ejemplo macOS, cuando intente ejecutar esta imagen dentro de un contenedor Linux, esta no funcionar\u00e1.<\/strong><\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><img decoding=\"async\" class=\"alignnone wp-image-25122\" src=\"https:\/\/www.makingscience.com\/wp-content\/uploads\/1\/2022\/06\/Captura-de-pantalla-2022-06-14-a-las-8.48.01-1024x605.png\" alt=\"\" width=\"481\" height=\"284\" \/><\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para ello, la imagen nativa deber\u00e1 generarse dentro de un contenedor Linux que, por supuesto tambi\u00e9n tenga GraalVM y native-images. Despu\u00e9s de generarla, ser\u00eda tan sencillo como copiar este ejecutable a otro contenedor con la misma arquitectura y lo m\u00e1s minimalista posible.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">Las limitaciones que podemos encontrarnos respecto a la creaci\u00f3n de im\u00e1genes nativas son debidas a las implicaciones que tiene usar un compilador de tipo \u201cahead of time\u201d. Es decir, compilar asumiendo un escenario cerrado. Entre las limitaciones m\u00e1s conocidas se encuentran el uso de clases Java que usen reflection y proxys din\u00e1micos. Estas limitaciones, no obstante, pueden mitigarse con configuraciones avanzadas.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<h3><strong>El siguiente paso<\/strong><\/h3>\n<p><span style=\"font-weight: 400;\">Dado a que el recibimiento de la comunidad ante Graal y todo lo que implica ha sido bastante exitoso, no han tardado en surgir nuevos frameworks para facilitar la utilizaci\u00f3n de todo lo que Graal nos propone.<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\"><strong>Micronaut:<\/strong> Framework basado en Java para crear aplicaciones y micro-servicios ligeros y modulares con un startup r\u00e1pido.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\"><strong>SpringNative<\/strong>: Framework para compilar aplicaciones tradicionales de Spring en ejecutables nativos haciendo uso del native-images de Graal.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\"><strong>Quarkus:<\/strong> Framework enfocado espec\u00edficamente a contenedores y aplicaciones Cloud y serverless de enfoque nativo.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">La posibilidad de probar las funcionalidades de Graal vienen incorporadas desde el JDK 8, por lo tanto, es solo cuesti\u00f3n de configurar los comandos java tradicionales para empezar a experimentar con sus funcionalidades.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>GraalVM, es una m\u00e1quina virtual creada por Oracle Labs como podr\u00eda serlo la tradicional JVM. No obstante, cabe destacar algunas mejoras. En primer lugar, es pol\u00edglota, es decir, una m\u00e1quina virtual capaz de ejecutar c\u00f3digo en diversos lenguajes de programaci\u00f3n. Por otro lado, incorpora un nuevo concepto de compilador de tipo AOT (ahead of time) [&hellip;]<\/p>\n","protected":false},"author":40,"featured_media":25133,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[34],"tags":[313],"class_list":["post-25111","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology-ai","tag-graalvm"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/posts\/25111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/comments?post=25111"}],"version-history":[{"count":0,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/posts\/25111\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/media\/25133"}],"wp:attachment":[{"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/media?parent=25111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/categories?post=25111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/tags?post=25111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}