- Ruby 4.0.0 a été publié, introduisant Ruby Box et ZJIT, ainsi que de nombreuses améliorations de performances et du langage
- Ruby Box est une fonctionnalité expérimentale permettant d’exécuter en isolation des classes, modules, variables globales et définitions de bibliothèques natives/Ruby
- ZJIT est un compilateur JIT nouvelle génération basé sur Rust, structurellement plus extensible que YJIT et facilitant les contributions externes
- Le modèle d’exécution parallèle Ractor a été amélioré en termes de stabilité et de performances, avec une sortie prévue de son statut expérimental
- Des mises à jour touchant les classes cœur, la bibliothèque standard, l’API C, le GC et le JIT renforcent les performances et l’extensibilité de l’écosystème Ruby
Présentation de Ruby 4.0
- Ruby 4.0.0 est une mise à jour majeure centrée sur Ruby Box et ZJIT
- Elle inclut des améliorations dans de nombreux domaines : exécution parallèle, syntaxe du langage, bibliothèque standard, GC, JIT, etc.
- Le téléchargement est proposé aux formats
.tar.gz, .tar.xz et .zip
Ruby Box
- Ruby Box est une fonctionnalité expérimentale qui fournit l’isolation des définitions
- Elle s’active en définissant la variable d’environnement
RUBY_BOX=1, et la classe est Ruby::Box
- Les définitions chargées à l’intérieur d’une box sont isolées de l’extérieur : les monkey patches, variables globales/de classe, définitions de classes/modules et modifications de bibliothèques n’affectent pas les autres box
- Principaux cas d’usage
- Exécution isolée entre cas de test
- Exécution parallèle de web apps pour un déploiement blue-green
- Exécution parallèle pour valider des mises à jour de dépendances
- Utilisation prévue comme API de base pour implémenter à l’avenir une « package API » de haut niveau
ZJIT
- ZJIT est un nouveau compilateur JIT développé comme version nouvelle génération de YJIT
- Nécessite Rust 1.85.0 ou supérieur, s’active avec l’option
--zjit
- Repose sur SSA IR, prend en charge des unités de compilation plus larges et adopte une structure favorisant les contributions externes
- Il est actuellement plus rapide que l’interpréteur, mais plus lent que YJIT
- Son utilisation en production n’est pas recommandée, et des gains de performance sont prévus pour Ruby 4.1
Améliorations de Ractor
- Ajout de la classe Ractor::Port pour résoudre les problèmes d’envoi/réception de messages
Ractor.shareable_proc facilite le partage d’objets Proc entre Ractors
- L’amélioration des structures de données internes réduit la contention sur le verrou global et améliore le parallélisme
- Le statut expérimental de Ractor devrait être levé l’année prochaine
Changements du langage
*nil n’appelle plus nil.to_a (même comportement que **nil)
- Les opérateurs logiques (
||, &&, and, or) prennent en charge la syntaxe de continuité de ligne (dot chaining)
- Amélioration de la lisibilité et de la cohérence du code
Mises à jour des classes cœur
- Array : ajout de
Array#rfind et Array#find pour une recherche plus efficace
- Binding : exclusion des paramètres numérotés et ajout de méthodes liées à
implicit_parameters
- Enumerator : ajout de l’argument nommé
size: à produce
- ErrorHighlight : affichage d’extraits de code de l’appelant et de la définition lors d’un
ArgumentError
- Fiber/Fiber::Scheduler : ajout de
raise(cause:), fiber_interrupt, yield, etc.
- File : prise en charge de
File::Stat#birthtime sous Linux
- IO : timeout
Float::INFINITY autorisé, suppression de la création de processus basée sur les pipes
- Kernel : personnalisation possible de
#inspect, suppression de la création de pipes dans Kernel#open
- Math : ajout de
log1p et expm1
- Pathname : promotion de gem par défaut à classe cœur
- Proc : unification du format d’affichage des paramètres anonymes
- Ractor : communication remaniée autour de
Ractor::Port, suppression de Ractor.yield, etc.
- Set : promotion en classe cœur, simplification du format de
inspect
- Socket : ajout de l’argument
open_timeout, unification des exceptions de timeout
- String : prise en charge d’Unicode 17.0.0 et Emoji 17.0, extension des méthodes de la famille
strip
- Thread : prise en charge de l’argument
raise(cause:)
Mises à jour de la bibliothèque standard (Stdlib)
- Promues en gems par défaut :
ostruct, pstore, benchmark, logger, rdoc, win32ole, irb, reline, fiddle, etc.
- Nouvelle gem par défaut :
win32-registry 0.1.2
- Mise à jour des gems par défaut :
RubyGems 4.0.3, bundler 4.0.3, openssl 4.0.0, json 2.18.0, etc.
- Mise à jour des gems bundle :
minitest 6.0.0, rake 13.3.1, rbs 3.10.0, debug 1.11.1, etc.
- Intègre RubyGems/Bundler 4
Prise en charge des plateformes
- Windows : fin de la prise en charge des versions antérieures à MSVC 14.0 (Visual Studio 2015 ou plus requis)
Changements de compatibilité
- Suppression de
Ractor.yield, Ractor#take, Ractor#close_incoming, Ractor#close_outgoing
- Dépréciation de
ObjectSpace._id2ref
- Suppression de
Process::Status#& et #>>
- Simplification de l’affichage des frames internes dans les backtraces
- Les backtraces de
ArgumentError affichent désormais le nom de la classe/du module receveur
Compatibilité de la bibliothèque standard
- Suppression de la bibliothèque CGI, seul
cgi/escape est conservé
- Avec la promotion de
Set en classe cœur, SortedSet nécessite désormais l’installation d’une gem séparée
- Suppression du réglage automatique de l’en-tête
Content-Type dans Net::HTTP
Mises à jour de l’API C
- Désactivation de
rb_thread_fd_close et recommandation d’utiliser rb_io_close
rb_thread_call_with_gvl fonctionne désormais indépendamment de la présence du GVL
- Ajout d’une API C pour Set (
rb_set_new, rb_set_add, rb_set_delete, etc.)
Améliorations d’implémentation et de performances
- Accélération des appels à
Class#new, notamment avec des arguments nommés
- Réduction de l’usage mémoire grâce à la croissance indépendante des pools du tas GC
- Amélioration de la vitesse de sweeping des objets volumineux
- Optimisations de
object_id, du calcul de hash et de l’accès aux variables d’instance
- Améliorations des performances de Ractor
- Structure de hash sans verrou, réduction de la contention du cache, optimisation des allocations d’objets
- Corrections de bugs liés aux deadlocks, à l’encodage et au GC
À propos du JIT
- ZJIT : JIT basé sur les méthodes, nécessite Rust 1.85.0 ou supérieur, activable via
--zjit ou RubyVM::ZJIT.enable
- YJIT : changement des options de statistiques, ajout de
mem_size: et call_threshold:
- RJIT : suppression de
--rjit, déplacement vers un dépôt séparé
Ampleur des changements
- Par rapport à Ruby 3.4.0 : 3 889 fichiers modifiés, 230 769 lignes ajoutées, 297 003 lignes supprimées
- Ruby 4.0 est une version majeure qui renforce fortement les performances, le parallélisme et la cohérence du langage
Téléchargement
- Disponible aux formats
ruby-4.0.0.tar.gz, ruby-4.0.0.tar.xz, ruby-4.0.0.zip
- Les hashs SHA1, SHA256 et SHA512 de chaque fichier sont indiqués
Présentation de Ruby
- Ruby est un langage open source créé en 1993 par Yukihiro Matsumoto (Matz)
- Il fonctionne sur de multiples plateformes et est particulièrement utilisé dans le développement web à l’échelle mondiale
Aucun commentaire pour le moment.