web-dev-qa-db-fra.com

Python vs Ruby pour la métaprogrammation)

Je suis actuellement principalement un programmeur D et je cherche à ajouter une autre langue à ma boîte à outils, de préférence une qui prend en charge les hacks de métaprogrammation qui ne peuvent tout simplement pas être effectués dans un langage compilé statiquement comme D.

J'ai un peu lu sur LISP et j'aimerais trouver un langage qui permette certaines des choses sympas que LISP fait, mais sans l'étrange syntaxe, etc. de LISP. Je ne veux pas commencer une guerre de flamme de langue, et je suis sûr que les deux Ruby et Python ont leurs compromis, donc je vais lister ce qui est important) pour moi personnellement. Veuillez me dire si Ruby, Python ou une autre langue me conviendrait le mieux.

Important:

  1. Bonne métaprogrammation. Possibilité de créer des classes, des méthodes, des fonctions, etc. lors de l'exécution. De préférence, distinction minimale entre code et données, style LISP.
  2. Belle syntaxe claire et saine et sémantique cohérente et intuitive. Fondamentalement, un langage moderne bien pensé et amusant à utiliser.
  3. Paradigmes multiples. Aucun paradigme ne convient à chaque projet, ni même à chaque petit sous-problème d'un projet.
  4. Un langage intéressant qui affecte réellement la façon dont on pense à la programmation.

Assez important:

  1. Performance. Ce serait bien si les performances étaient décentes, mais quand les performances sont une vraie priorité, j'utiliserai D à la place.
  2. Bien documenté.

Pas important:

  1. Taille de la communauté, disponibilité de la bibliothèque, etc. Aucune de ces caractéristiques n'est la langue elle-même, et tout peut changer très rapidement.
  2. Disponibilité de l'emploi. Je ne suis pas un programmeur professionnel à plein temps. Je suis un étudiant diplômé et la programmation est tangentiellement pertinente pour ma recherche.
  3. Toutes les fonctionnalités qui sont principalement conçues avec de très grands projets travaillés par un million de singes de code à l'esprit.
89
dsimcha

Il n'y a pas vraiment une énorme différence entre python et Ruby au 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 lequel correspond le mieux à votre style de programmation.

15
Jason Baker

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

Ne serions-nous pas tous.

distinction minimale entre code et 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 est pas représenté dans l'une des structures de données intégrées couramment utilisées. Il échoue - comme la plupart des langues - dans l'élément n ° 1 de votre liste "importante". Il est donc difficile de fournir une aide utile.

Vous ne pouvez pas tout avoir. N'oubliez pas que vous n'êtes pas le premier à avoir cette pensée. Si quelque chose comme votre langue idéale existait, nous l'utiliserions tous. Puisque le monde réel ne répond pas à vos idéaux, vous devrez redéfinir la priorité de votre liste de souhaits. La section "important" doit être réorganisée pour identifier ce qui est vraiment important pour vous.

69
S.Lott

Honnêtement, en ce qui concerne les installations de métaprogrammation, Ruby et Python sont beaucoup plus similaires que certains de leurs adhérents aiment l'admettre. Cette revue des deux langues propose une assez bonne comparaison/revue:

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, de la communauté, etc., et choisissez-en un. Vous ne perdrez certainement pas certains métaprogrammation du nirvana en fonction de votre choix.

17
ars

Avis de non-responsabilité: je ne tente que dans l'une ou l'autre langue, mais j'ai au moins écrit de petits programmes de travail (pas seulement des scripts rapides, pour lesquels j'utilise Perl, bash ou GNU make) dans les deux.

Ruby peut être vraiment sympa pour les "paradigmes multiples" point 3, car il travaille dur pour faciliter la création de langages spécifiques au domaine. Par exemple, parcourez en ligne et regardez quelques bits de Ruby on Rails code, et quelques bits de code Rake. Ils sont tous les deux Ruby , et vous pouvez voir les similitudes, mais elles ne ressemblent pas à ce que vous considéreriez normalement comme la même langue.

Python me semble être un peu plus prévisible (peut-être en corrélation avec le point 2 `` propre '' et `` sain ''), mais je ne sais pas vraiment si c'est à cause du langage lui-même ou simplement qu'il est généralement utilisé par des personnes avec des valeurs différentes . Je n'ai jamais tenté de magie profonde en Python. Je dirais certainement que les deux langues sont bien pensées.

Les deux obtiennent de bons résultats en 1 et 4. [Edit: en fait 1 est assez discutable - il y a "eval" dans les deux, comme c'est commun dans les langages interprétés, mais ils ne sont guère conceptuellement purs. Vous pouvez définir des fermetures, affecter des méthodes aux objets et ainsi de suite. Je ne sais pas si cela va 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 façons cool de faire les choses. J'ai en fait utilisé Python plus Parfois, vous ne voulez pas vous rafraîchir, vous voulez continuer donc c'est fait avant le coucher ...

Aucun d'eux n'est difficile à aborder, vous pouvez donc simplement décider de faire votre prochaine tâche mineure dans l'un, et l'un après cela dans l'autre. Ou prenez un livre d'introduction sur chacun de la bibliothèque, lisez-les tous les deux et voyez ce qui vous saisit.

16
Steve Jessop

Avez-vous pensé à Smalltalk? Il offre une syntaxe très simple, claire et extensible avec des capacités de réflectivité et d'introspection et un environnement de développement entièrement intégré qui tire parti de ces capacités. Jetez un œil à ne partie du travail en cours dans Squeak Smalltalk par exemple. De nombreux chercheurs utilisant Squeak se retrouvent sur Squeak mailing list et #squeak sur freenode, afin que vous puissiez obtenir de l'aide sur des problèmes complexes très facilement.

Autres indicateurs de sa pertinence actuelle: il fonctionne sur n'importe quelle plate-forme que vous souhaitez nommer (y compris iPhone ); Gilad Bracha base son travail de Newspeak sur Squeak; l'équipe V8 a fait ses armes Smalltalk VMs ; et Dan Ingalls et Randal Schwartz sont récemment revenus au travail Smalltalk après des années dans le désert.

Bonne chance avec votre recherche - faites-nous savoir ce que vous décidez à la fin.

15
mykdavies

LISP satisfait tous vos critères, y compris les performances, et c'est le seul langage qui n'a pas de syntaxe (étrange). Si vous l'évitez sur une base incroyablement mal informée/mal dirigée et que vous manquez par conséquent l'expérience de l'utilisation, par ex. Emacs + SLIME + CL, vous vous rendrez un très mauvais service.

14
user23611

Vos 4 points "importants" mènent à Ruby exactement, alors que les 2 points "assez importants" sont régis par Python. Qu'il en soit ainsi.

11
Neo

Vous décrivez Ruby.

  • Bonne métaprogrammation. Possibilité de créer des classes, des méthodes, des fonctions, etc. lors de l'exécution. De préférence, distinction minimale entre code et données, style LISP.

Il est très facile d'étendre et de modifier les primitives existantes lors de l'exécution. Dans Ruby tout est un objet, des chaînes, des entiers, même des fonctions.

Vous pouvez également construire des raccourcis pour le sucre syntaxique, par exemple avec class_eval .

  • Belle syntaxe claire et saine et sémantique cohérente et intuitive. Fondamentalement, un langage moderne bien pensé et amusant à utiliser.

Ruby suit le principe de moins de surprise , et quand on compare Ruby vs l'équivalent dans une autre langue, beaucoup de gens le trouvent plus "beau").

  • Paradigmes multiples. Aucun paradigme ne convient à chaque projet, ni même à chaque petit sous-problème d'un projet.

Vous pouvez suivre impérativement, orienté objet, fonctionnel et réfléchissant.

  • Un langage intéressant qui affecte réellement la façon dont on pense à la programmation.

C'est très subjectif, mais de mon point de vue, la capacité d'utiliser plusieurs paradigmes en même temps permet des idées très intéressantes.

J'ai essayé Python et cela ne correspond pas à vos points importants.

11
FelipeC

Comparer exemples de code qui font la même chose (joindre à une nouvelle ligne des descriptions non vides d'éléments d'une liste myList) dans différentes langues (les langues sont organisées dans l'ordre alphabétique inverse):

Rubis :

myList.collect { |f| f.description }.select { |d| d != "" }.join("\n")

Ou

myList.map(&:description).reject(&:empty?).join("\n")

Python :

descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions)) 

Ou

"\n".join(f.description() for f in mylist if f.description())

Perl :

join "\n", grep { $_ } map { $_->description } @myList;

Ou

join "\n", grep /./, map { $_->description } @myList;

Javascript :

myList.map(function(e) e.description())
      .filter(function(e) e).join("\n")

Io :

myList collect(description) select(!="") join("\n")

Voici un Io guide .

8
jfs

Ruby serait mieux que LISP en termes de "mainstream" (quoi que signifie vraiment ), mais une préoccupation réaliste est de savoir à quel point il serait facile de trouver des réponses à vos questions sur la programmation LISP si vous deviez y aller.) Dans tous les cas, j'ai trouvé Ruby très facile à ramasser. Dans le même temps que j'avais passé à apprendre = Python (ou d'autres langues d'ailleurs), j'écrivais bientôt mieux beaucoup de code plus efficacement que jamais auparavant. Ce n'est que l'opinion d'une seule personne, cependant; prenez-le avec un grain de sel, je suppose. J'en sais beaucoup plus sur Ruby à ce stade que moi Python ou LISP, mais vous devez savoir que j'étais une personne Python pendant un bon moment avant de changer).

LISP est définitivement assez cool et mérite d'être étudié; comme vous l'avez dit, la taille de la communauté, etc. peut changer assez rapidement. Cela étant dit, la taille elle-même n'est pas aussi importante que la qualité de la communauté. Par exemple, le #Ruby-lang la chaîne est toujours remplie de gens incroyablement intelligents. LISP semble attirer aussi des gens vraiment intelligents. Je ne peux pas parler beaucoup de la communauté Python car je n'ai pas beaucoup d'expérience de première main, mais elle semble parfois "trop ​​grande". (Je me souviens que les gens étaient assez grossiers sur leur IRC, et d'après ce que j'ai entendu des amis qui sont vraiment en Python, cela semble être la règle plutôt que l'exception.)

Quoi qu'il en soit, certaines ressources que vous pourriez trouver utiles sont:

1) Les programmeurs pragmatiques Ruby Metaprogramming series ( http://www.pragprog.com/screencasts/v-dtrubyom/the-Ruby-object-model-and-metaprogramming) ) - pas gratuit, mais les derniers épisodes sont assez intrigants. (Le code est gratuit, si vous voulez le télécharger et voir ce que vous apprendrez.)

2) Sur LISP par Paul Graham ( http://www.paulgraham.com/onlisp.html ). C'est un peu vieux, mais c'est un classique (et téléchargeable gratuitement).

6
Benjamin Oakes

@Jason Je suis respectivement en désaccord. Il existe des différences qui rendent Ruby supérieur à Python pour la métaprogrammation - à la fois philosophique et pragmatique. Pour commencer, Ruby obtient un droit d'héritage avec l'héritage unique et les mixins . Et quand il s'agit de métaprogrammation, vous devez simplement comprendre que tout tourne autour de soi . La différence canonique ici est que dans Ruby vous avez accès à l'objet self au moment de l'exécution - dans Python vous ne l'avez pas!

Contrairement à Python, dans Ruby, il n'y a pas de phase de compilation ou d'exécution distincte. Dans Ruby, chaque ligne de code est exécutée sur un objet particulier self . Dans Ruby, chaque classe hérite à la fois de l'objet et d'une métaclasse cachée. Cela crée une dynamique intéressante:

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

L'utilisation de self.name permet d'accéder à la méthode de métaclasse des classes Ninja name pour retourner le nom de classe de Ninja. La métaprogrammation fleurit-elle si belle en Python? J'en doute sincèrement!

5
Eric Davidson

J'utilise Python pour de nombreux projets et je pense que Python fournit toutes les fonctionnalités que vous avez demandées).

important:

  1. Métaprogrammation: Python prend en charge les métaclasses et la génération de classe/méthode d'exécution, etc.
  2. Syntaxe: Eh bien, c'est en quelque sorte subjectif. J'aime la syntaxe Pythons pour sa simplicité, mais certaines personnes se plaignent que Python est sensible aux espaces.
  3. Paradigmes: Python prend en charge la programmation procédurale, orientée objet et fonctionnelle de base.
  4. Je pense que Python a un style très pratique, c'était très inspirant pour moi.

Assez important:

  1. Performance: Eh bien, c'est un langage de script. Mais écrire des extensions C pour Python est une pratique d'optimisation courante.
  2. Documentation: je ne peux pas me plaindre. Ce n'est pas aussi détaillé que quelqu'un sait de Java, mais c'est assez bon.

Comme vous êtes un étudiant diplômé, vous voudrez peut-être lire cet article en affirmant que Python est tout ce dont un scientifique a besoin . Malheureusement, je ne peux pas comparer Python à Ruby, car je n'ai jamais utilisé ce langage.

Cordialement, Dennis

5
xardias

Eh bien, si vous n'aimez pas la syntaxe LISP, l'assembleur est peut-être le chemin à parcourir. :-)

Il a certainement une distinction minimale entre le code et les données, est multi-paradigme (ou peut-être que ce n'est pas un paradigme) et c'est une expérience d'expansion de l'esprit (si fastidieuse) à la fois en termes d'apprentissage et d'astuces que vous pouvez faire.

4
rickardg

Io satisfait tous vos points "importants". Je ne pense pas qu'il existe un meilleur langage pour faire du piratage méta fou.

4
frigolitmonster

celui qui prend en charge les hacks de métaprogrammation qui juste ne peut pas être fait dans un langage compilé statiquement

Je serais ravi de trouver une langue qui permette certaines des choses intéressantes que LISP fait

LISP peut être compilé.

3
RHSeeger

Avez-vous essayé Rebol?

3
Anon

Ma réponse ne serait ni l'un ni l'autre. Je connais les deux langues, j'ai suivi un cours sur Ruby et je programme en python depuis plusieurs années. LISP est bon en métaprogrammation car il a pour seul objectif est de transformer des listes, son propre code source est juste une liste de jetons donc la métaprogrammation est naturelle. Les trois langues que j'aime le plus pour ce type de chose sont Rebol, Forth et Factor. Rebol est un langage de dialecte très fort qui prend le code de son flux d'entrée, exécute une expression contre elle et la transforme en utilisant des règles écrites dans la langue. Très expressif et extrêmement bon en dialecte. Factor et Forth sont plus ou moins complètement séparés de la syntaxe et vous les programmez en définissant et en appelant des mots. Ils sont généralement principalement écrit dans leur propre langue. Vous n'écrivez pas d'applications dans le sens traditionnel du terme, vous étendez la langue en écrivant vos propres mots pour définir votre application particulière. Le facteur peut être particulièrement agréable car il possède de nombreuses fonctionnalités que je n'ai vues que dans Smalltalk pour évaluer et travailler avec le code source. Un espace de travail vraiment sympa, des documents interactifs, etc.

3
ToddB

Il n'y a pas vraiment beaucoup à séparer Python et Ruby. Je dirais que la communauté Python est plus grande et plus mature que la Ruby communauté, et c'est vraiment important pour moi. Ruby est un langage plus flexible, qui a des répercussions positives et négatives. Cependant, je suis sûr qu'il y aura beaucoup de gens à entrer dans les détails sur ces deux langues, je vais donc jeter une troisième option dans le ring. Que diriez-vous de JavaScript?

JavaScript a été initialement conçu pour être Scheme pour le web, et il est basé sur un prototype, ce qui est un avantage sur Python et Ruby en ce qui concerne le multi-paradigme et la métaprogrammation est concernée. La syntaxe n'est pas aussi agréable que les deux autres, mais c'est probablement le langage le plus déployé qui existe et les performances s'améliorent de jour en jour.

2
Jim

J'ai utilisé Python un peu, mais beaucoup plus Ruby. Cependant, je dirais qu'ils fournissent tous les deux ce que vous avez demandé.

Si je vois tous vos quatre points, vous pouvez au moins vérifier: http://www.iolanguage.com/

Et Mozart/Oz peut aussi vous intéresser: http://mozart.github.io/

Cordialement Friedrich

2
Friedrich

Ruby est mon choix après avoir exploré Python, Smalltalk et Ruby.

2
ryw

Si vous aimez le concept code-is-data de style LISP, mais que vous n'aimez pas la syntaxe Lispy, peut-être Prolog serait un bon choix.

Que ce soit un "langage moderne amusant", je laisse le soin aux autres de juger. ;-)

2
JesperE

Et OCaml?

Fonctionnalités d'OCaml: un système de type statique, l'inférence de type, le polymorphisme paramétrique, la récursivité de queue, la mise en correspondance de modèles, les fermetures lexicales de première classe, les foncteurs (modules paramétriques), la gestion des exceptions et le ramassage automatique des ordures générationnel incrémentiel.

Je pense que cela satisfait les points suivants:

Important:

  1. Belle syntaxe claire et saine et sémantique cohérente et intuitive. Fondamentalement, un langage moderne bien pensé et amusant à utiliser.
  2. Paradigmes multiples. Aucun paradigme ne convient à chaque projet, ni même à chaque petit sous-problème d'un projet.
  3. Un langage intéressant qui affecte réellement la façon dont on pense à la programmation.

Assez important:

  1. Performance. Ce serait bien si les performances étaient décentes, mais lorsque les performances sont une vraie priorité, j'utiliserai D à la place.
  2. Bien documenté.
2
Robert Vuković

si vous aimez la rose, vous devez apprendre à vivre avec les épines :)

1
AgentOrange

Pour la syntaxe de style python et les macros de type LISP (macros qui sont du vrai code) et une bonne DSL, voir converger .

1
Kasprzol

Ne pas mélanger Ruby langage de programmation avec Ruby implémentations, en pensant que les threads POSIX ne sont pas possibles dans Ruby.

Vous pouvez simplement compiler avec le support pthread, et c'était déjà possible au moment où ce thread a été créé , si vous pardonnez le jeu de mots.

La réponse à cette question est simple. Si vous aimez LISP, vous préférerez probablement Ruby. Ou, tout ce que vous aimez.

1
nonanonym

Je vous recommanderais d'aller avec Ruby.

Quand j'ai commencé à l'apprendre, je l'ai trouvé très facile à saisir.

1
Mardix

Je ne suis pas sûr que Python répondrait à tout ce que vous désirez (en particulier le point sur la distinction minimale entre le code et les données), mais il y a un argument en faveur de python. Il y a un projet là-bas, ce qui vous permet de programmer facilement des extensions pour python en D, afin que vous puissiez avoir le meilleur des deux mondes. http://pyd.dsource.org/celerid .html

1
Mauli

Je vous suggère d'essayer les deux langues et de choisir celle qui vous convient. Les deux Python et Ruby peuvent faire ce que vous voulez.

Lisez également ce fil .

0

Je recommande Haskell. Ce n'est pas vraiment un concurrent pour les critères "importants" 1 (à moins que vous n'incluiez le modèle Haskell) ou 3 (Haskell est un langage résolument fonctionnel, bien que vous seriez surpris de la facilité avec laquelle il est réellement nécessaire de coder impérativement dans Haskell si vous le souhaitez). à). Vous apprécierez certainement les fonctions de première classe de Haskell.

Haskell est un choix solide pour les critères "importants" 2 et 4. Surtout # 4: "Un langage intéressant qui affecte réellement la façon dont on pense à la programmation." Quiconque a appris une quantité importante de Haskell peut attester de sa capacité à élargir votre esprit.

0
Dan Burton

Allez avec JS il suffit de vérifier AJS (Alternative JavaScript Syntax) sur mon github http://github.com/visionmedia cela vous donnera des fermetures plus propres, etc.: D

0
TJ Holowaychuk

Concernant votre point principal (méta-programmation): La version 1.6 de Groovy a une programmation AST (Abstract Syntax Tree) intégrée en tant que fonctionnalité standard et intégrée. Ruby a RubyParser, mais c'est un module complémentaire.

0
groovy