|
Trente-sept raisons
pour lesquelles j'aime Ruby
|
|
Je ne vais pas faire l'histoire du langage Ruby ici. Pour ceux
d'entre vous qui n'en ont pas entendu parler, allez sur www.ruby-lang.org pour le site de
référence, et comp.lang.ruby pour
le groupe de discussion. Je vous présente les raisons pour lesquelles
j'aime ce (relativement) nouveau langage.Vous pouvez aussi visiter ma
page principale page Ruby si vous
n'êtes pas venue par là.
- Il est orienté objet. Qu'est-ce que
cela signifie? Eh bien, pour chaque dizaine de programmeurs, il y a une
douzaine d'opinions sur ce qu'est la POO (Programmation Orienté
Object). Je vous laisse le constater. Mais sur la question, Rubis offre
l'encapsulation des données et des méthodes dans des objets et permet
l'héritage d'une classe à un autre; et il permet le polymorphisme
d'objets. Contrairement à d'autres langues (C++, Perl 5, etc) Ruby a
été conçu dès le départ pour être orienté objet.
- C'est un pur langage orienté objet.
Suis-je redondant? Je ne le pense pas. Nous entendons par là que tout,
y compris les types de données primitifs tels que les chaînes et les
nombres entiers, sont représentés comme des objets. Il n'est pas
nécessaire de recourir à des classes enveloppeurs tel qu'en Java. Et en
plus, même les constantes sont traitées comme des objets, de sorte
qu'une méthode peut y être invoquée, par exemple, une constante
numérique est un récepteur sur lequelle on peut appeler une méthode.
- Il s'agit d'un langage dynamique.
Pour les personnes familières des languages statiques tels que C++ et
Java, il s'agit d'un saut conceptuel important. Cela signifie que les
méthodes et les variables peuvent être ajoutées et redéfini lors de
l'exécution. Il suprime le besoin de fonctions de compilation
conditionnelle tel qu'en C du genre (# ifdef) et rend
possible une API de réflexion sophistiquée. Cela permet des programmes
visant à devenir d'avantage "self-conscient" -- Permission d'une
information sur le type au cours de l'exécution, détection des méthodes
manquantes, crochets pour détection des méthodes supplémentaires, et
ainsi de suite. Ruby est liée à Lisp et Smalltalk à cet égard.
- C'est un langage interprété. Il
s'agit d'une question complexe, et cela mérite quelques commentaires.
On peut faire valoir que les questions de performances vont être évalué
ici négativement plutôt que positivement. À cette préoccupation, je
réponds par ces observations : 1- Tout d'abord : Un cycle de
développement rapide est un grand avantage, et il est encouragé par la
nature interprétée de Ruby. 2- Comme lentement est trop lent, de toute
façon. Faites quelques points de référence avant que vous ne le
décrétiez lent. 3- Bien que certains vont me critiquer, je dirai ceci
tout de même : les processeurs arrivent plus rapidement chaque année.
4- Si vous avez absolument besoin de la vitesse, vous pouvez écrire une
partie de votre code en C. 5- Enfin, dans un sens, tout cela est un
point discutable, car aucune langue est en soi vouée à être
exclusivement interprété. Il n'existe aucune loi de l'univers qui dit
qu'un compilateur Ruby ne peut pas être écrit.
- Il comprend les expressions régulières.
Pendant des années, cela était considéré comme le domaine UNIX de la
"saucisse", du manimant maladroit des outils UNIX comme grep
et sed et de faire de la fantaisie de
(recherche-et-remplace) des opérations dans vi. Perl
a contribué à changer, et maintenant Ruby est d'aider, aussi. Plus de
gens que jamais de reconnaître l'incroyable puissance de la chaîne de
super-pointe et de techniques de manipulation de texte. Les sceptiques
devraient aller lire Friedl livre de Jeffrey Maîtrise des expressions
régulières. Donc, si la non-sceptiques.
(A
retraduire plus correctement)
- Il est multi-plateforme. Il
fonctionne sur Linux et d'autres variantes d'UNIX, sur différentes
plates-formes Windows, BeOS, et même MS-DOS. Si je me souviens, il y a
une version Amiga.
- Il est dérivé. C'est une bonne chose
? En dehors du monde littéraire, oui, il est. Isaac Newton a dit: " Si
j'ai vu plus loin que les autres, c'est parce que je me tenais sur les
épaules de géants." Ruby a certainement debout sur les épaules de
géants. Elle emprunte les caractéristiques de Smalltalk, CLU, Lisp, C,
C + +, Perl, Kornshell, et d'autres. Les principes que je vois au
travail sont les suivants: 1- Ne pas réinventer la roue. 2- Ne pas
réparer ce qui n'est pas brisé. 3- Enfin, et surtout: les gens de
levier de connaissances existantes. Vous comprenez les fichiers et les
tuyaux sous UNIX ? Fine, vous pouvez utiliser cette connaissance. Vous
passé deux ans d'apprentissage de tous les prescripteurs printf
? Ne vous inquiétez pas, vous pouvez toujours utiliser printf.
Vous savez regex manutention de Perl ? Bon, alors vous avez presque
appris Ruby.
- Il est novateur. Est-ce en
contradiction avec #7 ci-dessus ? Eh bien, en partie, chaque médaille a
deux faces. Certains des fonctionnalités de Ruby sont réellement
innovantes, comme l'utile concept même de la mix-in. Peut-être que
certaines de ces fonctionnalités seront empruntés à son tour par les
langues avenir. (Note: Un lecteur a signalé pour moi que LISP avait
mix-ins au moins aussi loin que 1979. C'est purement l'ignorance de ma
part, je vais trouver un meilleur exemple, et assurez-vous de
celui-ci.)
- Il s'agit d'un très haut niveau de langue
(VHLL). Ceci est soumis à débat, car ce terme n'est pas
largement utilisé, et sa signification est encore plus discutable que
celle de la POO (Programation Orienté Object). Quand je dis cela, je
veux dire que Ruby peut gérer des structures complexes de données et
des opérations complexes sur eux avec quelques instructions
relativement simples, conformément à ce que certains appellent le
principe de moindre effort.
- Il dispose d'un garbage collector à puce.
Les routines comme malloc et free
ne sont plus qu'un mauvais souvenir. Vous n'avez même pas besoin
d'appeler les destructeurs. J'en ai dit assez.
- C'est un langage de script. Ne faites
pas l'erreur de penser qu'il n'est pas assez puissant à cause de cela.
Ce n'est pas un jouet. C'est un véritable langage qui arrive à faire
facilement les opérations traditionnelles de script comme l'exécution
de programmes externes, en examinant les ressources système, en
utilisant des tuyaux, la capture de sortie, et ainsi de suite.
- Il est polyvalent. Il peut faire les
choses que Kornshell fait bien, et les choses que le C fait bien. Vous
voulez écrire un rapide dix lignes-hack pour faire une tache ou un
wrapper pour certains programmes existants ? Excellent. Vous souhaitez
écrire un serveur Web, un script CGI ou un programme d'échecs ? De
nouveau, excellent.
- C'est thread-capable. Vous pouvez
écrire des applications multi-threaded avec une simple API. Oui, même
sur MS-DOS.
- Il est open-source. Vous voulez
regarder le code source? Allez-y. Vous voulez proposer un patch?
Allez-y. Vous voulez vous connecter avec une communauté d'utilisateur
bien informée utile et compétente, incluant le créateur du language
lui-même ? Vous pouvez.
- Il est intuitif. La courbe
d'apprentissage est faible, et une fois que vous surmontez la première
bosse, vous commencez à «deviner» comment les choses fonctionnent ...
et vos suppositions sont souvent justes. Ruby s'efforce de suivre le
principe de moindre surprise (de surprise minimum).
- Il dispose d'un mécanisme d'exception.
Comme Java et C + +, Ruby comprend des exceptions. Cela signifie moins
d'appels avec des codes de retour, moins d'instructions if
imbriquées, moins de logique spaghetti, et une meilleure gestion des
erreurs.
- Il a une classe Array avancée. Les
tableaux sont dynamiques, vous n'avez pas à déclarer leur taille au
moment de la compilation comme dans, disons, Pascal. Vous n'avez pas à
allouer de la mémoire pour eux comme en C, C++ ou Java. Ce sont des
objets, de sorte que vous n'avez pas à controler leur longueur, il est
pratiquement impossible de "s'en aller" hors la fin d'un tableau comme
vous pourriez le faire en C. Vous voulez les traiter par indice? Par
élément? Les traitez en arrière ? Les imprimez ? Il existe des méthodes
pour toutes ces actions. Voulez-vous utiliser un tableau comme un
ensemble, une pile ou une file d'attente? Il existe des méthodes pour
ces opérations, aussi. Vous voulez utiliser un tableau comme un tableau
de conversion? C'est une question piège, vous ne devez pas, puisque
nous avons le hachage pour cela.
- Il est extensible. Vous pouvez écrire
des bibliothèques externes en Ruby ou en C. En outre, vous pouvez
modifier les classes existantes et les objets à volonté, à la volée.
- Il encourage une programmation littéraire.
Vous pouvez intégrer des commentaires dans votre code que l'outil de
documentation Ruby permet d'extraire et de manipuler. (Les vrais fans
de la programmation littéraire peuvent penser que c'est assez
rudimentaire.)
- Il utilise la ponctuation et la casse des
caractères de façon créative. Une méthode retournant un résultat
booléen (bien que Ruby n'impose pas cette norme) possède un nom
généralement terminée par un point d'interrogation, et les méthodes
plus destructives modifiant les données sont nommés avec un point
d'exclamation. Simple, informatif et intuitive. Toutes les constantes,
y compris les noms de classes, débutent par une majuscule. Tous les
attributs d'objet commence par un signe @. Cela a le pragmatisme de
l'ancienne "notation hongroise" sans être d'une laideur discordante à
l'oeil.
- Les mots réservés ne sont pas réservés.
Il est parfaitement admissible d'utiliser un identificateur qui est un
soi-disant "mot réservé" aussi longtemps que l'analyseur n'a pas percu
d'amibiguité. C'est une bouffée d'air frais.
- Il permet les itérateurs. Parmi
d'autres choses, cela permet de passer les blocs de code à vos objets
d'une telle façon que le bloc soit appelé à chaque élément d'un
tableau, d'une liste, d'un arbre, ou de quelque chose de la sorte. Il
s'agit d'une technique puissante qui mérite d'être étudiée longuement.
- Il a la sécurité et les dispositifs de
sécurité. Ruby emprunte le concept d'altération de Perl et
permet différents niveaux de contrôle (niveaux de paranoïa?) par le
biais de la variable $SAFE. Cela est particulièrement
bien adapté pour des programmes CGI que les gens essayeront de
renverser pour forcer le serveur Web.
- Il n'a pas de pointeurs. Comme Java,
et avec un clin d'oeil à contrecœur à C++, Ruby n'a pas la notion de
pointeur, il n'y a pas d'indirection, pas d'arithmétique des pointeurs,
et aucun des maux de tête qui vont avec la syntaxe et le débogage des
pointeurs. Bien sûr, cela signifie que la programmation directe du
système réelle est plus difficile, comme par exemple, accéder à un
statut du registre de contrôle pour un appareil, mais cela peut
toujours se faire dans une bibliothèque C. (Tout comme les programmeurs
C tombent dans l'Assembleur en cas de besoin, les programmeurs Ruby
tombent dans C quand ils doivent!).
- Il prête attention aux détails.
Synonymes et alias abondent. Vous ne vous souvenez pas s'il faut dire
la taille (size) ou la longueur (length)
d'une chaîne ou d'un tableau ? Chacune des méthodes fonctionne. Pour
les plages, est-ce le début (begin) et la fin (end),
ou le premier (first) et le dernier (last)
? Faites votre choix. Vous l'orthographiez (indices),
et votre mauvais jumeau l'orthographie ( indexes) ?
Les deux méthodes fonctionnent.
- Il a une syntaxe flexible. Les
parenthèses dans les appels de méthode et les virgules entre les
paramètres peuvent être omises. Les quotes de style Perl permettent de
définir des tableaux de string sans guillemets ni virgules. Le mot clé return
peut être omis.
- Il a un grand ensemble de bibliothèques.
Il y a un support pour les threads, les sockets, la persistance limitée
des objets, les programmes CGI, les exécutables coté serveur, les
fichiers DB, et plus encore. Il y a quelque support pour Tk, avec plus
sur le chemin.
- Il possède un débogueur. Dans un
monde parfait, nous n'aurions pas besoin débogueurs. Ce n'est pas un
monde parfait.
- Il peut être utilisé de manière interactive.
Il concevable qu'il puisse être utilisé comme une sorte de "Kornshell
carré." (C'est le point le plus contesté sur cette page, et je suis
forcé d'admettre que Ruby n'est pas vraiment bon comme un shell. Je
maintiens toujours cependant, qu'une base shell Ruby serait une bonne
chose.)
- Il est concis. Il n'y a pas de
mots-clés superflus tels qu'en Pascal, begin, then
après if, do après while.
Les variables ne doivent pas être déclarés, car elles n'ont pas de
types. Les types de retour ne doivent pas être spécifié pour les
méthodes. Le mot clé return n'est pas nécessaire, une
méthode va retourner la dernière expression évaluée. D'un autre côté
... il n'est pas si mystérieux que C ou Perl.
- Il est orienté expression. Vous
pouvez facilement dire des choses comme : x = if a<0 then b
else c end.
- Il est ponctué de sucre de syntaxe.
(Pour paraphraser Mary Poppins : une cuillerée de sucre de syntaxe aide
la médecine sémantique à descendre.) Si vous souhaitez parcourir un
tableau x en disant for a in x,
vous pouvez. Si vous voulez dire a += b au lieu de a
= a + b, vous pouvez. La plupart des opérateurs sont en
réalité des méthodes avec des noms courts et intuitifs et une syntaxe
plus pratique.
- Il a la surcharge des opérateurs. Si
je ne me trompe pas, cette faculté est originaire il y bien longtemps
du langage SNOBOL, mais elle a été popularisée plus récemment avec le
C++. Elle peut être exagérée ou employée improprement, mais elle est
agréable. En outre, Ruby définit automatiquement l'opération
d'affectation qui est associé à l'opérateur, si vous définissez +,
vous obtenez += comme un bonus.
- Il a une précision arithmétique entière
infinie. Qui se soucie de short, int,
long? Suffit d'utiliser un Bignum.
Avouez, vous avez toujours voulu trouver le factoriel de 365.
Maintenant vous pouvez.
- Il dispose d'un opérateur d'exponentiation.
Dans l'ancien temps, nous l'avons utilisé en BASIC et en FORTRAN. Mais
alors nous avons appris le Pascal et le C et nous avons appris comment
mauvais était cet opérateur. (On nous a dit que nous ne savions même
pas comment l'évaluation était faite, a-t-il utilisé les logarithmes?
les itérations ? Quelle efficacité avait-il?) Mais alors, nous
soucions-nous vraiment ? Si oui, nous pouvons le réécrire nous-mêmes.
Si non, Ruby a le bon vieil opérateur ** que vous avez aimé comme un
enfant. Amusez-vous bien.
- Il a la manipulation de chaîne puissante.
Si vous souhaitez rechercher, remplacer, justifier, formater, trimer,
délimiter, interposer ou découper, vous pouvez probablement utiliser
une des méthodes intégrées. Sinon, vous pouvez les mettre à profit pour
produire ce dont vous avez besoin.
- Il a peu d'exceptions à ses règles.
La syntaxe et la sémantique de Ruby sont plus auto-cohérente que la
plupart des langues. Chaque langue a ses bizarreries, et chaque règle a
des exceptions, mais Ruby en a moins que l'on pourrait s'y attendre.