Sortie de Ruby 3.0 en version finale

Par:
fredericmazue

jeu, 07/01/2021 - 13:35

Après une version Release Candidate publiée fin décembre 2020, le projte Ruby annonce la sortie de Ruby 3.0 en version finale. Cette nouvelle version est l'aboutissement d'une évolution entamée ne 2015.

L'équipe est fière du travail accompli et souligne que Ruby 3.0 est trois fois plus rapide que Ruby 2.0. Ceci selon le benchmark Optcarrot. https://github.com/mame/optcarrot

Hormis l'aspect performance, Ruby 3.0 est une évolution importante du langage Ruby. Parmi les nouveautés majeures, remarquons tout d'abord l'arrivée de RBS. RBS est un langage pour décrire les types dans les programmes Ruby. Les vérificateurs de type, y compris TypeProf et d'autres outils prenant en charge RBS, comprendront beaucoup mieux les programmes Ruby avec les définitions RBS, assure le projet Ruby.

RBS prend en charge les modèles couramment rencontrés dans les programmes Ruby et il permet aussi d'écrire des types avancés, y compris les types d'union, la surcharge de méthode et les génériques. Il prend également en charge les types d'interface. Ruby 3.0 est donc livré avec rbs gem. Voici un petit exemple de RBS avec des définitions de classe, de module et de constante.

module ChatApp
  VERSION: String
  class Channel
    attr_reader name: String
    attr_reader messages: Array[Message]
    attr_reader users: Array[User | Bot]              # `|` means union types, `User` or `Bot`.
    def initialize: (String) -> void
    def post: (String, from: User | Bot) -> Message   # Method overloading is supported.
            | (File, from: User | Bot) -> Message
  end
end

Ruby 3.0 apporte aussi des évolutions en ce qui concerne la programmation concurrente. Tout d'abord avec l'introduction d'un ordonnanceur, le 'Planificateur de fibres', ou Fiber Scheduleur en anglais. Celui-ci est présenté comme pouvant intercepter les opérations bloquantes, ce qui permet d'obtenir une concurrence légère sans modification du code existant. Les classes et méthodes actuellement supportées par Scheduleur sont :

  • Mutex#lock, Mutex#unlock, Mutex#sleep
  • ConditionVariable#wait
  • Queue#pop, SizedQueue#push
  • Thread#join
  • Kernel#sleep
  • IO#wait, IO#read, IO#write et les méthodes relatives telles #wait_readable, #gets, #puts and so on).

A remarquer : IO#select n'est pas supporté.

Toujours en ce qui concerne la programmation concurrente, vient également Ractor, qui est au stade expérimental pour le moment. Ractor est une abstraction de programmation concurrente conçue pour fournir une fonctionnalité d'exécution parallèle sans problèmes de sécurité des threads. Sécurité des threads signifie que ceux-ci ne peuvent pas partager des objets classiques. Le travail se fait avec des objets Ractor qui communiquent entre eux via un mécanisme de messages. Le projet Ruby souligne que la spécification et l'implémentation ne sont pas matures et peuvent être modifiées à l'avenir. C'est pourquoi cette fonctionnalité est marquée comme expérimentale. Voici un petit exemple de calcul de nombres premiers en parallèle avec deux racteurs. Le projet Ruby indique que l'exécution du programme est environ x2 fois plus rapide par rapport au programme séquentiel.

require 'prime'
# n.prime? with sent integers in r1, r2 run in parallel
r1, r2 = *(1..2).map do
  Ractor.new do
    n = Ractor.recv
    n.prime?
  end
end
# send parameters
r1.send 2**61 - 1
r2.send 2**61 + 15
# wait for the results of expr1, expr2
p r1.take #=> true
p r2.take #=> true

Site : ruby-lang.org