Ruby 3.0 est disponible en version Release Candidate
mar, 22/12/2020 - 13:51
Après une préversion sortie fin septembre, le projet Ruby vient d'annoncer le disponibilité du langage en version 3.0 release Candidate.
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