La dernière mise à jour livrée par Oracle de la machine virtuelle « universelle » GraalVM apporte des améliorations au niveau du compilateur et de l'utilisation de l'image native, ainsi que des améliorations destinées à des langages spécifiques. Publié le 20 juillet, GraalVM 21.2 est disponible sur le site Web du projet en versions communautaire et entreprise. La mise à jour annoncée comporte des optimisations pour le compilateur, notamment une analyse améliorée des limites des boucles comptées, ce qui permet au compilateur d'analyser le flux de contrôle précédant la boucle pour raisonner sur les variables d'induction. Cette analyse peut rendre plus de boucles non comptées accessibles à des optimisations avancées. La compilation du code utilisant des modèles StringBuilder typiques a également été améliorée, avec notamment une meilleure prise en charge de ces modèles dans les builds GraalVM basées sur JDK 11 en raison de la prise en compte des chaînes compactes dans le JDK 11.
L'édition communautaire bénéficie de l’ajout d’une optimisation spéculative du mouvement de garde qui consiste à déplacer une garde invariante de boucle de l'intérieur à l'extérieur d'une boucle pour améliorer les charges de travail pertinentes. Les mécanismes de suppression des points de sécurité dans les longues boucles comptées ont également été améliorés. Une optimisation expérimentale appelée « Write Sinking », désactivée par défaut, tente de déplacer les écritures hors des boucles. Une nouvelle vectorisation SIMD pour le code séquentiel est disponible dans l'édition entreprise, mais celle-ci n'est pas encore activée par défaut. GraalVM tente de fournir un runtime à haute-performance pour Java, JavaScript, les langages basés sur LLVM comme C et C++, et les langages dynamiques comme Python et Ruby.
Un fonctionnement de code vérifié en mode native-image
Concernant les capacités de Native Image dans GraalVM, les plug-ins Gradle et Maven ont été publiés en juin avec la prise en charge des tests JUnit 5, afin de simplifier la création d'images natives des applications et de permettre aux tests JUnit de s'exécuter en mode native-image, afin de vérifier le fonctionnement du code dans ce mode. La commande Native Image supprime désormais automatiquement les fournisseurs de sécurité inutiles de l'image, les fournisseurs de sécurité accessibles étant détectés par l'analyse statique.
Dans GraalVM 21.2, une implémentation de la prédéfinition des classes prend en charge les appels Classloader.loadClass au moment de l'exécution. Les classes souhaitées, qui doivent être chargées au moment de l'exécution, doivent être mises à la disposition de l'analyse statique au moment de la build afin d’être incluses dans l'analyse du « monde réel ». Sinon, les modèles de code qui incluent le chargement de classes à des moments arbitraires de l'exécution fonctionnent désormais dans les images natives comme prévu. Toujours avec GraalVM 21.2, les images natives construites avec -H:+AllowVMInspection prennent désormais en charge les événements JFR (Java Flight Recorder) écrits en Java.
Une salve variée d'améliorations
D'autres fonctionnalités et améliorations sont également apportées par GraalVM 21:2. Le framework d'implémentation du langage Truffle, qui fonctionne avec GraalVM, dispose ainsi d'une nouvelle heuristique de file d'attente de compilation pour améliorer le temps de mise en route du runtime multi-langage pour de nombreuses charges de travail. Cette fonction est activée par défaut. Une API du plug-in HotSpot pour Java sur Truffle permet au code d'évoluer naturellement pendant le développement sans avoir à redémarrer une application en cours d'exécution. Par ailleurs l'implémentation JavaScript ajoute des propositions récentes comme de nouvelles méthodes Set et une surcharge expérimentale des opérateurs. Pour Ruby, GraalVM 21.2 ajoute des améliorations de compatibilité et de performance, notamment une invalidation précise pour les méthodes et constantes Ruby, en utilisant des hypothèses par nom et par classe, tandis que pour Python, une version plus rapide de _pickle est proposée pour accélérer la sérialisation. Enfin les appels virtuels C++ sont pris en charge via l'interopérabilité inter-langages et la compatibilité avec WebAssembly a été améliorée.