Quelques trucs & astuces bien pratiques pour compiler vos applications Kotlin, Scala, Java, Ruby ou encore NodeJS en natif à l'aide de GraalVM.
Visiblement ça marche, sauf dans les cas tricky où il y a une imbrication de la détection des types au runtime. Je note aussi que pour tout ce qui est découverte du classpath au runtime (typiquement les drivers JDBC), il faut spécifier le nom de la classe du driver si elle est chargée via un Class.forName()
(ce qui est toujours le cas en théorie).
Il ne me reste plus que deux questions en suspend avant de pouvoir passer entièrement sous GraalVM :
1) Comment fonctionne le classpath lorsque ce dernier contient un répertoire ? Le contenu est-il intégré à l'exécutable produit par GraalVM ou faut-il faire une bidouille ?
2) Comment fonctionne l'allocation mémoire avec un exécutable natif ? Avant, nous passions les options Xms et Xmx à la JVM mais celles-ci ont-elles encore une sens ?
Sinon les gains au démarrage sont encore plus impressionnant que ceux que j'avais obtenus il y a presque deux ans et l'API NIO est bien plus rapide que celle d'une JVM normale !
Le renouveau de la JVM est bel et bien en train de devenir plus rapide que Go sauf que la plateforme est riche (en termes de features proposées par le langage) et aussi polyglotte puisque GraalVM permet de traiter du Kotlin, du Scala, du R, du JavaScript, du Ruby, etc.
Je relie cette article pour deux raisons :
- Cette phrase :
Qui devrait produire une amélioration des performances en vitesse
Qui est une merveille de pléonasme dans le sens où le terme performances en informatique est toujours attaché au CPU, pour la mémoire on parle de "consommation".
- Nous sommes en 2019 et PHP découvre la technique de compilation Just-In-Time (JIT)... Technique mise en oeuvre dès la sortie de Java 5... en 2004.
=> Du coup, faut-il parler aux dev de PHP de la technique de compilation dite Ahead-Of-Time (AOT) déjà implémentée dans Webket / NodeJS (JavaScript / TypeScript) depuis trois ans et dans GraalVM (Java / Kotlin) depuis un an ou devons-nous encore attendre une quinzaine d'années ?
Bon, j'arrête le troll. PHP est un langage libre et un logiciel libre. Parvenir à survivre et à s'imposer depuis autant d'années, c'est quasi-miraculeux. Courage les poulets, même si ça vous prend encore 10 ans, c'est super ce que vous faites. Sans vous et sans PHP, je ne programmerais pas à cette heure, alors merci !
Running Javalin on GraalVM (22MB total size) - Javalin - A lightweight Java and Kotlin web framework
Compiler en natif des jar Java avec GraalVM et le mode ahead-of-time (AOT).
Ce que je note :
- GraalVM ne peut pas gérer de la réflection puisqu'elle a besoin de toutes les classes pour créer un exécutable autoporteur.
- Dans ce cas il faut lui indiquer explicitement les classes à inclure (celles chargée via réflection) lors de la compilation.
La question encore en suspend est : comment fonctionne la gestion de la mémoire de GraalVM mais côté ops, eux qui avaient avant les options -Xms et -Xmx ?
Le compilateur Kotlin est une merveille par rapport aux autres du même genre (coucou Scala).
Un plugin Maven pour exécuter les tests unitaires à chaque changement et recompiler les classes aussi. Cela permet à Maven de rattraper un peu Gradle sur ce sujet et de proposer ce qu'il est possible de faire en JS.
Spéciale casse-dédi à Animal qui pourra compiler ses scripts Bash. Bon le processus rend le shell non portable et plus lent, mais il a le mérite d’obfusquer le code.