Ruby : Zoom sur les dernières améliorations de la bêta 2.6

Disponible depuis le 31 mai, la seconde bêta de la version 2.6 du langage web dynamique Ruby s’enrichit d’un compilateur Just-in-Time, avec à la clef une amélioration des performances.

Après une version stable 2.5.0 livrée en décembre dernier, Ruby est arrivé en version bêta 2.6 fin mai. (crédit : Aleksey Nemiro/Pixabay)

Livrée un peu en avance sur la date initialement prévue, la seconde bêta de Ruby 2.6 comporte une implémentation initiale de compilateur Just-In-Time (JIT) destinée à améliorer les performances d’exécution du programme. Le compilateur JIT de Ruby « imprime » du code C sur le disque et lance un processus de compilation C pour générer du code natif. L’un des objectifs de cette seconde bêta est de vérifier que la capacité JIT fonctionne correctement et d’identifier d’éventuels risques de sécurité avant la sortie de la version release. À noter que la compilation JIT de cette version bêta n’est active que lorsque l’application Ruby est construite par le compilateur GCC ou Clang et que le compilateur est disponible au moment de l’exécution. Mais les développeurs prévoient d’implémenter une méthode en ligne dans le compilateur, car elle pourrait augmenter significativement les performances. La prise en charge de l’IDE Visual Studio de Microsoft est également envisagée.

Un changement de langage où $SAFE est un état global du processus et le 0 peut être rétabli. Des performances améliorées pour le passage et les appels de blocks. Un Proc#call plus rapide. L’ajout de la méthode des octets. Le module RubyVM::AST : il offre une méthode de parsage qui analyse le code de chaîne de caractères et renvoie des nœuds AST. De plus, la méthode de parsage peut analyser le document de code et retourner des nœuds AST. Le module expérimental RubyVM::AST::Nodeclass remonte des informations de localisation et des nœuds parents de Node.

Les atouts de la version stable 2.5

Livrée le 24 décembre 2017, la version 2.5.0 de Ruby était la première version stable de la série 2.5. Celle-ci améliore les performances de 5 à 10 % en supprimant les instructions trace du bytecode en surcharge, remplacées par une technique d’instrumentation dynamique. De plus, le passage par un paramètre de block est trois fois plus rapide que dans Ruby 2.4, grâce à la technique d’allocation Lazy Proc. La version 2.5 bénéficie d’autres améliorations de performance, notamment : Le remplacement de l’ancien analyseur lexical IRB par Ripper améliore la génération de documents. La classe Mutex a été réécrite pour être plus petite et plus rapide. Mutex peut servir à gérer l’accès aux données partagées à partir de fils de discussion simultanés. La génération de code par ERB à partir d’un template est deux fois plus rapide qu’avec la version 2.4. Les performances des méthodes intégrées, dont Array#concat, Enumerable#sort_by et String#concat, ont également été améliorées.

Parmi les autres améliorations de Ruby 2.5, on peut signaler : Struct/new permet de créer des classes qui acceptent les arguments de mots-clés. Les blocks Do/end peuvent désormais fonctionner directement avec ensure/rescue/else. La bibliothèque pp.rb se charge automatiquement. Une option permet d’imprimer un backtrace dans l’ordre inverse et de voir le message d’erreur principal sans avoir besoin de faire défiler la page. Pour améliorer les tests, Ruby 2.5 a été doté du support pour évaluer la couverture des branches et des méthodes. La couverture des branches permet de voir quelles branches sont exécutées, alors que la couverture de méthodes montre quelles méthodes sont invoquées. Cette version propose également une correction de bogue où la bibliothèque SecureRandom préfère désormais les sources fournies par le système d’exploitation à OpenSSL pour générer des nombres aléatoires. En outre, les développeurs préconisent l’usage de composants issus des bibliothèques standards comme cmath, csv, date, dbm et ipaddr plutôt que ceux des gestionnaires de paquets par défaut. La version 2.5 de Ruby est disponible sous forme de fichier tar.gz ou Zip.

chevron_left
chevron_right