Yukihiro Matsumoto, connu dans la communauté sous le surnom de Matz,
conçoit Ruby à partir d’une insatisfaction précise. Au début des années
1990, il apprécie la rapidité des langages de script, mais ne trouve pas
celui qui associe cette souplesse à un modèle objet suffisamment
cohérent et agréable à utiliser.
Ruby naît de cette recherche. Le langage emprunte des idées à Smalltalk,
Lisp, Perl, Eiffel et Ada sans chercher à les juxtaposer telles quelles.
Matsumoto privilégie l’expérience humaine : un programme doit exprimer
l’intention avec fluidité, réduire le travail répétitif et laisser au
lecteur des formes proches du problème.
Cette orientation est souvent résumée par le « bonheur du programmeur ».
Elle ne signifie ni que Ruby est toujours simple, ni qu’il empêche les
erreurs. Elle désigne un choix d’architecture : accepter une
implantation complexe lorsque celle-ci permet une interface plus
naturelle pour celui qui écrit le code.
Apprendre les langages avant d’en créer un
Yukihiro Matsumoto naît en 1965 dans la préfecture d’Osaka et grandit
dans celle de Tottori. Il s’intéresse à la programmation dès
l’adolescence, dans un contexte où l’accès local aux ordinateurs et à la
documentation spécialisée reste limité.
En 1984, il entre à l’université de Tsukuba. Il peut y utiliser des
machines, consulter une documentation internationale et découvrir par le
réseau des communautés qui dépassent son environnement immédiat. Il
étudie les sciences de l’information, les langages et les compilateurs
avant d’obtenir son diplôme en 1990.
Matsumoto explore de nombreux langages et développe notamment des outils
en Emacs Lisp. Cette diversité nourrit une conviction : la conception
d’un langage ne consiste pas à maximiser une seule propriété. Elle doit
équilibrer cohérence, puissance, familiarité et coût d’apprentissage.
Il souhaite depuis longtemps créer son propre langage. La question
devient concrète lorsqu’il cherche un langage de script véritablement
orienté objet, pratique pour ses tâches quotidiennes sans réduire les
objets à une extension périphérique.
Le 24 février 1993 : le début de Ruby
Matsumoto situe la naissance de Ruby au 24 février 1993, lors d’une
discussion avec un collègue sur la possibilité d’un langage de script
orienté objet. Perl 4 est puissant pour le texte, mais son modèle n’est
pas encore celui que Matz recherche.
Python existe déjà, mais il estime à
l’époque que son orientation objet semble ajoutée à un noyau qui ne
traite pas tout de manière uniforme.
Il commence donc un interpréteur qui doit réunir :
- la rapidité d’écriture d’un langage de script ;
- un modèle où les valeurs sont des objets ;
- des itérateurs et fermetures inspirés de la culture Lisp et
Smalltalk ;
- les exceptions et la gestion automatique de la mémoire ;
- des outils pratiques pour les chaînes et les expressions régulières.
Le nom Ruby fait écho à Perl : une pierre précieuse après une «
perle ». Il signale l’influence du langage de Larry
Wall tout en affirmant une identité
différente.
Matsumoto développe le projet en dehors de son travail principal.
L’interpréteur fonctionne après plusieurs mois, mais il continue à
évoluer avant sa diffusion. En décembre 1995, Ruby 0.95 est publié sur
des groupes de discussion japonais. Ruby 1.0 suit en décembre 1996.
Tout est objet, mais l’objet doit rester pratique
Ruby applique l’envoi de messages de manière plus homogène que de
nombreux langages hybrides. Les nombres, chaînes, classes et valeurs
booléennes sont des objets sur lesquels on appelle des méthodes. Une
opération comme 3.times demande littéralement à l’objet 3 de répéter
un bloc.
3.times do |index|
puts "Étape #{index + 1}"
end
Le code évite une boucle avec initialisation, condition et incrément
explicites. L’entier fournit l’itérateur ; le bloc décrit seulement ce
qui doit se passer à chaque passage.
Cette syntaxe reflète la priorité de Ruby : faire apparaître l’intention
courante et déplacer le mécanisme répétitif dans une méthode
réutilisable. Elle permet aux bibliothèques de créer des vocabulaires
proches de leur domaine.
Le modèle reste dynamique. Le type d’une variable n’est pas déclaré de
manière statique ; une erreur de méthode peut donc n’apparaître qu’au
moment où le chemin concerné est exécuté. Les tests, les outils
d’analyse et les conventions d’API jouent un rôle essentiel dans les
grands projets.
Blocs, fermetures et itérateurs
Les blocs constituent l’une des contributions les plus reconnaissables
de Ruby. Une méthode peut recevoir un bloc de code, l’exécuter
immédiatement, le conserver sous forme de Proc ou lui transmettre des
valeurs.
Les collections s’en servent pour exprimer le parcours :
prices = [12, 20, 7]
taxed = prices.map { |price| price * 1.2 }
La méthode map contrôle la création de la nouvelle collection ; le
bloc fournit la transformation. Ce partage des responsabilités évite
d’exposer l’indice, la taille ou la mutation de la structure lorsque le
problème demande seulement « transformer chaque prix ».
Un bloc est aussi une fermeture : il peut capturer les variables
visibles dans son environnement. Cette propriété facilite les callbacks,
les ressources encadrées et les petits langages internes.
L’exemple classique File.open montre l’intérêt pratique. La méthode
ouvre un fichier, le transmet au bloc puis peut garantir sa fermeture.
Le programmeur se concentre sur le traitement sans disperser la gestion
de la ressource.
Les blocs ne viennent pas d’une invention isolée de Matsumoto. Ils
adaptent des idées de fermetures et de fonctions d’ordre supérieur
présentes dans Lisp et d’autres langages. L’originalité de Ruby réside
dans leur intégration syntaxique aux appels de méthodes ordinaires.
Héritage simple et mixins
Ruby autorise une classe à hériter d’une seule autre classe. Pour
partager un comportement transversal sans créer une hiérarchie
artificielle, le langage utilise des modules comme mixins.
Un module peut regrouper des méthodes puis être inclus dans plusieurs
classes. Enumerable, par exemple, offre tri, filtrage et recherche dès
lors que la classe fournit une manière de parcourir ses éléments.
Cette organisation sépare deux relations souvent confondues : « est une
sorte de » pour l’héritage, « possède ce comportement » pour le mixin.
Elle évite certaines ambiguïtés de l’héritage multiple tout en
conservant une composition de code expressive.
Les mixins ont toutefois besoin d’un contrat clair. Si un module suppose
l’existence de méthodes que la classe ne fournit pas, l’erreur apparaît
à l’exécution. La documentation et les tests doivent rendre ces attentes
visibles.
Ruby privilégie ici ce que l’on appelle souvent le duck typing :
l’important est moins l’étiquette déclarée d’un objet que sa capacité à
répondre aux messages requis. Cette souplesse facilite les substitutions
et les objets légers, mais déplace une partie de la vérification vers
l’usage.
Classes ouvertes et métaprogrammation
Les classes Ruby restent ouvertes : un programme peut ajouter ou
redéfinir des méthodes après leur création, y compris sur des classes de
la bibliothèque standard. Cette capacité permet de corriger localement
un comportement, construire des abstractions déclaratives ou adapter un
objet extérieur.
La métaprogrammation va plus loin. Le code peut définir des méthodes,
intercepter des messages et inspecter les classes. Des bibliothèques
s’en servent pour transformer une déclaration concise en un ensemble de
comportements : validations, associations, sérialisation ou commandes.
Cette expressivité alimente les langages internes propres à Ruby. Un
fichier de configuration peut ressembler à une description du domaine
tout en restant du code exécutable.
Le coût est important. Modifier globalement une classe — pratique
souvent appelée monkey patching — peut changer le comportement d’une
dépendance sans que son auteur le sache. Une méthode générée
dynamiquement est plus difficile à retrouver avec une recherche
textuelle ou à comprendre dans une trace d’erreur.
Les équipes Ruby expérimentées limitent donc les modifications globales,
isolent la métaprogrammation et préfèrent parfois une méthode explicite
à une abstraction brillante mais opaque. Le bonheur de l’auteur au
moment d’écrire doit rester compatible avec celui du lecteur six mois
plus tard.
« Naturel », pas simplement minimal
Matsumoto explique vouloir rendre Ruby naturel plutôt que simple. Le
langage peut proposer plusieurs formulations, des alias ou une syntaxe
adaptée au contexte lorsque cela rend le code plus fluide.
Par exemple, une condition peut précéder ou suivre son action :
send_report if ready?
Cette forme met l’action principale au premier plan et traite la
condition comme une nuance. Elle ressemble à une construction de langue
naturelle, mais reste une règle syntaxique précise.
Le principe ne consiste pas à imiter l’anglais partout. Ruby doit être
accessible à une communauté internationale et conserver une grammaire
programmable. Il s’agit plutôt de choisir des formes qui correspondent à
la manière dont les développeurs structurent mentalement une opération.
Comme chez Larry Wall, l’influence des langues naturelles justifie une
certaine redondance. Ruby cherche cependant une esthétique plus homogène
que Perl : les opérations courantes passent largement par des appels de
méthodes et les blocs structurent les variations.
Cette recherche reste subjective. Une syntaxe élégante pour un
utilisateur peut masquer trop de comportement pour un autre. La
conception du langage exige donc une direction éditoriale et les retours
d’une communauté diverse.
Une communauté d’abord japonaise
Les premières discussions se déroulent principalement en japonais sur la
liste ruby-list. Des contributeurs signalent des bogues, proposent des
bibliothèques et participent à l’évolution du langage. Matsumoto
conserve la décision finale sur la cohérence de Ruby, mais le projet
cesse rapidement d’être une implantation solitaire.
Cette origine compte dans l’histoire des langages libres. Ruby devient
l’un des premiers grands projets de langage nés au Japon à obtenir une
diffusion mondiale. Son vocabulaire international et sa licence libre
permettent au code de circuler, mais la documentation anglaise reste
d’abord limitée.
La liste ruby-talk et la publication en 2000 de Programming Ruby par
Dave Thomas et Andy Hunt, accessible en ligne, rendent le langage plus
abordable hors du Japon. Des groupes d’utilisateurs et des conférences
se forment progressivement.
Cette internationalisation ne résulte pas uniquement de la traduction.
Elle demande des relais communautaires, des paquets faciles à installer
et des exemples adaptés aux usages locaux.
Ruby on Rails : l’accélérateur, pas l’origine
En 2004, David Heinemeier Hansson extrait Ruby on Rails du travail
réalisé pour l’application Basecamp de 37signals. Le framework exploite
les blocs, conventions, classes ouvertes et capacités de
métaprogrammation de Ruby pour réduire la configuration nécessaire aux
applications web.
Rails popularise notamment deux formules : convention over
configuration et don’t repeat yourself. Les noms de classes et de
tables suivent des conventions ; le développeur écrit moins de fichiers
décrivant des relations que le framework peut déduire.
Des démonstrations où une application fonctionnelle apparaît en quelques
minutes donnent à Ruby une visibilité mondiale. De nombreux développeurs
découvrent d’abord Rails, puis le langage qui permet ses API
déclaratives.
Il faut toutefois distinguer les auteurs et les couches. Matsumoto n’a
pas créé Rails ; Hansson et sa communauté en sont responsables. Ruby
existait près d’une décennie avant lui et sert aussi aux scripts, outils
système, tests, génération de sites et logiciels embarqués.
Rails montre comment les caractéristiques d’un langage peuvent rendre
possible un framework singulier. Il révèle aussi leurs limites : les
conventions implicites accélèrent le cas standard, mais compliquent
parfois le diagnostic lorsqu’une application s’écarte du chemin prévu.
Faire évoluer l’implémentation sans changer l’identité
L’implémentation de référence est appelée MRI, pour Matz’s Ruby
Interpreter, ou CRuby parce qu’elle est écrite en C. À mesure que
l’usage augmente, ses performances et son modèle d’exécution deviennent
des enjeux importants.
Ruby 1.9 intègre YARV, machine virtuelle conçue principalement par
Koichi Sasada. Elle compile le code vers des instructions intermédiaires
et améliore l’architecture de l’exécution. D’autres implémentations
explorent des plateformes différentes : JRuby sur la machine virtuelle
Java, TruffleRuby sur GraalVM et mruby pour l’embarqué.
Ces projets rappellent que Matz guide le langage sans écrire seul chaque
composant. Sasada, les mainteneurs du cœur, les auteurs de bibliothèques
et les équipes d’implémentations alternatives élargissent les usages et
confrontent la spécification implicite aux différences réelles.
Ruby doit simultanément préserver la compatibilité et améliorer sa
vitesse. Les comportements dynamiques — redéfinition de méthodes,
introspection, création de code — limitent certaines optimisations,
car le runtime doit supposer que le programme peut changer.
Les versions modernes ajoutent donc compilateurs à la volée, profilage
et optimisations tout en conservant l’essentiel du modèle dynamique. Le
défi illustre un compromis général : les fonctions qui rendent un
langage agréable à explorer peuvent rendre son exécution plus difficile
à prévoir.
Gouverner par la cohérence et la discussion
Matsumoto reste le concepteur principal et un arbitre important de Ruby.
Son rôle est moins de produire chaque correctif que d’évaluer si une
proposition correspond à l’identité du langage et à sa trajectoire.
Cette forme de gouvernance offre une direction reconnaissable, mais elle
dépend d’une écoute organisée. Le suivi public des problèmes, les
listes, conférences et équipes du cœur permettent de confronter une idée
aux besoins des implémenteurs et utilisateurs.
La Ruby Association, présidée par Matsumoto, cherche par ailleurs à
relier communauté libre et organisations qui ont besoin de stabilité.
Cette mission expose une tension permanente : un langage doit progresser
pour ne pas devenir obsolète, mais une évolution trop brutale détruit la
confiance des applications existantes.
Matsumoto ne résout pas cette tension par une règle unique. Ruby évolue
par versions, avertissements de dépréciation, expérimentations et
décisions parfois révisées. La cohérence est un travail continu, pas une
propriété acquise en 1993.
Pourquoi Yukihiro Matsumoto compte encore
Ruby a démontré qu’un langage dynamique pouvait placer l’expérience du
programmeur au centre sans se réduire à un outil pédagogique. Ses blocs,
itérateurs et API expressives ont influencé la manière dont d’autres
communautés parlent de lisibilité et de langages internes.
Matsumoto a également montré l’importance d’un goût assumé. Un langage
ne naît pas seulement d’une liste de fonctions demandées par vote.
Quelqu’un doit décider quelles combinaisons forment un ensemble
reconnaissable, quelles complexités peuvent rester dans l’implémentation
et lesquelles doivent apparaître à l’utilisateur.
Ruby fournit enfin un avertissement utile. Une syntaxe agréable et une
métaprogrammation puissante améliorent la productivité lorsque les
conventions sont partagées. Elles peuvent dégrader la maintenance
lorsque le comportement devient implicite ou global.
Le « bonheur du programmeur » ne doit donc pas être compris comme le
plaisir de taper le moins de caractères. Il désigne un équilibre entre
écriture, lecture, retour de l’outil et capacité à transformer une idée
en logiciel sans lutte inutile contre le langage.
Chronologie
- 1965 : naissance de Yukihiro Matsumoto dans la préfecture
d’Osaka.
- 1984 : entrée à l’université de Tsukuba en sciences de
l’information.
- 1990 : diplôme de l’université de Tsukuba, puis carrière dans le
développement logiciel.
- 1993 : début de la conception de Ruby le 24 février.
- 1995 : publication de Ruby 0.95 sur des groupes de discussion
japonais en décembre.
- 1996 : publication de Ruby 1.0.
- 2000 : Programming Ruby contribue à la diffusion
internationale du langage.
- 2003 : Ruby 1.8 stabilise la branche utilisée lors de son
expansion mondiale.
- 2004 : création de Ruby on Rails par David Heinemeier Hansson.
- 2006 : forte croissance internationale des groupes et
conférences Ruby.
- 2007–2009 : transition vers Ruby 1.9 et intégration de la
machine virtuelle YARV de Koichi Sasada.
- 2011 : Matsumoto reçoit le prix de la Free Software Foundation
pour le développement du logiciel libre.
- 2013 : publication de Ruby 2.0, vingt ans après le début du
projet.
- 2020 : publication de Ruby 3.0 avec un effort majeur sur les
performances et les outils de concurrence.
Questions fréquentes
Pourquoi Yukihiro Matsumoto a-t-il créé Ruby ?
Il voulait un langage de script pratique dont le modèle objet soit
central plutôt qu’ajouté après coup. Aucun langage qu’il connaissait ne
réunissait exactement la souplesse, les objets, les itérateurs et
l’expérience d’écriture qu’il recherchait.
Ruby est-il inspiré uniquement de Smalltalk ?
Non. Smalltalk influence fortement son modèle objet, mais Matsumoto cite
aussi Perl, Lisp, Eiffel et Ada. Ruby combine ces influences puis les
adapte à une identité propre.
Que signifie « optimiser pour le bonheur du programmeur » ?
Cela signifie privilégier une interface expressive, un retour rapide et
des constructions proches de l’intention humaine. Ce n’est pas une
promesse de facilité absolue : la complexité existe toujours, mais le
langage essaie d’en cacher la partie répétitive.
Matsumoto a-t-il créé Ruby on Rails ?
Non. David Heinemeier Hansson a créé Rails en l’extrayant de Basecamp en
2004. Le framework a rendu Ruby beaucoup plus visible et exploite
intensivement ses blocs, conventions et capacités de métaprogrammation.
Quelles sont les principales limites de Ruby ?
Son dynamisme peut repousser certaines erreurs jusqu’à l’exécution, et
ses classes ouvertes peuvent produire des interactions difficiles à
diagnostiquer. La performance a aussi longtemps été un défi. Tests,
conventions et outils modernes réduisent ces risques sans les supprimer.