Ruby 3.1.0 est disponible

Nous avons le plaisir de vous annoncer la sortie de Ruby 3.1.0. Ruby 3.1 conserve la compatibilité avec Ruby 3.0 et ajoute également de nombreuses fonctionnalités.

YJIT: un nouveau compilateur JIT en cours de développement

Ruby 3.1 fusionne YJIT, un nouveau compilateur JIT développé par Shopify.

Depuis que Ruby 2.6 a introduit MJIT en 2018, ses performances se sont grandement améliorées et nous sommes parvenus à Ruby3x3 l’année dernière. Même si Optcarrot a montré des accélérations impressionnantes, le JIT n’a pas profité aux applications du monde professionnel.

Récemment, Shopify a apporté de nombreuses améliorations à Ruby pour accélérer son application Rails. YJIT est une contribution importante et vise à améliorer les performances des applications Rails.

Bien que MJIT soit un compilateur JIT basé sur des méthodes et qu’il utilise un compilateur C externe, YJIT utilise le Basic Block Versioning et inclut le compilateur JIT à l’intérieur. Avec Lazy Basic Block Versioning (LBBV), cela compile d’abord le début d’une méthode et compile progressivement le reste lorsque le type des arguments et des variables est déterminé dynamiquement. Voir YJIT: a basic block versioning JIT compiler for CRuby pour une introduction détaillée.

Avec cette technologie, YJIT permet d’avoir à la fois un temps de démarrage rapide et des améliorations de performance sur la plupart des logiciels, jusqu’à 22% sur railsbench et 39% sur le rendu liquid.

YJIT est toujours une fonctionnalité expérimentale. En tant que telle, elle est désactivée par défaut. Si vous souhaitez l’utiliser, spécifiez l’option en ligne de commande --yjit pour activer YJIT. L’utilisation est pour le moment limitée à macOS et Linux sur les plateformes x86-64.

  • https://bugs.ruby-lang.org/issues/18229
  • https://shopify.engineering/yjit-just-in-time-compiler-cruby
  • https://www.youtube.com/watch?v=PBVLf3yfMs8

debug.gem : un nouveau débogueur

Un débogueur complètement réécrit debug.gem est fourni. Debug.gem possède les fonctionnalités suivantes :

  • Améliorer les performances de débogage (il ne ralentit pas l’application même avec le débogueur)
  • Prise en charge du débogage à distance
  • Prise en charge de l’interface de débogage riche (VSCode et navigateur Chrome sont désormais pris en charge)
  • Prise en charge du débogage multiprocessus/multithread
  • REPL coloré et d’autres fonctionnalités utiles telles que la fonction enregistrer et rejouer , la fonction de traçage, etc.

Ruby avait intégré lib/debug.rb, mais il n’était pas bien maintenu et posait des problèmes de performances et de fonctionnalités. Debug.gem a complètement remplacé lib/debug.rb.

error_highlight: localisation des erreurs plus précise

La gemme error_highlight a été ajoutée. Elle permet d’obtenir la localisation d’une erreur de manière plus précise dans la trace :

$ ruby test.rb
test.rb:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError)
1.time {}
 ^^^^^
Did you mean?  times

Actuellement, seul NameError est pris en charge.

Cette gemme est activée par défaut. Vous pouvez la désactiver en utilisant l’option en ligne de commande --disable-error_highlight. Voir le dépôt pour de plus amples informations.

Auto-complétion dans IRB et affichage de la documentation

IRB dispose désormais d’une fonction de saisie semi-automatique où vous pouvez simplement taper le code et une boîte de dialogue des candidats à la complétion apparaîtra. Vous pouvez utiliser Tab et Shift+Tab pour vous déplacer de haut en bas.

Si la documentation est installée lorsque vous sélectionnez une proposition à la complétion, la boîte de dialogue de la documentation apparaîtra à côté de celle-ci, affichant une partie du contenu. Vous pouvez lire la documentation complète en appuyant sur Alt+d.

Autres nouvelles fonctionnalités notables

Language

  • Les valeurs dans les littéraux de hachage peuvent être omis. [Feature #14579]
    • {x:, y:} est un sucre syntaxique de {x: x, y: y}.
    • foo(x:, y:) est un sucre syntaxique de foo(x: x, y: y).
  • L’opérateur pin (^) dans le filtrage par motif prend désormais une expression. [Feature #17411]
Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a
#=> [[3, 5], [5, 7], [11, 13]]
  • Les parenthèses peuvent être omises dans les filtrages par motifs qui ne font qu’une seule ligne. [Feature #16182]
[0, 1] => _, x
{y: 2} => y:
x #=> 1
y #=> 2

RBS

RBS est un langage pour décrire la structure des programmes Ruby. Voir le dépôt pour de plus amples informations.

Mises à jour depuis Ruby 3.0.0 :

  • Les paramètres de type générique peuvent être bornés. (PR)
  • Les alias de type générique sont pris en charge. (PR)
  • rbs collection été introduit pour gérer les RBS des gemmes. (doc)
  • De nombreuses signatures pour les bibliothèques intégrées et standard ont été ajoutées/mises à jour.
  • Il inclut également de nombreuses corrections de bogues et améliorations des performances.

Voir le CHANGELOG.md pour de plus amples informations.

TypeProf

TypeProf est un analyseur de type statique pour Ruby. Il génère un prototype de RBS à partir de code Ruby non annoté de type. Voir la documentation pour de plus amples informations.

Les principales mises à jour depuis Ruby 3.0.0 concernent un support IDE expérimental appelé “TypeProf for IDE”.

Demo de TypeProf for IDE

L’extension vscode affiche une signature de méthode devinée (ou explicitement écrite dans un fichier RBS) au-dessus de chaque définition de méthode, souligne en rouge le code qui peut provoquer une erreur de nom ou de type et complète les noms de méthode (c’est-à-dire affiche les méthodes candidates). Voir la documentation pour de plus amples informations.

De plus, la version inclut de nombreuses corrections de bogues et améliorations des performances.

Améliorations de performance

  • MJIT
    • Pour les charges de travail telles que Rails, la valeur par défaut --jit-max-cache passe de 100 à 10000. Le compilateur JIT ne saute plus la compilation des méthodes de plus de 1000 instructions.
    • Pour prendre en charge Zeitwerk de Rails, le code généré par le compilateur JIT n’est plus annulé lorsqu’un TracePoint est activé pour les évènements de classe.

Autres changements notables depuis la version 3.0

  • Le filtrage par motif en une ligne, e.g., ary => [x, y, z], n’est plus au stade expérimental.
  • L’ordre d’évaluation des affectations multiples a été légèrement modifié. [Bug #4443]
    • foo[0], bar[0] = baz, qux était évalué dans l’ordre baz, qux, foo puis bar dans Ruby 3.0. Dans Ruby 3.1, l’évaluation est dans l’ordre foo, bar, baz puis qux.
  • Allocation de la taille d’une variable String (expérimental) [Bug #18239]
  • Psych 4.0 change Psych.load en safe_load par défaut. Vous devrez peut-être utiliser Psych 3.3.2 pour migrer vers ce comportement. [Bug #17866]

Mise à jour des bibliothèques standards

  • Les gemmes par défaut suivantes ont été mises à jour.
    • RubyGems 3.3.3
    • base64 0.1.1
    • benchmark 0.2.0
    • bigdecimal 3.1.1
    • bundler 2.3.3
    • cgi 0.3.1
    • csv 3.2.2
    • date 3.2.2
    • did_you_mean 1.6.1
    • digest 3.1.0
    • drb 2.1.0
    • erb 2.2.3
    • error_highlight 0.3.0
    • etc 1.3.0
    • fcntl 1.0.1
    • fiddle 1.1.0
    • fileutils 1.6.0
    • find 0.1.1
    • io-console 0.5.10
    • io-wait 0.2.1
    • ipaddr 1.2.3
    • irb 1.4.1
    • json 2.6.1
    • logger 1.5.0
    • net-http 0.2.0
    • net-protocol 0.1.2
    • nkf 0.1.1
    • open-uri 0.2.0
    • openssl 3.0.0
    • optparse 0.2.0
    • ostruct 0.5.2
    • pathname 0.2.0
    • pp 0.3.0
    • prettyprint 0.1.1
    • psych 4.0.3
    • racc 1.6.0
    • rdoc 6.4.0
    • readline 0.0.3
    • readline-ext 0.1.4
    • reline 0.3.0
    • resolv 0.2.1
    • rinda 0.1.1
    • ruby2_keywords 0.0.5
    • securerandom 0.1.1
    • set 1.0.2
    • stringio 3.0.1
    • strscan 3.0.1
    • tempfile 0.1.2
    • time 0.2.0
    • timeout 0.2.0
    • tmpdir 0.1.2
    • un 0.2.0
    • uri 0.11.0
    • yaml 0.2.0
    • zlib 2.1.1
  • Les gemmes groupées suivantes ont été mises à jour.
    • minitest 5.15.0
    • power_assert 2.0.1
    • rake 13.0.6
    • test-unit 3.5.3
    • rexml 3.2.5
    • rbs 2.0.0
    • typeprof 0.21.1
  • Les gemmes par défaut suivantes sont désormais des gemmes groupées. Vous devez les ajouter au Gemfile sous l’environnement bundler.
    • net-ftp 0.1.3
    • net-imap 0.2.2
    • net-pop 0.1.1
    • net-smtp 0.3.1
    • matrix 0.4.2
    • prime 0.1.2
    • debug 1.4.0

Voir NEWS ou les logs de commit pour de plus amples informations.

Avec ces changements, 3124 fichiers changés, 551760 insertions(+), 99167 suppressions(-) depuis Ruby 3.0.0 !

Joyeux Noël, joyeuses fêtes et bonne programmation avec Ruby 3.1 !

Téléchargement

  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz

    SIZE: 20103517
    SHA1: e4e8c20dd2a1fdef4d3e5bd5a3461000dd17f226
    SHA256: 50a0504c6edcb4d61ce6b8cfdbddaa95707195fab0ecd7b5e92654b2a9412854
    SHA512: 76009d325e961e601d9a287e36490cbc1f3b5dbf4878fa6eab2c4daa5ff2fed78cbc7525cd87b09828f97cbe2beb30f528928bcc5647af745d03dffe7c5baaa9
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.xz

    SIZE: 14709096
    SHA1: 92b603c2a69fb25d66c337a63e94280984edea11
    SHA256: 1a0e0b69b9b062b6299ff1f6c6d77b66aff3995f63d1d8b8771e7a113ec472e2
    SHA512: a2bb6b5e62d5fa06dd9c30cf84ddcb2c27cb87fbaaffd2309a44391a6b110e1dde6b7b0d8c659b56387ee3c9b4264003f3532d5a374123a7c187ebba9293f320
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.zip

    SIZE: 24388179
    SHA1: e37435956d6f840a0e8758d7374bc7e0e346105f
    SHA256: a3bfcd486d09c065d46421da0ff3d430ce4423fefd80cea63c6595d83ae4af0e
    SHA512: 67db71144e06da2c1c25eaf413d1417c99a4b18738a573f9e3371c11ea242eee9dcbdc3de17336f25ab5060039fe034e57298943d344be9cd9eb33bb56e2e1c6
    

Ruby, c’est quoi ?

Ruby a été initialement développé par Matz (Yukihiro Matsumoto) en 1993 puis est devenu open source. Il fonctionne sur de nombreuses plateformes et est utilisé partout dans le monde, en particulier pour le développement web.