La version 3.2 du langage de programmation Ruby est disponible,
elle apporte de nombreuses fonctionnalit�s et am�liore les performances
Comme � son habitude, en guise de cadeau de No�l pour les d�veloppeurs Ruby, l��quipe de d�veloppement du langage de programmation a annonc� le 25 d�cembre la sortie de la version 3.2 de langage de programmation. Dans cette nouvelle version du langage multiparadigme, on trouve un algorithme de correspondance Regexp am�lior� et le support de WebAssembly bas� sur WASI
Support de WebAssembly bas� sur WASI
Il s'agit d'un portage initial du support WebAssembly bas� sur WASI. Cela permet � un binaire CRuby d'�tre disponible sur un navigateur Web, un environnement Serverless Edge, ou d'autres types d'embedders WebAssembly/WASI. Actuellement, ce portage passe les suites de tests de base et d'amor�age n'utilisant pas l'API Thread.
Int�gration
WebAssembly (Wasm) a �t� introduit � l'origine pour ex�cuter des programmes rapidement et en toute s�curit� dans les navigateurs web. Mais son objectif - ex�cuter des programmes efficacement et en toute s�curit� dans divers environnements - est recherch� depuis longtemps non seulement pour le web mais aussi par des applications g�n�rales. WASI (The WebAssembly System Interface) est con�u pour de tels cas d'utilisation. Bien que ces applications aient besoin de communiquer avec les syst�mes d'exploitation, WebAssembly fonctionne sur une machine virtuelle qui n'avait pas d'interface syst�me. La WASI la normalise.
La prise en charge de WebAssembly/WASI dans Ruby vise � tirer parti de ces projets. Il permet aux d�veloppeurs Ruby d'�crire des applications qui fonctionnent sur ces plateformes.
Cas d'utilisation
Ce support encourage les d�veloppeurs � utiliser CRuby dans un environnement WebAssembly. Un exemple d'utilisation est le support CRuby du playground TryRuby. Vous pouvez maintenant essayer CRuby original dans votre navigateur Web.
Points techniques
Le WASI d'aujourd'hui et WebAssembly lui-m�me manquent de certaines fonctionnalit�s pour mettre en �uvre Fiber, exception, et GC parce qu'il est encore en cours de d�veloppement, et aussi pour des raisons de s�curit�. CRuby comble donc ce manque en utilisant Asyncify, qui est une technique de transformation binaire pour contr�ler l'ex�cution en userland.
En outre, l��quipe Ruby a construit un VFS au-dessus de WASI afin de pouvoir facilement regrouper les applications Ruby dans un seul fichier .wasm. Cela rend la distribution des applications Ruby un peu plus facile.
Le YJIT pr�t pour la production
YJIT est un JIT Ruby l�ger et minimaliste construit dans CRuby. Il compile le code en utilisant une architecture BBV (Basic Block Versioning). Le cas d'utilisation vis� est celui des serveurs ex�cutant Ruby on Rails, un domaine o� MJIT n'a pas encore r�ussi � fournir des acc�l�rations. YJIT est actuellement pris en charge pour macOS et Linux sur les processeurs x86-64 et arm64/aarch64. Ce projet est open source et tombe sous la m�me licence que CRuby.
- YJIT n'est plus exp�rimental ;
- Il a �t� test� sur des charges de travail de production pendant plus d'un an et s'est av�r� tr�s stable ;
- Il prend d�sormais en charge les processeurs x86-64 et arm64/aarch64 sur Linux, MacOS, BSD et d'autres plateformes UNIX ;
- Cette version apporte le support pour Apple M1/M2, AWS Graviton, Raspberry Pi 4 et plus ;
- La construction de YJIT n�cessite maintenant Rust 1.58.0+ ;
- Afin de s'assurer que CRuby est construit avec YJIT, veuillez installer rustc >= 1.58.0 avant d'ex�cuter le script ./configure ;
- La version 3.2 de YJIT est plus rapide que la version 3.1, et a environ un tiers de moins de surcharge m�moire.
- Globalement, YJIT est 41% plus rapide (moyenne g�om�trique) que l'interpr�teur Ruby sur yjit-bench ;
- La m�moire physique pour le code JIT est allou�e paresseusement. Contrairement � Ruby 3.1, le RSS d'un processus Ruby est minimis� car les pages de m�moire virtuelle allou�es par --yjit-exec-mem-size ne seront pas mapp�es en pages de m�moire physique avant d'�tre effectivement utilis�es par le code JIT ;
- Introduire la GC du code qui lib�re toutes les pages de code lorsque la consommation de m�moire par le code JIT atteint --yjit-exec-mem-size ;
- RubyVM::YJIT.runtime_stats renvoie des mesures de Code GC en plus des cl�s inline_code_size et outlined_code_size existantes : code_gc_count, live_page_count, freed_page_count, et freed_code_size.
- La plupart des statistiques produites par RubyVM::YJIT.runtime_stats sont maintenant disponibles dans les builds de version ;.
- Il suffit d'ex�cuter ruby avec --yjit-stats pour calculer et afficher les statistiques (ce qui entra�ne une surcharge de temps d'ex�cution) ;
- YJIT est d�sormais optimis� pour tirer parti des formes des objets.
- Profiter de l'invalidation des constantes � grain fin pour invalider moins de code lors de la d�finition de nouvelles constantes. [Fonctionnalit� n�18589]
- La valeur par d�faut de --yjit-exec-mem-size est pass�e � 64 (MiB).
- Le seuil d'appel par d�faut --yjit-call-threshold est modifi� � 30.
Am�liorations de Regexp contre ReDoS
Il est connu que la correspondance des expressions r�guli�res peut prendre un temps consid�rable. Si le code tente de faire correspondre une Regexp potentiellement inefficace avec une entr�e non fiable, un attaquant peut l'exploiter pour un d�ni de service efficace (appel� expression r�guli�re DoS, ou ReDoS). L��quipe Ruby a introduit deux am�liorations qui att�nuent consid�rablement les ReDoS.
Algorithme de correspondance Regexp am�lior�
Depuis Ruby 3.2, l'algorithme de correspondance de Regexp a �t� grandement am�lior� en utilisant une technique de m�morisation.
# This match takes 10 sec. in Ruby 3.1, and 0.003 sec. in Ruby 3.2
/^a*b?a*$/ =~ "a" * 50000 + "x"
L'algorithme de correspondance am�lior� permet de r�aliser la plupart des correspondances Regexp (environ 90 %) en temps lin�aire.
Cette optimisation peut consommer de la m�moire proportionnellement � la longueur de l'entr�e pour chaque correspondance. Une correspondance Regexp normale devrait consommer au maximum 10 fois plus de m�moire que la longueur de l'entr�e.
D�lai d'attente pour les Regexp
L'optimisation ci-dessus ne peut pas �tre appliqu�e � certains types d'expressions r�guli�res, comme celles qui incluent des fonctionnalit�s avanc�es (par exemple, des r�f�rences arri�re ou des recherches), ou qui comportent un nombre fixe important de r�p�titions. En guise de mesure de repli, une fonction de d�lai d'attente pour les correspondances Regexp est �galement introduite.
Regexp.timeout = 1.0
/^a*b?a*()\1$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second
Notons que Regexp.timeout est une configuration globale. Pour utiliser des param�tres de d�lai diff�rents pour certaines Regexp sp�ciales, il est possible d�utiliser le mot cl� timeout pour Regexp.new.
Regexp.timeout = 1.0
# This regexp has no timeout
long_time_re = Regexp.new('^a*b?a*()\1$', timeout: Float::INFINITY)
long_time_re =~ "a" * 50000 + "x" # never interrupted
Autres nouveaut�s notables
SyntaxSuggest
La fonctionnalit� de syntax_suggest (anciennement dead_end) est int�gr�e � Ruby. Elle aide � trouver la position d'erreurs telles que des fins manquantes ou superflues, afin de remettre en route plus rapidement, comme dans l'exemple suivant :
Unmatched `end', missing keyword (`do', `def`, `if`, etc.) ?
1 class Dog
> 2 defbark
> 3 end
4 end
ErrorHighlight
Il indique maintenant le ou les arguments pertinents pour TypeError et ArgumentError.
test.rb:2:in `+': nil can't be coerced into Integer (TypeError)
sum = ary[0] + ary[1]
^^^^^^
Source : Ruby
Et vous ?
Avez-vous test� la nouvelle version de Ruby ?
Quel est votre avis sur les nouvelles fonctionnalit�s et am�liorations apport�es ?
Voir aussi :
Ruby 2.6 est disponible en version stable, avec un nouveau compilateur JIT en mode exp�rimental et un nouveau module pour analyser du code Ruby
Ruby 2.7 est disponible en version stable, avec l'ajout du filtrage par motif, d'une nouvelle m�thode pour compacter le tas et plusieurs am�liorations de performance non n�gligeables








Avez-vous test� la nouvelle version de Ruby ?
R�pondre avec citation
Partager