Trente-sept raisons pour lesquelles j'aime Ruby

Traduction de Ruby's Page Fulton Hal

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à.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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)

  6. 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.

  7. 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.

  8. 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.)

  9. 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.

  10. 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.

  11. 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.

  12. 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.

  13. C'est thread-capable. Vous pouvez écrire des applications multi-threaded avec une simple API. Oui, même sur MS-DOS.

  14. 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.

  15. 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).

  16. 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.

  17. 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.

  18. 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.

  19. 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.)

  20. 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.

  21. 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.

  22. 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.

  23. 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.

  24. 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!).

  25. 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.

  26. 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.

  27. 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.

  28. Il possède un débogueur. Dans un monde parfait, nous n'aurions pas besoin débogueurs. Ce n'est pas un monde parfait.

  29. 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.)

  30. 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.

  31. Il est orienté expression. Vous pouvez facilement dire des choses comme : x = if a<0 then b else c end.

  32. 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.

  33. 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.

  34. 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.

  35. 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.

  36. 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.

  37. 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.