90 votes

Python vs. Ruby pour la méta-programmation

Actuellement, je suis principalement programmeur en D et je cherche à ajouter un autre langage à mon arsenal, de préférence un qui prend en charge les astuces de métaprogrammation qui ne peuvent tout simplement pas être réalisées dans un langage compilé de manière statique comme D.

J'ai lu un peu sur Lisp et j'aimerais trouver un langage qui permet certaines choses intéressantes que fait Lisp, mais sans la syntaxe étrange, etc. de Lisp. Je ne veux pas commencer une guerre de langage, et je suis sûr que Ruby et Python ont leurs compromis, alors je vais énumérer ce qui est important pour moi personnellement. Veuillez me dire si Ruby, Python ou un autre langage serait le mieux pour moi.

Important :

  1. Bonne métaprogrammation. Capacité de créer des classes, des méthodes, des fonctions, etc. à l'exécution. De préférence, peu de distinction entre le code et les données, à la manière de Lisp.
  2. Syntaxe agréable, propre, sensée et sémantique cohérente et intuitive. Fondamentalement un langage bien conçu, amusant à utiliser et moderne.
  3. Paradigmes multiples. Aucun paradigme n'est idéal pour chaque projet, ou même chaque petit sous-problème au sein d'un projet.
  4. Un langage intéressant qui influence effectivement notre façon de penser la programmation.

Un peu important :

  1. Performance. Ce serait bien si la performance était décente, mais lorsque la performance est une véritable priorité, j'utiliserai plutôt D.
  2. Bien documenté.

Peu important :

  1. Taille de la communauté, disponibilité des bibliothèques, etc. Aucun de ces éléments ne caractérise le langage lui-même, et tous peuvent changer très rapidement.
  2. Disponibilité des emplois. Je ne suis pas un programmeur professionnel à temps plein. Je suis étudiant diplômé et la programmation est liée à mes recherches de manière indirecte.
  3. Toutes les fonctionnalités conçues principalement pour de très grands projets sur lesquels travaillent un million de singes de code.

1 votes

+1 Pour une question généralement bien posée.

0 votes

Malheureusement, les réponses les mieux notées disent essentiellement "cela dépend" et les réponses moins bien notées sont essentiellement une guerre de flamme Python vs Ruby.

0 votes

Avez-vous envisagé Clojure ?

69voto

S.Lott Points 207588

J'ai lu un peu sur Lisp et j'aimerais trouver un langage qui permette certaines des choses intéressantes que fait Lisp, mais sans la syntaxe étrange, etc., de Lisp.

Ne le voudrions-nous pas tous.

distinction minimale entre le code et les données, style Lisp

Malheureusement, la distinction minimale entre le code et les données et la syntaxe "étrange" sont des conséquences l'une de l'autre.

Si vous voulez une syntaxe facile à lire, vous avez Python. Cependant, le code n'est pas représenté dans l'une des structures de données intégrées couramment utilisées. Il échoue - comme la plupart des langages - dans le point n°1 de votre liste "importante". Cela rend difficile la fourniture d'une aide utile.

Vous ne pouvez pas tout avoir. Rappelez-vous, vous n'êtes pas le premier à avoir cette réflexion. Si quelque chose comme votre langage idéal existait, nous l'utiliserions tous. Puisque le monde réel est en deçà de vos idéaux, vous devrez revoir la priorité de votre liste de souhaits. La section "importante" doit être réorganisée pour identifier ce qui est vraiment important pour vous.

3 votes

J'ai trouvé que de nombreux langages implémentent des macros de type Lisp dans des syntaxes non-lispy et ce qui se termine par se passer, c'est que l'écriture de macros devient très difficile, car personne ne connaît naturellement les structures de données dans lesquelles le code est représenté, donc écrire des macros devient trop difficile et personne ne le fait.

11 votes

Les gens trouvent que Lisp est difficile à lire car ils ne sont pas familiers avec la syntaxe. Je trouve Lisp beaucoup plus facile à lire que C# (mais plus difficile que Python).

1 votes

Je suis largement d'accord avec le point, mais mon expérience à la fois avec Ruby et Lisp montre que le premier est aussi bon pour la méta-programmation que possible sans les parenthèses. D'autres alternatives qui s'en rapprochent pourraient être TCL et JavaScript, mais je ne les favoriserais pas pour d'autres raisons.

17voto

ars Points 35803

Honnêtement, en ce qui concerne les facilités de méta-programmation, Ruby et Python se ressemblent beaucoup plus que certains de leurs adeptes ne veulent l'admettre. Cette revue des deux langages offre une assez bonne comparaison / revoir:

Alors, choisissez-en un en fonction de certains critères. Peut-être que vous aimez Rails et que vous voulez étudier ce code. Peut-être que SciPy est votre truc. Regardez l'écosystème des bibliothèques, la communauté, etc, et choisissez-en un. Vous ne perdrez certainement pas un nirvana de méta-programmation en fonction de votre choix.

0 votes

Cette entrée de blog semble avoir plus à voir avec des préférences personnelles (c'est juste, mais la beauté est dans l'œil de celui qui regarde), plutôt qu'avec la méta-programmation - qui était le point principal de l'OP.

16voto

Steve Jessop Points 166970

Avertissement : Je m'aventure uniquement dans l'une ou l'autre langue, mais j'ai écrit au moins de petits programmes fonctionnels (pas seulement des scripts rapides, pour lesquels j'utilise Perl, bash ou GNU make) dans les deux.

Ruby peut être vraiment agréable pour le "point 3 des paradigmes multiples", car il s'efforce de rendre facile la création de langages spécifiques au domaine. Par exemple, parcourez en ligne et regardez quelques morceaux de code Ruby on Rails, et quelques morceaux de code Rake. Ils sont tous deux en Ruby, et vous pouvez voir les similitudes, mais ils ne ressemblent pas à ce que vous penseriez normalement être le même langage.

Python me semble un peu plus prévisible (peut-être lié au 'propre' et 'sain' point 2), mais je ne sais pas vraiment si cela est dû au langage lui-même ou simplement au fait qu'il est généralement utilisé par des personnes aux valeurs différentes. Je n'ai jamais tenté de magie profonde en Python. Je dirais certainement que les deux langages sont bien conçus.

Les deux se débrouillent bien dans les points 1 et 4. [Edit : en fait, le point 1 est assez discutable - il y a "eval" dans les deux, comme c'est courant dans les langages interprétés, mais ils ne sont guère conceptuellement purs. Vous pouvez définir des fermetures, attribuer des méthodes aux objets, et ainsi de suite. Pas sûr que cela aille aussi loin que vous le souhaitez.]

Personnellement, je trouve Ruby plus amusant, mais en partie parce qu'il est plus facile de se laisser distraire en pensant à des moyens cool de faire les choses. J'ai en fait utilisé Python plus souvent. Parfois, vous ne voulez pas de quelque chose de cool, vous voulez juste avancer pour que tout soit terminé avant l'heure du coucher...

Aucun des deux n'est difficile à appréhender, vous pourriez juste décider de faire votre prochaine tâche mineure dans l'un, et la suivante dans l'autre. Ou prenez un livre d'introduction sur chacun à la bibliothèque, lisez-les rapidement tous les deux et voyez ce qui vous attire.

15voto

Jason Baker Points 56682

Il n'y a pas vraiment de grande différence entre python et ruby du moins au niveau idéologique. Pour la plupart, ce ne sont que des saveurs différentes de la même chose. Ainsi, je recommanderais de voir laquelle correspond le mieux à votre style de programmation.

31 votes

Il est le plus certainement pas la même chose. Ils semblent similaires en surface, mais une fois que vous exercez les fonctionnalités les plus puissantes de Ruby, vous comprenez que Python n'est tout simplement pas à la hauteur. Par exemple, essayez d'écrire un DSL en Ruby par rapport à en écrire un en Python, ou de créer des fonctions, des méthodes, des classes, etc. à l'exécution. C'est beaucoup plus simple en Ruby.

3 votes

Oui, mais le point de Jason reste valable. La plupart des gens utilisent Ruby, Python, Perl, peu importe pour effectuer des tâches de programmation "normales". Il est rare que vous ayez absolument besoin d'utiliser la programmation dynamique, il est encore plus rare que vous ayez besoin de votre propre DSL défini personnalisé. Si vous restez en dehors du monde dynamique, globalement, Ruby et Python, et même Perl dans une moindre mesure, sont assez similaires.

14 votes

Il n'est pas rare que vous ayez besoin de faire de la méta-programmation, c'est juste rare que cela soit fait. Presque tous les programmes, sauf les plus triviaux, ont des motifs répétitifs qui ne relèvent pas des outils habituels de refactoring mais pourraient être facilement éliminés par la méta-programmation.

15voto

mykdavies Points 164

Avez-vous envisagé Smalltalk? Il offre une syntaxe très simple, claire et extensible avec des capacités de réflexivité et d'introspection et un environnement de développement entièrement intégré qui tire parti de ces capacités. Jetez un œil à certains des travaux en cours dans Squeak Smalltalk par exemple. Beaucoup de chercheurs utilisant Squeak se retrouvent sur la liste de diffusion Squeak et #squeak sur freenode, vous pouvez donc obtenir de l'aide sur des problèmes complexes très facilement.

D'autres indicateurs de sa pertinence actuelle : il fonctionne sur n'importe quelle plate-forme que vous souhaitez nommer (y compris l'iPhone); Gilad Bracha base son travail sur Newspeak sur Squeak; l'équipe V8 a fait ses premières armes sur des VM Smalltalk; et Dan Ingalls et Randal Schwartz sont récemment retournés au travail Smalltalk après des années dans la nature sauvage.

Meilleure chance dans votre recherche - faites-nous savoir ce que vous décidez au final.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X