# GraalVM

GraalVM é uma Java VM e JDK baseada em HotSpot / OpenJDK, implementada em Java . Ele oferece suporte a linguagens de programação e modos de execução adicionais, como compilação antecipada de aplicativos Java para inicialização rápida e baixo consumo de memória (Memory footprint) . A primeira versão pronta para produção, GraalVM 19.0, foi lançada em maio de 2019. Já a versão mais recente é a GraalVM 22.3.0, disponibilizada em 25 de outubro de 2022.
As maiores diferenciais do GraalVM em comparação com o JDK base são:
* GraalVM Compiler, um compilador JIT para Java
* GraalVM Native Image, permitindo a compilação antecipada de aplicações Java
* Truffle Language Implementation framework e GraalVM SDK, para implementar runtimes de linguagem de programação adicionais
* LLVM Runtime e JavaScript Runtime

## Objetivos do projeto

* Melhorar o desempenho das linguagens baseadas na máquina virtual Java para corresponder ao desempenho das linguagens nativas.
* Reduzir o tempo de inicialização de aplicativos baseados em JVM, compilando-os antecipadamente com a tecnologia GraalVM Native Image.
* Habilitar a integração do GraalVM no banco de dados Oracle, OpenJDK, Node.js, Android/iOS e oferecer suporte a incorporações personalizadas semelhantes.
* Para permitir a mistura livre de código de qualquer linguagem de programação em um único programa, anunciado como "aplicativos poliglotas ".
* Para incluir um conjunto facilmente estendido de " ferramentas de programação poliglota ".

## História

GraalVM tem suas raízes no projeto Maxine Virtual Machine no Sun Microsystems Laboratories (agora Oracle Labs ). O objetivo era escrever uma máquina virtual Java no próprio Java, esperando solucionar o desenvolvimento dos problemas do desenvolvimento em C++, particularmente o gerenciamento manual de memória, e se beneficiar de otimizações metacirculares . Ao perceber que escrever tudo em Java era uma tarefa bastante complicada para um primeiro passo, decidiu-se focar apenas no compilador e conectá-lo ao Hotspot, para reutilizar o máximo possível o tempo de execução do Hotspot. O compilador GraalVM foi iniciado convertendo manualmente o código do compilador cliente Hotspot (denominado "C1") em Java, substituindo o compilador Maxine anterior.
Graal foi incluído em versões de Java VM baseadas em HotSpot como OpenJDK de Java 9 a 15, a fim de oferecer suporte à compilação experimental antecipada. Ele foi removido no Java 16, pois manter a versão no JDK e o lançamento independente do GraalVM causava esforço duplicado. Uma funcionalidade semelhante para criar executáveis nativos a partir de projetos Java é fornecida pela ferramenta de imagem nativa de versões independentes do GraalVM.

## Lançamentos

GraalVM está disponível como Community Edition para uma licença de código aberto e como Oracle GraalVM Enterprise Edition acessível ao aceitar o "Contrato de Licença OTN Oracle GraalVM Enterprise Edition Incluindo Licença para Versões de Adoção Inicial". A Oracle Corporation anunciou o lançamento do Oracle GraalVM Enterprise Edition em 8 de maio de 2019. GraalVM pode substituir um JDK padrão em plataformas Linux e macOS em sistemas x86 de 64 bits.

### Graal VM 22

GraalVM 22.3.0 GraalVM 22.3.0 foi lançado em outubro de 2022.
GraalVM 22.2.0 GraalVM 22.2.0 foi lançado em julho de 2022.
GraalVM 22.1.0 GraalVM 22.1.0 foi lançado em abril de 2022.
GraalVM 22.0.0 GraalVM 22.0.0 foi lançado em janeiro de 2022.

### Graal VM 20

GraalVM 20.3.0 foi lançado em novembro de 2020. Foi marcada como a primeira versão corporativa LTS do GraalVM e como o lançamento final para 2020. Esta versão suporta compartilhamento de código no tempo de execução GraalVM LLVM, permitindo que o AST e o código compilado de bibliotecas de bitcode comuns sejam compartilhados entre vários contextos em um único mecanismo.
GraalVM 20.3.0 foi lançado em novembro de 2020. Foi marcada como a primeira versão corporativa LTS do GraalVM e como o lançamento final para 2020. Esta versão suporta compartilhamento de código no tempo de execução GraalVM LLVM, permitindo que o AST e o código compilado de bibliotecas de bitcode comuns sejam compartilhados entre vários contextos em um único mecanismo.
Graal VM 20.1.0
GraalVM 20.1.0 foi lançado em maio de 2020. Ele incluiu várias melhorias para muitos dos componentes. Além das melhorias de desempenho, foram publicadas correções de usabilidade para imagens nativas . O mecanismo JavaScript oferece suporte a todos os recursos do modo ECMAScript 2020 por padrão. O mecanismo de expressão regular ( TRegex ) usado por JavaScript e Python suporta todas as expressões agora. Ruby ( TruffleRuby ) melhorado em compatibilidade com gems nativas.
Graal VM 20.0.0
GraalVM 20.0.0 foi lançado em fevereiro de 2020. Ele melhorou em seu suporte ao Windows, trouxe uma ferramenta de imagem nativa aprimorada e melhorou o suporte de ferramentas, entre muitas alterações detalhadas no compilador e nas linguagens suportadas.

### Graal VM 19

Graal VM 19.0.0
O suporte no Windows está atualmente em desenvolvimento e lançado como uma funcionalidade de adoção inicial no GraalVM 19.0.
O GraalVM 19.0 é baseado no JDK versão 8u212.

## Componentes

O compilador GraalVM é enviado com os componentes de uma máquina virtual Java normal ( OpenJDK ). Componentes adicionais estão incluídos no GraalVM para suportar novos modos de execução ( GraalVM Native Image ) ou linguagens de programação ( LLVM runtime, GraalVM JavaScript como um possível substituto para o obsoleto mecanismo Nashorn, TRegex como um mecanismo de expressão regular ).

### GraalVM Compiler

O GraalVM Compiler é um moderno compilador Java just-in-time . Ele complementa ou substitui os compiladores existentes (C1/C2 em HotSpot ). Em contraste com os compiladores existentes, o compilador GraalVM é escrito de maneira modular, sustentável e extensível no próprio Java.
É lançado sob GPL versão 2 com a exceção de classpath .

### GraalVM Native Image

GraalVM Native Image é uma tecnologia de compilação avançada que produz binários executáveis de arquivos de classe. Ele é lançado como um plug-in de adoção inicial, o que significa que está pronto para produção, mas pode incluir atualizações incompatíveis de backport em versões futuras.
Esta funcionalidade suporta linguagens baseadas em JVM, mas opcionalmente pode executar linguagens dinâmicas, desenvolvidas sobre GraalVM com framework Truffle. O arquivo executável não é executado em uma JVM e usa componentes de tempo de execução necessários como agendamento de encadeamento ou GC de “Substrate VM” - uma versão trivial de uma máquina virtual. Como o binário nativo resultante já inclui classes de aplicativos, dependências JDK e bibliotecas, o tempo de inicialização e execução é reduzido significativamente.
GraalVM Native Image é oficialmente suportado pelos frameworks Fn, Gluon, Helidon, Micronaut, Picocli, Quarkus, Vert.x e Spring Boot Java. Em setembro de 2016, a Oracle detalhou planos para adicionar compilação antecipada ao OpenJDK usando o compilador GraalVM para Java 9 . Esta proposta, rastreada pela JEP 295: Ahead-of-Time Compilation, foi incluída no Java 9. O uso experimental do GraalVM como um compilador just-in-time foi adicionado para a plataforma Linux x86-64 para Java 10 .
Nas versões 9 a 15 do JDK, o comando jaotc cria uma imagem nativa. O sinalizador experimental -XX:+EnableJVMCIProduct habilita o uso do Graal JIT. Desde então, a funcionalidade está disponível no componente de imagem nativa das versões autônomas do GraalVM.

### Truffle Language Implementation Framework

Em associação com o GraalVM, o Oracle Labs desenvolveu um interpretador de árvore de sintaxe abstrata de linguagem chamado "Truffle" que permitiria a implementação de linguagens sobre o GraalVM. Muitas linguagens foram implementadas no Truffle, incluindo um interpretador C que afirma ser tão rápido quanto o GCC e o Clang .
O framework Truffle e sua parte dependente, GraalVM SDK, são lançados sob a Licença Permissiva Universal, versão 1.0, para encorajar o uso do framework para projetos que não querem estar vinculados aos direitos autorais ou outros direitos dos pais.

### Suporte de ferramenta baseado em instrumentação

Uma grande vantagem do ecossistema GraalVM é o suporte de instrumentação totalmente dinâmica e independente de linguagem integrada diretamente no tempo de execução da VM. Eventos de execução podem ser capturados por clientes de API com sobrecarga extremamente baixa em código totalmente otimizado.
A instalação principal do GraalVM fornece um depurador independente de idioma, criador de perfil, visualizador de heap e outros com base em instrumentação e outro suporte de VM. O GraalVM também inclui uma implementação de back-end do protocolo de depuração remota do Chrome Inspector. Embora projetado originalmente para depuração de JavaScript, ele pode ser usado para depurar todas as linguagens GraalVM a partir de um navegador.

## Suporte de linguagens e tempo de execução

GraalVM é escrito em e para o ecossistema Java . Ele pode executar aplicações escritas em todas as linguagens que compilam no formato Java bytecode, por exemplo Java, Scala, Kotlin e muito mais.
Com base na estrutura de implementação de linguagem Truffle, idiomas adicionais podem ser suportados no GraalVM.
* GraalVM JavaScript: JavaScript runtime compatível com ECMAScript 2021, com suporte para Node.js
* TruffleRuby: Implementação da linguagem Ruby com suporte preliminar para Ruby on Rails
* FastR: Implementação da linguagem R
* GraalVM Python: Implementação da linguagem Python 3
* GraalVM LLVM Runtime ( SuLong ): Implementação do interpretador de bitcode LLVM
* GraalWasm: Uma implementação WebAssembly
O suporte para idiomas adicionais pode ser implementado pelos usuários do GraalVM. Algumas implementações importantes para linguagem de terceiros são grCuda, SOMns, TruffleSqueak, e Yona.