|
| 1 | +--- |
| 2 | +layout: page |
| 3 | +title: "À propos de Ruby" |
| 4 | +lang: fr |
| 5 | +--- |
| 6 | + |
| 7 | +Indéniablement, Ruby devient de plus en plus populaire. Les « rubyistes |
| 8 | +» qualifient ce langage d’élégant, voire lui prêtent des qualités |
| 9 | +artistiques ; ils soulignent dans le même temps qu’il est pratique à |
| 10 | +utiliser et facile d’accès. Mais tout ça est très éthéré, qu’en est-il |
| 11 | +concrètement parlant ? |
| 12 | + |
| 13 | +### Ruby, une conceptualisation personnelle |
| 14 | + |
| 15 | +{: |
| 16 | +style="padding-left:8px;"} |
| 17 | +{: style="float:right"} |
| 18 | + |
| 19 | +Le langage ruby, en terme de syntaxe et de fonctionnalité, a été dès le |
| 20 | +départ conçu comme un ensemble homogène. Son créateur est le programmeur |
| 21 | +japonais [Yukihiro « matz » Matsumoto][1]. Ce dernier a rassemblé |
| 22 | +certaines fonctionnalités de ses langages préférés de l’époque |
| 23 | +(principalement Perl, Smalltalk, Eiffel, Ada et Lisp) afin d’imaginer un |
| 24 | +nouveau langage qui mêlerait astucieusement programmations impérative et |
| 25 | +fonctionnelle. À plusieurs reprises, il a déclaré que son but était « |
| 26 | +d’essayer de rendre Ruby le plus naturel possible, pas nécessairement |
| 27 | +simple. » |
| 28 | + |
| 29 | +À ce propos, il a ajouté : |
| 30 | + |
| 31 | +> Ruby est simple en apparence, mais son architecture interne est très |
| 32 | +> complexe — tout comme notre corps peut l’être<sup>[1](#fn1)</sup>. |
| 33 | +
|
| 34 | +C’est cette approche qui a été maintenue depuis lors, pour faire de Ruby |
| 35 | +un langage robuste, porté par une syntaxe naturelle. |
| 36 | + |
| 37 | +### La croissance de Ruby |
| 38 | + |
| 39 | +Depuis sa publication en 1995, Ruby a progressivement intéressé de plus |
| 40 | +en plus de programmeurs venant des quatre coins du monde. En 2006, Ruby |
| 41 | +rassemblait une masse critique d’utilisateur et gagnait une réelle |
| 42 | +reconnaissance. Aujourd’hui, des groupes d’utilisateurs existent dans |
| 43 | +les plus grandes villes du monde, et les (nombreuses) conférences à |
| 44 | +propos de Ruby affichent complet. |
| 45 | + |
| 46 | +{: style="padding-left:8px;"} |
| 49 | +{: style="float:right"} |
| 50 | + |
| 51 | +Ruby-Talk, la toute première [liste de |
| 52 | +diffusion](/fr/community/mailing-lists/) recevant les discussions à |
| 53 | +propos du langage Ruby, atteint aujourd’hui une moyenne de deux cent |
| 54 | +nouveaux messages par jour. |
| 55 | + |
| 56 | +L’index TIOBE, qui mesure la croissance des langages informatiques, |
| 57 | +place Ruby à la dixieme place du classement des langages les plus |
| 58 | +utilisés au monde. Concernant cette évolution, leur prédiction est la |
| 59 | +suivante : « il y a des chances que Ruby entre dans le top 10 dans moins |
| 60 | +de six mois. » La plus grande part de cette accélération semble revenir |
| 61 | +à la popularité de certains logiciels écrits en Ruby, notamment le |
| 62 | +framework web Ruby on Rails<sup>[2](#fn2)</sup>. |
| 63 | + |
| 64 | +Par ailleurs, Ruby est [totalement libre](./license.txt). Il est non |
| 65 | +seulement gratuit, mais son utilisation, sa copie, sa modification et sa |
| 66 | +distribution sont également libres. |
| 67 | + |
| 68 | +### Une complète orientation objet |
| 69 | + |
| 70 | +Initialement, Matz a étudié les autres langages afin de définir une |
| 71 | +syntaxe qui lui serait idéale. Se remémorant cet épisode, il nous |
| 72 | +rapportait : « je voulais un langage de script plus puissant que Perl, |
| 73 | +et plus orienté objet que Python<sup>[3](#fn3)</sup>.” |
| 74 | + |
| 75 | +Dans Ruby, le paradigme de base est que tout y est un objet. Chaque |
| 76 | +entité d’information et de code peut recevoir ses propres propriétés et |
| 77 | +actions. La programmation orientée objet fait référence aux propriétés |
| 78 | +sous le terme de *variables d’instance*, et aux actions sous le nom de |
| 79 | +*méthodes*. L’approche purement objet de Ruby est très souvent illustrée |
| 80 | +par un bout de code montrant l’application d’une action à un nombre. |
| 81 | + |
| 82 | + 5.times { print "Nous *adorons* Ruby -- Même trop !" } |
| 83 | +{: .code .ruby-code} |
| 84 | + |
| 85 | +Dans beaucoup de langages, les nombres et autres types primaires ne sont |
| 86 | +pas des objets. Ruby suit ici la voie de Smalltalk, en donnant accès aux |
| 87 | +méthodes et variables d’instance à tous les types. Cela facilite |
| 88 | +l’appropriation de Ruby, puisque les règles s’appliquant aux objets |
| 89 | +usuels s’appliquent en fait à travers tout Ruby. Par ailleurs, la |
| 90 | +syntaxe est triviale, se rapprochant d’une phrase minimaliste en |
| 91 | +anglais. |
| 92 | + |
| 93 | +### Un soucis de flexibilité |
| 94 | + |
| 95 | +Ruby a pour réputation d’être un langage très flexible, autorisant |
| 96 | +notamment son utilisateur à en modifier les entrailles durant |
| 97 | +l’exécution. Des parties importantes de Ruby peuvent être retirées ou |
| 98 | +redéfinies à loisir ; des greffes de fonctionnalités sont possibles en |
| 99 | +cours de route. En définitive, Ruby essaye de ne pas contraindre le |
| 100 | +programmeur, mais de lui fournir un squelette robuste autour duquel |
| 101 | +bâtir des applications. |
| 102 | + |
| 103 | +Par exemple, l’opération arithmétique d’addition est réalisée par |
| 104 | +l’opérateur plus (`+`). Mais si vous préférez utiliser une méthode |
| 105 | +`plus`, vous pouvez l’ajouter à la classe de base `Numeric` de Ruby : |
| 106 | + |
| 107 | + class Numeric |
| 108 | + def plus(x) |
| 109 | + self.+(x) |
| 110 | + end |
| 111 | + end |
| 112 | + |
| 113 | + y = 5.plus 6 |
| 114 | + # y vaut maintenant 11 |
| 115 | +{: .code .ruby-code} |
| 116 | + |
| 117 | +Tous les opérateurs de Ruby sont des méthodes pensées pour être aussi |
| 118 | +pratique que faire se peut, syntaxiquement parlant. Vous pouvez |
| 119 | +toutefois les redéfinir à votre convenance. |
| 120 | + |
| 121 | +### Les blocs, un moyen d’expression à part entière |
| 122 | + |
| 123 | +L’usage que fait Ruby des blocs de code est également reconnu comme |
| 124 | +étant une grande source de flexibilité. Un programmeur peut associer à |
| 125 | +toute méthode une *closure*, un bloc de code « anonyme » décrivant la |
| 126 | +manière dont la méthode doit se comporter. Une telle *closure* est |
| 127 | +appelée en Ruby un *bloc*. Cette fonctionnalité est rapidement devenu |
| 128 | +l’une des plus populaires auprès des nouveaux utilisateurs de Ruby, |
| 129 | +habitués à des langages impératifs comme PHP ou Visual Basic. |
| 130 | + |
| 131 | +Les blocs trouvent leur inspiration dans les langages fonctionnels. Matz |
| 132 | +a dit à ce propos : « en créant les *closures* de Ruby, je souhaitais |
| 133 | +respecter la voie tracée par Lisp<sup>[4](#fn4)</sup>. » |
| 134 | + |
| 135 | + search_engines = |
| 136 | + %w[Google Yahoo MSN].map do |moteur| |
| 137 | + "http://www." + moteur.downcase + ".com" |
| 138 | + end |
| 139 | +{: .code .ruby-code} |
| 140 | + |
| 141 | +Dans le code ci-dessus, le bloc est délimité par la structure `do ... |
| 142 | +end`. La méthode `map` applique le bloc à la liste de mots fournie en |
| 143 | +premier lieu par un simple tableau. Bien d’autres méthodes en Ruby |
| 144 | +laissent au programmeur l’opportunité d’écrire leurs propres blocs, afin |
| 145 | +de d’adapter le fonctionnement d’une méthode au contexte du script. |
| 146 | + |
| 147 | +### Le mécanisme de *mixin* |
| 148 | + |
| 149 | +À la différence de bien d’autres langages orientés objet, Ruby ne donne |
| 150 | +accès qu’à l’héritage unique, et ce, **volontairement**. En effet, Ruby |
| 151 | +supporte par ailleurs le concept de modules (similaires au *Categories* |
| 152 | +en Objective-C). Ces modules sont des regroupements de méthodes. |
| 153 | + |
| 154 | +Les classes peuvent « incorporer » un module (opération dite de *mixin*) |
| 155 | +afin d’en recevoir toutes les méthodes, sans plus de travail. Par |
| 156 | +exemple, toute classe implémentant une méthode `each` peut ensuite |
| 157 | +incorporer le module `Enumerable`, lequel fournit gratuitement plusieurs |
| 158 | +méthodes utilisant `each` pour faire des boucles. |
| 159 | + |
| 160 | + class MonTableau |
| 161 | + include Enumerable |
| 162 | + end |
| 163 | +{: .code .ruby-code} |
| 164 | + |
| 165 | +En général, les rubyistes préfèrent cette façon de faire à l’héritage |
| 166 | +multiple, qui est complexe et peut se révéler trop restrictif. |
| 167 | + |
| 168 | +### Le fond et la forme |
| 169 | + |
| 170 | +Bien que Ruby fasse un usage très limité de la ponctuation et se |
| 171 | +concentre sur des mots clé simples en anglais, quelques signes de |
| 172 | +ponctuation agrémentent la syntaxe. Ruby ne requière pas la déclaration |
| 173 | +des variables. Plus simplement, une convention de nommage est utilisée |
| 174 | +pour indiquer la portée des variables. |
| 175 | + |
| 176 | +* `var` pourrait être une variable locale. |
| 177 | +* `@var` est une variable d’instance. |
| 178 | +* `$var` est une variable globale. |
| 179 | + |
| 180 | +Ces signes améliorent la lisibilité en permettant une identification |
| 181 | +rapide du rôle de chaque variable. Il devient ainsi inutile de préfixer |
| 182 | +chaque variable d’instance d’un `self.` redondant. |
| 183 | + |
| 184 | +### Au delà de ces bases |
| 185 | + |
| 186 | +Ruby met à disposition du programmeur bien d’autres fonctionnalités, |
| 187 | +parmi lesquelles on peut citer… |
| 188 | + |
| 189 | +* une gestion des exceptions, tout comme Java ou Python, afin de gérer |
| 190 | + facilement les erreurs ; |
| 191 | +* un ramasse-miettes (*garbage collector*) utilisant l’algorithme |
| 192 | + *mark-and-sweep* pour gérer tous les objets. Il n’y a pas non plus |
| 193 | + besoin de maintenir un compte des références individuelles dans les |
| 194 | + bibliothèques d’extensions en C. Comme Matz le dit si bien, « c’est un |
| 195 | + bon point pour votre santé » ; |
| 196 | +* la possibilité d’écrire des extensions en C est plus simple qu’en Perl |
| 197 | + ou Python, grâce à une API élégante permettant d’appeler Ruby depuis |
| 198 | + le C. Cela comprend aussi bien les appels à Ruby au sein d’un |
| 199 | + logiciel, que l’utilisation de Ruby comme langage de script. Une |
| 200 | + interface SWIG est également disponible ; |
| 201 | +* la possibilité de charger une bibliothèque d’extension à la volée, si |
| 202 | + le système d’exploitation le permet ; |
| 203 | +* une très grande portabilité : développé majoritairement sous |
| 204 | + GNU/Linux, Ruby fonctionne aussi sur une grande part des UNIX, Mac OS |
| 205 | + X, Windows 95/98/Me/NT/2000/XP, DOS, BeOS, OS/2, etc. |
| 206 | + |
| 207 | +#### Références |
| 208 | + |
| 209 | +<sup>1</sup> Matz, [discutant][2] sur la liste de diffusion anglophone |
| 210 | +Ruby-Talk, le 12 mai 2000. |
| 211 | +{: #fn1} |
| 212 | + |
| 213 | +<sup>2</sup> Consultez le site Internet du projet [Ruby on Rails][3] (en |
| 214 | +anglais) pour plus de détails. |
| 215 | +{: #fn2} |
| 216 | + |
| 217 | +<sup>3</sup> Matz, dans *[An Interview with the Creator of Ruby][4]* (en |
| 218 | +anglais), le 29 novembre 2001. |
| 219 | +{: #fn3} |
| 220 | + |
| 221 | +<sup>4</sup> Matz, dans *[Blocks and Closures in Ruby][5]* (en anglais), |
| 222 | +le 22 décembre 2003. |
| 223 | +{: #fn4} |
| 224 | + |
| 225 | + |
| 226 | + |
| 227 | +[1]: http://www.rubyist.net/~matz/ |
| 228 | +[2]: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/2773 |
| 229 | +[3]: http://rubyonrails.org/ |
| 230 | +[4]: http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html |
| 231 | +[5]: http://www.artima.com/intv/closures2.html |
0 commit comments