GraalVM, le futur des applications microservices en Java
Cet article est le deuxième d’une série abordant les concepts introduits dans GraalVM et en quoi ils changent la donne pour utilser Java en tant que langage de programmation dans les architectures microservices.
GraalVM, une nouvelle génération de machine virtuelle
Qu’est-ce que c’est ?
- GraalVM est une Machine Virtuelle (VM), Open Source, issue d’un projet de recherche chez Oracle Labs.
Elle est maintenue par une communauté d’acteurs majeurs du net (Oracle, Amazon, Twitter, RedHat notamment avec Quarkus, VMWare pour l’intégration de son framework Spring, …).
C’est une nouvelle génération de VM, polyglotte, c’est à dire qu’elle supporte de nombreux langages, même ceux qui ne génèrent pas de bytecode. A terme, elle pourrait remplacer l’actuelle VM HotSpot.
- Plus de détails sur https://www.graalvm.org/
En quelques mots
La VM GraalVM est couplée à un nouveau compilateur, Graal
, écrit entièrement en Java (ce qui permet une compilation cyclique) :
- Il vise Ă remplacer le compilateur
C2
utilisé pour le JIT de la VM HotSpot et qui est arrivé en fin de vie car trop complexe à faire évoluer (mélange d’assembleur, C, Java) - Le compilateur Graal peut aussi faire de la compilation
AOT
(Ahead-Of-Time, à l’avance) aussi appelée compilation anticipée.
L’architecture de GraalVM
1. Le compilateur Graal
- Il compile en Bytecode les langages pour JVM.
- Intégré à la JVM, il est capable de faire de la compilation JIT.
- Il peut aussi faire de la compilation AOT.
2. Le framework Truffle
- Il permet de décrire, sous la forme d’un Abstract Syntax Tree (AST ou Arbre Syntaxique), la grammaire de langages inconnus de la JVM.
- Le compilateur Graal, à l’aide des modules Truffle de chaque langage, est capable d’interagir avec eux.
- L’API Polyglot, écrite en Java, permet de faire passer des messages de Java vers les autres langages et d’interagir avec eux.
Exemple de modules Truffle
Graal.js
définie l’AST de JavaScript.Sulong
implémente l’AST du bitcode LLVM (C, C++, Rust, Objective-C, Fortran, Mono,…)- Autres modules en cours d’implémentation :
WebAssembly
(pour les applications web),CUDA
(pour les cartes graphiques NVidia),…
3. La Machine Virtuelle
Deux JVMs peuvent être intégrées à GraalVM en tant que Machine Virtuelle :
- Par défaut, c’est la JVM HotSpot qui exécute le bytecode des programmes Java. Mais c’est le compilateur Graal qui intervient dans la compilation JIT.
- On peut aussi installer la machine virtuelle SubstrateVM, incluse dans le module nativeimage. C’est cette VM minimaliste qui offre la compilation AOT.
4. Les Runtimes
- Ils permettent d’exécuter les langages autres que ceux pris en charge par les JVMs (la JVM HotSpot comme la SubstrateVM).
- Les runtimes
node.js
(ECMAScript compliant) etllvm
font partie de l’installation standard. - Les autres runtimes doivent être installés explicitement : l’interpréteur Python 3.7, celui de Ruby 2.6.5 ou encore de GNU R 3.6.1.
Les composants de GraalVM :
Composants Core :
- la JVM GraalVM,
- le compilateur Graal,
- un runtime LLVM,
- un runtime JavaScript qui prend en charge Node.js
Des runtimes optionnels :
- Native Image qui intègre le compilateur ahead-of-time (AOT)
- LLVM toolchain
- Python interpreter
- Ruby interpreter
- R interpreter
- WebAssembly interpreter (Wasm)
Et alors ?
On est en droit de se demander à présent, en quoi cela change la donne pour Java et les microservices.
Certes, il nous fallait passer par cette présentation théorique mais déjà , on peut appréhender tout le potentiel d’une telle refonte :
- Un nouveau compilateur, plus efficace,
- La possibilité de compiler son application directement en code natif,
- La capacité d’intégrer de multiples langages à son application Java,…
Reste à voir en pratique le résultat. C’est ce que nous ferons dans l’article suivant.
Cheers…