Interprétés : PHP, JavaScript, Lua, Python
- on ne va pas créer une binaire
- le code est lu par un programme qui va interprêter le code directement
- généralement portable entre différente plateforme
Compilés : C/C++, Ada
- le binaire n'est pas portable mais dédié à une plateforme
- le binaire est composé d'instruction machine
- c'est plus rapide
https://unsplash.com/photos/5N75xeV9x9Q
- on compile mais vers un bytecode
- ce bytecode sera compilé une seconde fois via un JIT à l'exécution
- le bytecode n'est pas du java, c'est des instructions proche d'un assembleur
- le jar est juste une archive zip avec des conventions
https://unsplash.com/photos/LmQRYcJmtv8
c'est la plateforme qui va faire de la magie avec le bytecode
- interprétation du bytecode
- compilation JIT (Just In Time)
- intéraction avec l'OS
- garbage collector
- gestion des threads
- ...
Tout ce qui fait qu'en Java on s'abstrait de la machine
https://unsplash.com/photos/7C8c-7fwk34
- on va maintenant rentrer au cœur du sujet : GraalVM
- C'est un set d'outils qui va se greffer autour d'une copie de l'OpenJDK
- ce n'est pas juste une réécriture, mais il y a 2 grandes nouveautés : la compilation native et la JVM polyglotte
- on peut faire exécuter plusieurs langages sur la JVM : JavaScript (dont Node.js), Ruby, Python, R et LLVM
- WebAssembly en experimental
- ces langages seront exécutés dans le même AST, dans la JVM, donc sans latence
- il y a juste des bridges pour demander l'exécution d'un autre langage (par exemple js dans Java)
tiré de la documentation : https://www.graalvm.org/reference-manual/polyglot-programming/#start-language-java
- sur une JVM classique on a un temps de warm up assez long
- pas forcément un problème dans beaucoup de cas d'usage
- peu poser problème pour des cas comme le cloud où on démarre/coupe des services souvent
- un JRE est assez lourd et on utilise jamais tout
- le JIT prend du temps à tout compiler et donc au démarrage l'exécution est lente
https://unsplash.com/photos/cYRMl1HeuVo
- compilation en binaire dès la première compilation
- plus de jar, plus de jvm à installer, mais directement un executable all-in-one incluant une jvm
- plus de JIT (comme tout est déjà compilé)
https://unsplash.com/photos/2MSMhiycQuY
- executable all-in-one veut aussi dire plus de chargement dynamique de jar
- pour être très optimisé une partie des API reflexions ne fonctionnent pas avec GraalVM
- la réflexion est autodétecté et partiellement calculé à la compilation
- parfois il faut faire une configuration manuelle pour que le compilateur permettent certains éléments de réflexion
- on n'a plus de jar portable, il faut compiler pour chaque plateforme
- on ne peut plus suivre les versions de java tous les semestres (Java 11 ou Java 17 uniquement)
- utilisé en prod chez Oracle, Twitter, Facebook, etc. au moins en partie
- Des frameworks ont été construits spécialement pour être efficace avec GraalVM en natif : Micronaut, Quarkus, Helidon
- Il y a le module Spring Native pour faire du GraalVM avec Spring et compilé en natif
- Surtout si on est dans un contexte cloud, il faut se poser la question de GraalVM en natif
- Pas de gain à utiliser GraalVM en production en mode HotSpot
- On voit un vrai gain sur la taille des images docker par exemple
- les démarrages sont vraiment plus rapide