Vous vous demandez pourquoi le langage Ruby devient si populaire ? Ses afficionados le qualifient d’élégant, voire d’artistique. Et dans le même temps, ils soulignent qu’il est pratique et facile d’accès. Et concrètement parlant ?

Ruby : la conceptualisation de son créateur

Ruby a été conçu comme un langage homogène, dont les tenants et aboutissants ont été étudiés avec soins. Son créateur, Yukihiro « matz » Matsumoto, a rassemblé certaines fonctionnalités de ses langages préférés (Perl, Smalltalk, Eiffel, Ada et Lisp) afin d’imaginer un nouveau langage qui mêlerait astucieusement programmations impérative et fonctionnelle.

À plusieurs reprises, il a déclaré que son but était « d’essayer de rendre Ruby naturel, pas simple. » D’une certaine manière, comme notre vie.

À ce propos, il a ajouté :

Ruby est simple en apparence, mais très complexe en interne, tout comme notre corps1.

Croissance de Ruby

Depuis sa publication en 1995, Ruby a attiré des programmeurs passionnés des quatre coins du monde. En 2006, Ruby rassemblait une masse critique d’utilisateur et gagnait une réelle reconnaissance. Des groupes d’utilisateurs existent dans les plus grandes villes du monde, et les conférences à propos de Ruby affichent complet.

Graph courtesy of Gmane.

Ruby-Talk, la toute première liste de diffusion recevant les discussions à propos du langage Ruby, atteint aujourd’hui une moyenne de deux cent nouveaux messages par jour.

L’index TIOBE, qui mesure la croissance des langages informatiques, place Ruby à la dixieme place du classement des langages les plus utilisés au monde. Concernant cette évolution, leur prédiction est la suivante : « il y a des chances que Ruby entre dans le top 10 dans moins de six mois. » La plus grande part de cette accélération semble revenir à la popularité de certains logiciels écrits en Ruby, notamment le framework web Ruby on Rails2.

Par ailleurs, Ruby est totalement libre. Il est non seulement gratuit, mais son utilisation, sa copie, sa modification et sa distribution sont également libres.

Tout aborder comme un objet

Initialement, Matz a étudié les autres langages afin de définir une syntaxe qui lui serait idéale. Se remémorant cet épisode, il nous rapportait : « je voulais un langage de script plus puissant que Perl, et plus orienté objet que Python3.”

Dans Ruby, le paradigme de base est que tout y est un objet. Chaque entité d’information et code peut recevoir ses propres propriétés et actions. La programmation orientée objet fait référence aux propriétés sous le terme de variables d’instance et aux actions sous le nom de méthodes. L’approche purement objet de Ruby est très souvent illustrée par un bout de code montrant l’application d’une action à un nombre.

5.times { print "Nous *adorons* Ruby -- Même trop !" }

Dans beaucoup de langages, les nombres et autres types primaires ne sont pas des objets. Ruby suit ici la voie de Smalltalk, en donnant accès aux méthodes et variables d’instance à tous les types. Cela facilite l’appropriation de Ruby, puisque les règles s’appliquant aux objets usuels s’appliquent en fait à travers tout Ruby.

La flexibilité de Ruby

Ruby a pour réputation d’être un langage pour le moins flexible, puisqu’il autorise son utilisateur à en modifier les entrailles. Des parties importantes peuvent être retirées ou redéfinies à loisir ; des greffes de fonctionnalités sont possibles en cours de route. En définitive, Ruby essaye de ne pas contraindre le programmeur.

Par exemple, l’opération arithmétique d’addition est réalisée par l’opérateur plus (+). Mais si vous préférez utiliser une méthode plus, vous pouvez l’ajouter à la classe de base Numeric de Ruby.

class Numeric
  def plus(x)
    self.+(x)
  end
end

y = 5.plus 6
# y vaut maintenant 11

Tous les opérateurs de Ruby sont des méthodes pensées pour être pratiques, syntaxiquement parlant. Vous pouvez toutefois les redéfinir à votre convenance.

Les blocs, un moyen d’expression à part entière

L’usage que fait Ruby des blocs de code est également reconnu comme une grande source de flexibilité. Un programmeur peut associer à toute méthode une closure (ou « gestionnaire »), décrivant la manière dont la méthode doit se comporter. Une telle closure est appelée en Ruby un bloc. Cette fonctionnalité est rapidement devenu l’une des plus populaires auprès des nouveaux utilisateurs de Ruby, habitués à des langages impératifs comme PHP ou Visual Basic.

Les blocs trouvent leur inspiration dans les langages fonctionnels. Matz a dit à ce propos : « en créant les closures de Ruby, je souhaitais respecter la voie tracée par Lisp4. »

search_engines = 
  %w[Google Yahoo MSN].map do |moteur|
    "http://www." + moteur.downcase + ".com"
  end

Dans le code ci-dessus, le bloc est délimité par la structure do ... end. La méthode map applique le bloc à la liste de mots fournie en premier lieu. Bien d’autres méthodes en Ruby laissent au programmeur l’opportunité d’écrire leurs propres blocs, afin de d’adapter le fonctionnement d’une méthode au contexte du script.

Ruby et le mécanisme de mixin

À la différence de bien d’autres langages orientés objet, Ruby ne donne accès qu’à l’héritage unique, et ce volontairement. En effet, Ruby supporte par ailleurs le concept de modules (les Categories en Objective-C). Ces modules sont des regroupements de méthodes.

Les classes peuvent « incorporer » un module (opération dite de mixin) afin d’en recevoir toutes les méthodes, sans plus de travail. Par exemple, toute classe implémentant une méthode each peut ensuite incorporer le module Enumerable, lequel fournit gratuitement plusieurs méthodes utilisant each pour faire des boucles.

class MonTableau
  include Enumerable
end

En général, les rubyistes préfèrent cette façon de faire à l’héritage multiple, qui est complexe et peut se révéler trop restrictif.

Ruby, le fond et la forme

Bien que Ruby fasse un usage très limité de la ponctuation et se concentre sur des mots clé simples en anglais, quelques signes de ponctuation agrémentent la syntaxe. Ruby ne requière pas la déclaration des variables. Plus simplement, une convention de nommage est utilisée pour indiquer la portée des variables.

  • var pourrait être une variable locale.
  • @var est une variable d’instance.
  • $var est une variable globale.

Ces signes améliorent la lisibilité en permettant une identification rapide du rôle de chaque variable. Il devient ainsi inutile de préfixer chaque variable d’instance d’un self. redondant.

Au delà de ces bases

Ruby met à disposition du programmeur bien d’autres fonctionnalités, parmi lesquelles on peut citer…

  • une gestion des exceptions, tout comme Java ou Python, afin de gérer facilement les erreurs ;
  • un ramasse-miettes (garbage collector) utilisant l’algorithme mark-and-sweep pour gérer tous les objets. Il n’y a pas non plus besoin de maintenir un compte des références individuelles dans les bibliothèques d’extensions en C. Comme Matz le dit si bien, « c’est un bon point pour votre santé » ;
  • la possibilité d’écrire des extensions en C est plus simple qu’en Perl ou Python, grâce à une API élégante permettant d’appeler Ruby depuis le C. Cela comprend aussi bien les appels à Ruby au sein d’un logiciel, que l’utilisation de Ruby comme langage de script. Une interface SWIG est également disponible ;
  • la possibilité de charger une bibliothèque d’extension à la volée, si le système d’exploitation le permet ;
  • une très grande portabilité : développé majoritairement sous GNU/Linux, Ruby fonctionne aussi sur une grande part des UNIX, Mac OS X, Windows 95/98/Me/NT/2000/XP, DOS, BeOS, OS/2, etc.

Références

1 Matz, discutant sur la liste de diffusion anglophone Ruby-Talk, le 12 mai 2000.

2 Consultez le site Internet du projet Ruby on Rails (en anglais) pour plus de détails.

3 Matz, dans An Interview with the Creator of Ruby (en anglais), le 29 novembre 2001.

4 Matz, dans Blocks and Closures in Ruby (en anglais), le 22 décembre 2003.