6 points par GN⁺ 2025-12-26 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • 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.

Aucun commentaire pour le moment.