Sortie du langage de programmation Ruby 3.2

Ruby 3.2.0 est sorti, un langage de programmation orienté objet dynamique très efficace dans le développement de programmes et intégrant les meilleures fonctionnalités de Perl, Java, Python, Smalltalk, Eiffel, Ada et Lisp. Le code du projet est distribué sous les licences BSD (« 2-clause BSDL ») et « Ruby », qui fait référence à la dernière version de la licence GPL et est entièrement compatible avec GPLv3.

Principales améliorations :

  • Ajout d'un port initial de l'interpréteur CRuby, qui se compile en code intermédiaire WebAssembly pour être exécuté dans un navigateur Web ou sous des environnements d'exécution autonomes tels que wasmtime. Pour une interaction directe avec le système d'exploitation lors d'une exécution séparée, l'API WASI (WebAssembly System Interface) est utilisée. Entre autres choses, un wrapper VFS est fourni en plus de WASI, ce qui vous permet de regrouper l'intégralité de l'application Ruby dans une présentation sous la forme d'un seul fichier wasm. L'exécution dans un navigateur peut être utilisée pour créer des services Web de formation et de démonstration tels que TryRuby. Au stade actuel de développement, le port réussit avec succès les suites de tests de base et d'amorçage, qui n'utilisent pas l'API Thread. Le port ne prend pas non plus en charge les fibres, les exceptions ou le garbage collection.
  • Le compilateur JIT in-process YJIT, créé par les développeurs de la plateforme de commerce électronique Shopify dans le cadre d'une initiative visant à augmenter les performances des programmes Ruby qui utilisent le framework Rails et appellent de nombreuses méthodes, a été déclaré stable et prêt pour utilisation en production. La principale différence avec le compilateur MJIT JIT précédemment utilisé, qui est basé sur le traitement de méthodes entières et utilise un compilateur externe en langage C, est que YJIT utilise le Lazy Basic Block Versioning (LBBV) et contient un compilateur JIT intégré. Avec LBBV, JIT compile d'abord uniquement le début de la méthode, et compile le reste quelque temps plus tard, une fois que les types de variables et d'arguments utilisés ont été déterminés lors de l'exécution. YJIT est disponible pour les architectures x86-64 et arm64/aarch64 sur Linux, MacOS, BSD et autres plateformes UNIX.

    Contrairement à Ruby, le code YJIT est écrit dans le langage Rust et nécessite le compilateur rustc 1.58.0+ pour la compilation, donc la construction YJIT est désactivée par défaut et est facultative. Lors de l'utilisation de YJIT, une augmentation de 41 % des performances a été enregistrée lors de l'exécution du test yjit-bench par rapport à l'utilisation de l'interprétation.

    Sortie du langage de programmation Ruby 3.2

  • Ajout d'une protection supplémentaire contre les attaques par déni de service lors du traitement de données externes dans des expressions régulières (ReDoS) inefficaces et chronophages. L'algorithme d'appariement, qui utilise la technique de mémorisation, a été considérablement amélioré. Par exemple, le temps d'exécution de l'expression '/^a*b?a*$/ =~ "a" * 50000 + "x"' a été réduit de 10 à 0.003 seconde. Le coût de l'optimisation est une augmentation de la consommation mémoire, dont la consommation est environ 10 fois supérieure à la taille des données d'entrée. La deuxième mesure de sécurité est la possibilité de définir un timeout (par exemple, « Regexp.timeout = 1.0 ») pendant lequel l'expression régulière doit être traitée.
  • Le mode syntax_suggest est inclus, ce qui permet de diagnostiquer les causes des erreurs associées à une expression de « fin » de fermeture manquante ou supplémentaire. `end' sans correspondance, mot-clé manquant (`do', `def`, `if`, etc.) ? 1 classe Chien > 2 defbark > 3 fin 4 fin
  • La possibilité de marquer les arguments pour les erreurs liées aux types et aux arguments a été ajoutée au mode d'affichage de l'emplacement des erreurs, par exemple : test.rb:2:in `+' : nil ne peut pas être forcé en Integer (TypeError) sum = ary [0] + ary [1] ^^^^^^
  • Ajout d'une nouvelle syntaxe pour rediriger les ensembles d'arguments vers d'autres méthodes : def foo(*) bar(*) end def baz(**) quux(**) end
  • Ruby_vm/mjit/compiler est proposé - une variante de l'ancien compilateur MJIT JIT, réécrit en langage Ruby. Garantit que MJIT s'exécute dans un processus distinct au lieu de s'exécuter dans un thread de travail MJIT.
  • Dans Bundler 2.4, le traitement des dépendances utilise le détecteur de version PubGrub, également utilisé dans le gestionnaire de packages pub pour le langage Dart. L'algorithme Molinillo précédemment utilisé continue d'être utilisé dans RubyGems, mais sera également remplacé par PubGrub à l'avenir.
  • Versions mises à jour des modules gem intégrés et de ceux inclus dans la bibliothèque standard.

Source: opennet.ru

Ajouter un commentaire