Python vs. Ruby para metaprogramación [cerrado]


90

Actualmente soy principalmente un programador de D y estoy buscando agregar otro lenguaje a mi caja de herramientas, preferiblemente uno que admita los trucos de metaprogramación que simplemente no se pueden hacer en un lenguaje compilado estáticamente como D.

He leído un poco sobre Lisp y me encantaría encontrar un lenguaje que permita algunas de las cosas interesantes que hace Lisp, pero sin la extraña sintaxis, etc. de Lisp. No quiero comenzar una guerra de idiomas, y estoy seguro de que tanto Ruby como Python tienen sus compensaciones, así que enumeraré lo que es importante para mí personalmente. Por favor, dígame si Ruby, Python o algún otro lenguaje sería mejor para mí.

Importante:

  1. Buena metaprogramación. Capacidad para crear clases, métodos, funciones, etc. en tiempo de ejecución. Preferiblemente, distinción mínima entre código y datos, estilo Lisp.
  2. Sintaxis agradable, limpia, sana y semántica intuitiva y coherente. Básicamente, un lenguaje moderno bien pensado y divertido de usar.
  3. Múltiples paradigmas. Ningún paradigma es adecuado para cada proyecto, ni siquiera para cada pequeño subproblema dentro de un proyecto.
  4. Un lenguaje interesante que realmente afecta la forma en que uno piensa sobre la programación.

Algo importante:

  1. Actuación. Sería bueno si el rendimiento fuera decente, pero cuando el rendimiento sea una prioridad real, usaré D en su lugar.
  2. Bien documentada.

No importante:

  1. Tamaño de la comunidad, disponibilidad de bibliotecas, etc. Ninguna de estas son características del idioma en sí y todas pueden cambiar muy rápidamente.
  2. Disponibilidad de trabajo. No soy un programador profesional a tiempo completo. Soy un estudiante de posgrado y la programación es tangencialmente relevante para mi investigación.
  3. Cualquier característica que esté diseñada principalmente con proyectos muy grandes en los que haya trabajado un millón de monos de código en mente.

1
+1 Para una pregunta generalmente bien hecha.
Tríptico

Lamentablemente, todas las respuestas de alta calificación básicamente dicen "depende" y las respuestas más bajas son básicamente una guerra de llamas Python vs Ruby.
Dan Burton

¿Has considerado Clojure?
Mark Thomas

¡La respuesta es Julia ! Simplemente no existía en ese entonces: bit.ly/julia_meta ... ¡regocíjate! Julia cubre todos los puntos importantes enumerados por @dsimcha, además del rendimiento y todos los demás puntos se vuelven realidad a medida que Julia sigue madurando.
SalchiPapa

Respuestas:


15

Realmente no hay una gran diferencia entre pitón y rubí, al menos a nivel ideológico. En su mayor parte, son solo diferentes sabores de la misma cosa. Por lo tanto, recomendaría ver cuál se adapta más a su estilo de programación.


30
Definitivamente no hay lo mismo. El aspecto es similar en la superficie, pero si ejercitas las características más poderosas de Ruby, entiendes que Python simplemente no es rival. Por ejemplo, intente escribir un DSL en Ruby frente a escribir un Python, o crear funciones, métodos, clases, etc. en tiempo de ejecución. Es mucho más sencillo en Ruby.
FelipeC

14
No es raro que necesite hacer metaprogramación, es raro que se haga. Todos los programas, excepto el más trivial, tienen patrones repetidos que no caen en las herramientas de refactorización habituales, pero que la metaprogramación podría eliminar fácilmente.
Wayne Conrad

10
Ruby y Python son muy diferentes incluso en las ideas que gobiernan su diseño. Python quieren una y, con suerte, una forma obvia de hacer las cosas. Eso generalmente hace que el lenguaje no sea tan expresivo como Ruby, pero lo hace más consistente. Ruby viene un poco más de la forma de hacer las cosas de Perl, donde hay muchas formas de hacer las cosas. Además, Ruby hace que algunas cosas sean súper fáciles y de hecho incluye la idea de miembros privados. Python, por otro lado, a lo sumo, solo hace que algo sea más difícil de hacer, por lo que debe ser más explícito (como agregar o anular el comportamiento en las clases).
Sean Copenhaver

5
Probablemente debería hacer un curso intensivo en ambos, pero para una metaprogramación fácil, parece que Ruby es más adecuado. Sin embargo, no tengo mucha experiencia, así que tómalo con un grano de sal.
Sean Copenhaver

7
Ruby y Python solo son similares en el hecho de que predican "código hermoso". Simplemente tienen puntos de vista totalmente diferentes sobre esa cosa de belleza (que en mi opinión es buena)
Gabi Purcaru

69

He leído un poco sobre Lisp y me encantaría encontrar un lenguaje que permita algunas de las cosas interesantes que hace Lisp, pero sin la extraña sintaxis, etc. de Lisp.

¿No lo haríamos todos?

distinción mínima entre código y datos, estilo Lisp

Lamentablemente, la distinción mínima entre código y datos y sintaxis "extraña" son consecuencias mutuas.

Si desea una sintaxis fácil de leer, tiene Python. Sin embargo, el código no está representado en ninguna de las estructuras de datos integradas de uso común. Falla, como ocurre con la mayoría de los idiomas, en el elemento # 1 de su lista 'importante'. Eso dificulta la prestación de ayuda útil.

No puedes tenerlo todo. Recuerde, usted no es el primero en tener este pensamiento. Si existiera algo como su idioma ideal, todos lo estaríamos usando. Dado que el mundo real no cumple con sus ideales, tendrá que volver a priorizar su lista de deseos. La sección "importante" debe reorganizarse para identificar qué es realmente importante para usted.


3
Descubrí que muchos lenguajes implementan macros similares a Lisp en sintaxis que no son Lispy y lo que termina sucediendo es que escribir macros allí es muy difícil, porque nadie conoce naturalmente las estructuras de datos en las que se representa el código, por lo que escribir macros se vuelve demasiado difícil y nadie lo hace.
pupeño

11
Las personas encuentran difícil leer Lisp porque no están familiarizados con la sintaxis. Encuentro Lisp mucho más fácil de leer que C # (pero más difícil que Python).
Jules

1
Estoy de acuerdo en gran medida con este punto, pero mi experiencia tanto con Ruby como con Lisp muestra que el primero es tan bueno para la metaprogramación como lo es sin los paréntesis. Otras alternativas que se acercan podrían ser TCL y JavaScript, pero no las favorecería por otras razones.
inger

Hace mucho tiempo que existía un idioma llamado Dylan, que debería ser exactamente eso.
Friedrich

17

Honestamente, en lo que respecta a las instalaciones de metaprogramación, Ruby y Python son mucho más similares de lo que a algunos de sus seguidores les gusta admitir. Esta revisión de ambos idiomas ofrece una comparación / revisión bastante buena:

Por lo tanto, elija uno según algunos criterios. Quizás te guste Rails y quieras estudiar ese código. Quizás SciPy sea lo tuyo. Mire el ecosistema de bibliotecas, comunidad, etc., y elija una. Ciertamente no perderá un nirvana de metaprogramación basado en su elección de ninguno de los dos.


esa entrada de blog parece tener más que ver con las preferencias personales (bastante justo, pero la belleza está en el ojo del espectador), más que con la metaprogramación, que era el punto principal del OP.
inger

16

Descargo de responsabilidad: solo incursiono en cualquiera de los idiomas, pero al menos he escrito pequeños programas de trabajo (no solo scripts rápidos, para los que uso Perl, bash o GNU make) en ambos.

Ruby puede ser realmente bueno para el punto 3 de "múltiples paradigmas", porque trabaja duro para facilitar la creación de lenguajes específicos de dominio. Por ejemplo, navegue en línea y observe un par de bits de código Ruby on Rails y un par de bits de código Rake. Ambos son Ruby, y puedes ver las similitudes, pero no se parecen a lo que normalmente pensarías como el mismo idioma.

Python me parece un poco más predecible (posiblemente correlacionado con el punto 2 'limpio' y 'sano'), pero realmente no sé si eso se debe al lenguaje en sí o simplemente a que lo usan personas con valores diferentes. . Nunca intenté hacer magia profunda en Python. Sin duda diría que ambos idiomas están bien pensados.

Ambos puntúan bien en 1 y 4. [Editar: en realidad 1 es bastante discutible: hay "eval" en ambos, como es común en los lenguajes interpretados, pero difícilmente son conceptualmente puros. Puede definir cierres, asignar métodos a objetos y todo eso. No estoy seguro de si esto llega tan lejos como desea.]

Personalmente, Ruby me parece más divertido, pero en parte se debe a que es más fácil distraerse pensando en formas interesantes de hacer las cosas. De hecho, he usado más Python. A veces no quieres algo genial, quieres seguir adelante para hacerlo antes de acostarte ...

No es difícil entrar en ninguno de ellos, por lo que podría decidir hacer su próxima tarea menor en uno y la siguiente en el otro. O coja un libro introductorio sobre cada uno de la biblioteca, léalos rápidamente y vea qué le llama la atención.


15

¿Ha considerado Smalltalk? Ofrece una sintaxis muy simple, clara y extensible con capacidades de reflectividad e introspección y un entorno de desarrollo completamente integrado que aprovecha esas capacidades. Eche un vistazo a algunos de los trabajos que se están realizando en Squeak Smalltalk, por ejemplo. Muchos investigadores que usan Squeak pasan el rato en la lista de correo de Squeak y #squeak en freenode, por lo que puede obtener ayuda sobre problemas complejos con mucha facilidad.

Otros indicadores de su relevancia actual: se ejecuta en cualquier plataforma que le gustaría nombrar (incluido el iPhone ); Gilad Bracha basa su trabajo de Newspeak en Squeak; el equipo de V8 se puso manos a la obra con las máquinas virtuales Smalltalk ; y Dan Ingalls y Randal Schwartz han regresado recientemente al trabajo de Smalltalk después de años en la naturaleza.

Mucha suerte con su búsqueda; háganos saber lo que decide al final.


14

Lisp satisface todos sus criterios, incluido el rendimiento, y es el único lenguaje que no tiene una sintaxis (extraña). Si lo evita sobre una base tan asombrosamente mal informada / equivocada y, en consecuencia, se pierde la experiencia de usar, por ejemplo, Emacs + SLIME + CL, se estará haciendo un flaco favor.


4
O puedes probar Clojure, que me parece muy agradable.
pupeño

1
Muy de acuerdo. Si quieres el poder de Lisp, ¡sumérgete y tenlo! De hecho, es bastante fácil acostumbrarse a los parens; no son tan importantes como la mayoría de la gente los imagina.
Dan Burton

11

Sus 4 puntos "importantes" conducen a Ruby exactamente, mientras que los 2 puntos "algo importantes" los rige Python. Que así sea.


11

Estás describiendo a Ruby.

  • Buena metaprogramación. Capacidad para crear clases, métodos, funciones, etc. en tiempo de ejecución. Preferiblemente, distinción mínima entre código y datos, estilo Lisp.

Es muy fácil ampliar y modificar primitivas existentes en tiempo de ejecución. En ruby ​​todo es un objeto, cadenas, números enteros, incluso funciones.

También puede construir atajos para azúcar sintáctico, por ejemplo con class_eval .

  • Sintaxis agradable, limpia, sana y semántica intuitiva y coherente. Básicamente, un lenguaje moderno bien pensado y divertido de usar.

Ruby sigue el principio de menos sorpresa. , y al comparar el código Ruby con el equivalente en otro idioma, muchas personas lo consideran más "hermoso".

  • Múltiples paradigmas. Ningún paradigma es adecuado para cada proyecto, ni siquiera para cada pequeño subproblema dentro de un proyecto.

Puede seguir imperativo, orientado a objetos, funcional y reflexivo.

  • Un lenguaje interesante que realmente afecta la forma en que uno piensa sobre la programación.

Eso es muy subjetivo, pero desde mi punto de vista, la capacidad de usar muchos paradigmas al mismo tiempo permite ideas muy interesantes.

Probé Python y no se ajusta a tus puntos importantes.


11
-1 Estoy usando Python y encaja perfectamente, las diferencias entre Python y Ruby radican en otros aspectos. Hace ruido fanboy-ish, lo eres.
gorsky

6
Se habla mucho pero no se camina. ¿Le importaría proporcionar un ejemplo en Python de agregar un método dinámicamente para decir, la clase String?
FelipeC

6
@john Ese es precisamente mi punto; es muy complicado y feo (sin mencionar que es imposible para la clase String). OTOH en Ruby es muy simple: "self.class.send (: define_method,: method_name) {method_code}"
FelipeC

2
Ruby puede intentar seguir el PoLS, pero yo no diría que lo hace . Por ejemplo, el lambda/ Proc.newmess ha sido llamado "comportamiento sorprendente" y "altamente contradictorio" aquí en SO. :-) Cualquier lenguaje tan grande y complejo como Ruby seguramente tendrá áreas tan confusas.
Ken

2
@Token aquí hay un ejemplo de parche de mono Stringen Ruby con fines de metaprogramación: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/… . Las subclases no servirían; sin embargo, una función simple de dos argumentos lo haría.
P Shved

8

Compare ejemplos de código que hacen lo mismo (unir con una nueva línea descripciones no vacías de elementos de una myListlista) en diferentes idiomas (los idiomas están organizados en orden alfabético inverso):

Rubí :

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

O

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

Python :

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

O

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

Perl :

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

O

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")

Aquí hay una guía de Io .


3
(formato nil "~ {~ a ~ ^ ~% ~}" (eliminar nil (mapcar # 'descripción mylist)))
Rainer Joswig

agradable, pero ¿dónde está la metaprogramación aquí? parece ser un estilo ligeramente funcional, remotamente relacionado con la pregunta.
inger

6

Ruby sería mejor que Lisp en términos de ser "mainstream" (sea lo que sea que eso realmente signifique, pero una preocupación realista es lo fácil que sería encontrar respuestas a sus preguntas sobre la programación Lisp si tuviera que ir con eso). Ruby me resultó muy fácil de aprender. En la misma cantidad de tiempo que pasé aprendiendo Python (u otros lenguajes para el caso), pronto estaba escribiendo mejor código de manera mucho más eficiente. que nunca. Sin embargo, esa es solo la opinión de una persona; tómalo con un grano de sal, supongo. Sé mucho más sobre Ruby en este momento que sobre Python o Lisp, pero debes saber que fui una persona de Python durante bastante tiempo antes de cambiar.

Lisp definitivamente es bastante interesante y vale la pena investigarlo; como dijiste, el tamaño de la comunidad, etc. puede cambiar con bastante rapidez. Dicho esto, el tamaño en sí no es tan importante como la calidad de la comunidad. Por ejemplo, el #ruby-langcanal todavía está lleno de gente increíblemente inteligente. Lisp también parece atraer a algunas personas realmente inteligentes. No puedo hablar mucho sobre la comunidad de Python porque no tengo mucha experiencia de primera mano, pero a veces parece ser "demasiado grande". (Recuerdo que la gente fue bastante grosera con su canal de IRC, y por lo que he escuchado de amigos que están realmente interesados ​​en Python, esa parece ser la regla más que la excepción).

De todas formas, algunos recursos que te pueden resultar útiles son:

1) La serie Pragmatic Programmers Ruby Metaprogramming ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ): no es gratuita, pero los episodios posteriores son bastante intrigantes. (El código es gratuito, si desea descargarlo y ver lo que está aprendiendo).

2) Sobre Lisp de Paul Graham ( http://www.paulgraham.com/onlisp.html ). Es un poco antiguo, pero es un clásico (y se puede descargar gratis).


5

Estoy usando Python para muchos proyectos y creo que Python proporciona todas las funciones que solicitó.

importante:

  1. Metaprogramación: Python admite metaclases y generación de métodos / clases en tiempo de ejecución, etc.
  2. Sintaxis: Bueno, eso es algo subjetivo. Me gusta la sintaxis de Pythons por su simplicidad, pero algunas personas se quejan de que Python es sensible a los espacios en blanco.
  3. Paradigmas: Python admite programación funcional básica, orientada a objetos y procedimental.
  4. Creo que Python tiene un estilo muy práctico, fue muy inspirador para mí.

Algo importante:

  1. Rendimiento: Bueno, es un lenguaje de programación. Pero escribir extensiones C para Python es una práctica de optimización común.
  2. Documentación: no puedo quejarme. No es tan detallado como alguien puede saber de Java, pero es lo suficientemente bueno.

Como estudiante de posgrado, es posible que desee leer este documento que afirma que Python es todo lo que necesita un científico . Desafortunadamente, no puedo comparar Python con Ruby, ya que nunca usé ese lenguaje.

Saludos, Dennis


3
Python no es sensible a los espacios en blanco Es sensible a la sangría.
jfs

5

@Jason I, respectivamente, no estoy de acuerdo. Hay diferencias que hacen que Ruby sea superior a Python para la metaprogramación, tanto filosóficas como pragmáticas. Para empezar, Ruby obtiene la herencia correcta con Single Inheritance y Mixins . Y cuando se trata de metaprogramación, simplemente necesita comprender que se trata de uno mismo . La diferencia canónica aquí es que en Ruby tienes acceso al objeto self en tiempo de ejecución, ¡en Python no!

A diferencia de Python, en Ruby no hay una fase separada de compilación o tiempo de ejecución. En Ruby, cada línea de código se ejecuta contra un objeto self particular . En Ruby, cada clase hereda tanto del objeto como de una metaclase oculta. Esto genera algunas dinámicas interesantes:

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

El uso de self.name accede al método de nombre de la metaclase de las clases Ninja para devolver el nombre de la clase Ninja. ¿Florece la metaprogramación tan hermosa en Python? ¡Lo dudo sinceramente!


4

Bueno, si no le gusta la sintaxis lisp, quizás ensamblador sea el camino a seguir. :-)

Ciertamente tiene una distinción mínima entre código y datos, es multi-paradigma (o tal vez no es paradigma) y es una experiencia en expansión (aunque tediosa) tanto en términos de aprendizaje como de trucos que puedes hacer.


Creo que he hecho más metaprogramación en lenguaje ensamblador que en cualquier otro lenguaje. El código son datos y los datos pueden intentar ser códigos. Y los datos no están firmados ni sin firmar, es el código de operación el que decide.
Nosredna

1
Tengo un código de ensamblador que podría afirmar que es OO. Tiene cosas que se parecen más bien a métodos; llama al que depende de la "clase".
justintime

4

Io satisface todos sus puntos "importantes". No creo que exista un lenguaje mejor para hacer meta hacker loco.


Gracias por eso, no lo sabía. Parece divertido a primera vista, tal vez un montón de (()) pero de todos modos. Espero encontrar el tiempo para echar un vistazo pronto.
flq

3

uno que admita los trucos de metaprogramación que simplemente no se pueden hacer en un lenguaje compilado estáticamente

Me encantaría encontrar un lenguaje que permita algunas de las cosas interesantes que hace Lisp

Lisp se puede compilar.



3

Mi respuesta no sería ninguna. Conozco ambos idiomas, tomé una clase sobre Ruby y he programado en Python durante varios años. Lisp es bueno en la metaprogramación debido al hecho de que su único propósito es transformar listas, su propio código fuente es solo una lista de tokens, por lo que la metaprogramación es natural. Los tres lenguajes que más me gustan para este tipo de cosas son Rebol, Forth y Factor. Rebol es un lenguaje de dialección muy fuerte que toma código de su flujo de entrada, ejecuta una expresión en su contra y lo transforma utilizando reglas escritas en el lenguaje. Muy expresivo y muy bueno para dialectar. Factor y Forth están más o menos completamente divorciados de la sintaxis y usted los programa definiendo y llamando palabras. En general, están escritos en su mayoría en su propio idioma. No escribe aplicaciones en el sentido tradicional, extiende el lenguaje escribiendo sus propias palabras para definir su aplicación particular. Factor puede ser especialmente bueno ya que tiene muchas características que solo he visto en smalltalk para evaluar y trabajar con código fuente. Un espacio de trabajo realmente agradable, documentos interactivos, etc.


2

Realmente no hay mucho para separar Python y Ruby. Yo diría que la comunidad de Python es más grande y más madura que la comunidad de Ruby, y eso es realmente importante para mí. Ruby es un lenguaje más flexible, que tiene repercusiones positivas y negativas. Sin embargo, estoy seguro de que habrá mucha gente para entrar en detalles sobre estos dos idiomas, así que lanzaré una tercera opción al ring. ¿Qué hay de JavaScript?

JavaScript fue diseñado originalmente para ser Scheme para la web, y está basado en prototipos, lo cual es una ventaja sobre Python y Ruby en lo que respecta a la metaprogramación y el paradigma múltiple. La sintaxis no es tan agradable como la de los otros dos, pero probablemente sea el lenguaje más implementado que existe, y el rendimiento mejora cada día.


2

Si le gusta el concepto de código es datos al estilo lisp, pero no le gusta la sintaxis Lispy, tal vez Prolog sea ​​una buena opción.

Si eso califica como un "lenguaje moderno y divertido de usar", dejaré que otros lo juzguen. ;-)


2

Ruby es mi elección después de explorar Python, Smalltalk y Ruby.


2

¿Y OCaml?

Características de OCaml: un sistema de tipos estáticos, inferencia de tipos, polimorfismo paramétrico, recursividad de cola, coincidencia de patrones, cierres léxicos de primera clase, functores (módulos paramétricos), manejo de excepciones y recolección de basura automática generacional incremental.

Creo que satisface lo siguiente:

Importante:

  1. Sintaxis agradable, limpia, sana y semántica intuitiva y coherente. Básicamente, un lenguaje moderno bien pensado y divertido de usar.
  2. Múltiples paradigmas. Ningún paradigma es adecuado para cada proyecto, ni siquiera para cada pequeño subproblema dentro de un proyecto.
  3. Un lenguaje interesante que realmente afecta la forma en que uno piensa sobre la programación.

Algo importante:

  1. Actuación. Sería bueno si el rendimiento fuera decente, pero cuando el rendimiento sea una prioridad real, usaré D en su lugar.
  2. Bien documentada.

OCaml te permite crear clases / métodos en tiempo de ejecución. ¿Cómo funciona?
Jason Creighton

Acabo de leer sobre OCaml y tal vez no pueda crear cosas en tiempo de ejecución, así que lo eliminé.
Robert Vuković


1

Para la sintaxis de estilo python y macros de tipo lisp (macros que son código real) y buen DSL, consulte converge .


1

No estoy seguro de que Python satisfaga todas las cosas que desea (especialmente el punto sobre la distinción mínima entre código y datos), pero hay un argumento a favor de Python. Existe un proyecto que le facilita programar extensiones para python en D, para que pueda tener lo mejor de ambos mundos. http://pyd.dsource.org/celerid.html



1

Te recomendaría que vayas con Ruby.

Cuando comencé a aprenderlo, lo encontré muy fácil de aprender.


1

No mezcle el lenguaje de programación Ruby con implementaciones de Ruby, pensando que los hilos POSIX no son posibles en ruby.

Simplemente puede compilar con soporte pthread, y esto ya era posible en el momento en que se creó este hilo , si perdona el juego de palabras.

La respuesta a esta pregunta es sencilla. Si te gusta ceceo, probablemente prefieras ruby. O lo que quieras.




0

Con respecto a su punto principal (metaprogramación): la versión 1.6 de Groovy tiene la programación AST (Abstract Syntax Tree) incorporada como una característica estándar e integrada. Ruby tiene RubyParser, pero es un complemento.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.