Le langage Ruby est apparu en 1995, conçu par l'informaticien japonais
Yukihiro Matsumoto et quelques contributeurs qui ne trouvaient pas de quoi se satisfaire dans les langages déjà existants. Ce langage tient son nom d'un petit jeu de mot, provenant de la pierre précieuse rubis, par analogie avec le langage Perl.
Ruby se veut le successeur de Perl et une alternative à Python, pour être plus clair que le premier et plus orienté-objet que le second (bien qu'influencé également par
Smalltalk,
Lisp,
Dylan et
CLU).
La syntaxe s'inspirant de Perl et Python, se veut intuitive et naturelle, les instructions sont ainsi terminées par les fin de lignes, tel qu'en Python. On retrouve également la plupart des caractéristiques de celui-ci : tableaux associatifs, itérateurs, etc. Les blocs d'instructions et les boucles sont néanmoins terminées par
end.
La toute première apparition (non publique) du langage datant de 1993, pas moins de six versions sont apparues, de la version 1.1.0, publiée en 1995 à la 1.9.1, rendu publique le 30 janvier 2009 et inaugurant la branche 1.9.
De nombreuses implémentations
Ruby, langage interprété
Ruby étant un langage interprété, un interpréteur est donc nécessaire pour analyser, traduire et exécuter le code fourni. De manière général, un interpréteur est donc capable de lire le code source d'un langage sous forme de script (Ruby, dans notre cas), c'est-à-dire sous forme de fichier texte (le plus souvent), et d'en exécuter les instructions après une analyse syntaxique du contenu.
Depuis le 1er janvier 2007, le développement de Ruby, sous la branche 1.9, est basée sur l'interpréteur
YARV. Celui-ci apporte notamment un gain en performances.
De nombreux autres interpréteurs
Il existe de nombreux autres interpréteurs Ruby (et donc, de nombreuses implémentations), chacun ayant leur propre avantage et inconvénient. Une implémentation peut se définir comme un interpréteur ou compilateur qui respecte le même langage, assure un même comportement (même syntaxe, bibliothèques standards etc.) mais des performances différentes et une utilisation possible selon un environnement bien défini. Voici une liste, non exhaustive, de plusieurs interpréteurs Ruby :
- JRuby : écrit en Java, il interprète directement du code source écrit en Ruby. JRuby offre de meilleurs performances que la branche 1.8 de Ruby et est comparable à la branche 1.9.
- XRuby : convertit du code Ruby en bytecode Java et se montre plus rapide sur certains tests de performance que la version 1.8.5, de l'interpreteur officiel.
- Rubinius, une machine virtuelle simplifiée, inspirée de Smalltalk, implémentée en Ruby même.
- MacRuby, une implémentation de Ruby 1.9 spécifique à Mac OS X, et visant à remplacer l'implémentation RubyCocoa.
Sortie de Rubinius 1.0
Comme entrevu précédemment, Rubinius est une implémentation Ruby, dont le code est disponible sous
licence BSD. Rubinius permet d'exécuter du code Ruby mais se donne également d'autres objectifs, développés plus loin. Rubinius, dont le développement commença en Novembre 2006, voit sa version 1.0 enfin disponible. Celle-ci marque notamment la possibilité d'utiliser l'interpréteur Rubinius pour Ruby 1.8.7, mais également pour le
framework web Ruby on Rails (aussi bien la version 2.3 et que la version 3),
Rspec,
Rubygems, les bibliothèques Ruby et même une grande partie des extensions codées en C.
Techniquement, Rubinius est écrit majoritairement en Ruby, et en C++ pour des parties spécifiques ne pouvant pas être (encore) codées en Ruby. Il fonctionne avec une machine virtuelle dont le bytecode est ensuite transcris en code machine, à l'exécution grâce à
LLVM, un langage de bas niveau indépendant du processeur utilisé. LLVM se charge de transformer du code Ruby en code machine optimisé. En plus de permettre de compiler des programmes statiquement, LLVM est conçu pour permettre la
compilation à la volée, ce qui permet par exemple d'optimiser les programmes pendant leur exécution.
La version 1.0 vise de nombreux objectifs :
- Rubinius est threadsafe. Pour comprendre ce concept, il faut tout d'abord savoir ce qu'est un thread. Appelé tâche ou processus léger, un thread est similaire à un processus car tous deux sont utilisés pour l'exécution d'un ensemble d'instructions du langage machine. Toutefois, là où chaque processus possède sa propre mémoire virtuelle, les threads d'un même processus se partagent sa mémoire virtuelle. Cette idée de processus léger permet de découper un programme en un sous ensemble de processus légers pour des calculs lourds, par exemple, mettant ainsi en place une exécution fluide et plus rapide. On parle ainsi de thread-safe lorsqu'un programme fonctionne correctement durant une exécution sur plusieurs processus légers (threads).
- Le code de Rubinius est propre, lisible, facile à comprendre et à étendre
- Il est fiable et solide grâce à Valgrind, un outil libre permettant le déboggage du code en mettant en évidence les fuites de mémoire (une fuite de mémoire est une occupation croissante et non contrôlée de la mémoire d'un ordinateur).
- Rubinius apporte également les dernières avancées de la recherche sur les machines virtuelles, les ramasses-miettes et les compilateurs à Ruby (tout ce qu'il y a de plus récent, en autres).