Aller au contenu principal
Bethemesh
BiographieHistoire de l’informatique

Yukihiro Matsumoto : Ruby et le bonheur du programmeur

Découvrez comment Yukihiro Matsumoto a conçu Ruby comme un langage objet expressif, puis guidé son évolution collective avant et après l'essor de Ruby on Rails.

Publié le 24 août 2026Lecture : 13 minPar Équipe Bethemesh
Débutant
Portrait de Yukihiro Matsumoto devant du code Ruby mettant en valeur objets et blocs
Afficher le sommaire
  1. Apprendre les langages avant d’en créer un
  2. Le 24 février 1993 : le début de Ruby
  3. Tout est objet, mais l’objet doit rester pratique
  4. Blocs, fermetures et itérateurs
  5. Héritage simple et mixins
  6. Classes ouvertes et métaprogrammation
  7. « Naturel », pas simplement minimal
  8. Une communauté d’abord japonaise
  9. Ruby on Rails : l’accélérateur, pas l’origine
  10. Faire évoluer l’implémentation sans changer l’identité
  11. Gouverner par la cohérence et la discussion
  12. Pourquoi Yukihiro Matsumoto compte encore
  13. Chronologie
  14. Questions fréquentes
  15. Pourquoi Yukihiro Matsumoto a-t-il créé Ruby ?
  16. Ruby est-il inspiré uniquement de Smalltalk ?
  17. Que signifie « optimiser pour le bonheur du programmeur » ?
  18. Matsumoto a-t-il créé Ruby on Rails ?
  19. Quelles sont les principales limites de Ruby ?

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.

Sources et références

  1. 1.Ruby --- About Ruby
  2. 2.Ruby --- Official FAQ: History of Ruby
  3. 3.Ruby source repository --- Early Ruby history
  4. 4.University of Tsukuba --- Yukihiro Matsumoto alumni profile
  5. 5.Ruby Association --- About the organization and Ruby

Collection

Langages de programmation

  1. 01Grace Hopper : des premiers compilateurs à COBOL
  2. 02John Backus : FORTRAN, la notation BNF et le refus du code machine
  3. 03Dennis Ritchie : le langage C au cœur d'Unix
  4. 04FORTRAN : prouver qu'un compilateur peut rivaliser avec l'assembleur
  5. 05Le langage C : rendre les systèmes portables sans masquer la machine
  6. 06Niklaus Wirth : de Pascal à Oberon, concevoir par la simplicité
  7. 07Bjarne Stroustrup : concevoir C++ sans renoncer aux performances
  8. 08Pascal : apprendre à programmer en rendant la structure visible
  9. 09C++ : de C with Classes à un langage généraliste
  10. 10La programmation orientée objet : objets, messages et abstractions réutilisables
  11. 11Guido van Rossum : créer Python pour rendre le code lisible
  12. 12Brendan Eich : JavaScript, du prototype de Netscape au standard du Web
  13. 13James Gosling : l'ingénieur à l'origine de Java
  14. 14Python : la lisibilité, les batteries incluses et un écosystème mondial
  15. 15Java : écrire une fois, exécuter partout
  16. 16JavaScript : le langage qui a rendu le Web interactif
  17. 17Ken Thompson : d’Unix au langage Go, la simplicité comme méthode
  18. 18John McCarthy : Lisp et l’idée de programmer avec des symboles
  19. 19Alan Kay : Smalltalk et l’ordinateur comme média personnel
  20. 20Barbara Liskov : l'abstraction qui a rendu le logiciel modulaire
  21. 21Robin Milner : ML, la preuve assistée et les langages de l’interaction
  22. 22Brian Kernighan : AWK, Unix et l'art d'expliquer le code
  23. 23Anders Hejlsberg : de Turbo Pascal à C# et TypeScript
  24. 24Larry Wall : Perl, le langage qui a relié les outils d'Internet
  25. 25Yukihiro Matsumoto : Ruby et le bonheur du programmeur
  26. 26Rasmus Lerdorf : PHP et la démocratisation du Web dynamique

Cet article vous a-t-il été utile ?