Python vs. Ruby para metaprogtwigción

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

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

Importante:

  1. Buena metaprogtwigció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 es 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 manera en que uno piensa acerca de la progtwigción.

Algo importante:

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

No importante:

  1. Tamaño de la comunidad, disponibilidad de la biblioteca, etc. Ninguna de estas son características del idioma en sí, y todas pueden cambiar muy rápidamente.
  2. Disponibilidad de empleo. No soy un progtwigdor profesional a tiempo completo. Soy un estudiante graduado y la progtwigción es tangencialmente relevante para mi investigación.
  3. Todas las características que están diseñadas principalmente con proyectos muy grandes trabajadas por un millón de monos de código en mente.

Realmente no hay una gran diferencia entre python y ruby ​​al menos a un nivel ideológico. En su mayor parte, son simplemente diferentes sabores de la misma cosa. Por lo tanto, recomendaría ver cuál coincide más con su estilo de progtwigción.

He leído un poco sobre Lisp y me encantaría encontrar un lenguaje que permita algunas de las cosas geniales que hace Lisp, pero sin la extraña syntax, 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 la syntax “extraña” son consecuencias mutuas.

Si quieres una syntax fácil de leer, tienes Python. Sin embargo, el código no está representado en ninguna de las estructuras de datos integradas de uso común. Falla, como lo hace la mayoría de los idiomas, en el artículo n. ° 1 de su lista “importante”. Eso hace que sea difícil proporcionar ayuda útil.

No puedes tenerlo todo. Recuerda, no eres el primero en tener este pensamiento. Si existiera algo como tu lenguaje ideal, todos lo estaríamos usando. Dado que el mundo real no alcanza sus ideales, tendrá que volver a priorizar su lista de deseos. La sección “importante” debe reorganizarse para identificar lo que es realmente importante para usted.

Honestamente, en lo que respecta a las instalaciones de metaprogtwigció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, simplemente elija uno basado en algunos criterios. Tal vez te guste Rails y quieras estudiar ese código. Tal vez SciPy es lo tuyo. Mire el ecosistema de bibliotecas, comunidad, etc., y elija una. Ciertamente no perderá algo de metaprogtwigción de nirvana basado en su elección de cualquiera de los dos.

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

Ruby puede ser realmente agradable 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 del código Ruby on Rails y un par de bits del código Rake. Ambos son Ruby, y puedes ver las similitudes, pero no se parecen a lo que normalmente consideras el mismo idioma.

Python me parece un poco más predecible (posiblemente relacionado con el punto 2 ‘limpio’ y ‘sano’), pero realmente no sé si eso se debe al lenguaje en sí o simplemente a que lo utilizan personas con valores diferentes. . Nunca he intentado magia profunda en Python. Ciertamente diría que ambos idiomas están bien pensados.

Ambos obtienen una buena puntuación en 1 y 4. [Editar: en realidad 1 es bastante discutible: hay “eval” en ambos, como es común en los idiomas interpretados, pero no son conceptualmente puros. Puede definir cierres, asignar métodos a objetos y otras cosas. No estoy seguro de si esto va tan lejos como quieras.]

Personalmente encuentro a Ruby más divertido, pero en parte es porque es más fácil distraerse pensando en formas geniales de hacer las cosas. De hecho, he usado Python más. A veces no quieres lo bueno, quieres seguir adelante, así que se hace antes de acostarse …

Ninguno de los dos es difícil de conseguir, por lo que simplemente puedes decidir hacer tu próxima tarea menor en una, y la siguiente en la otra. O toma un libro de introducción de cada uno de la biblioteca, lee los dos y ve qué te atrapa.

¿Has considerado Smalltalk? Ofrece una syntax muy simple, clara y extensible con capacidades de reflectividad e introspección y un entorno de desarrollo totalmente integrado que aprovecha esas capacidades. Echa un vistazo a algunos de los trabajos que se están realizando en Squeak Smalltalk, por ejemplo. Muchos investigadores que usan Squeak se reúnen en la lista de correo de Squeak y #squeak en freenode, para que pueda obtener ayuda sobre problemas complejos con mucha facilidad.

Otros indicadores de su relevancia actual: se ejecuta en cualquier plataforma que quiera nombrar (incluido el iPhone ); Gilad Bracha está basando su trabajo de Newspeak en Squeak; el equipo V8 se cortó los dientes en Smalltalk VMs ; y Dan Ingalls y Randal Schwartz han regresado recientemente al trabajo de Smalltalk después de años en el desierto.

La mejor de las suertes con su búsqueda: háganos saber qué decide al final.

Lisp satisface todos sus criterios, incluido el rendimiento, y es el único idioma que no tiene syntax (extraña). Si lo evitas de una manera tan mal informada / equivocada y, por consiguiente, te pierdes la experiencia de usar, por ejemplo, Emacs + SLIME + CL, te estarás haciendo un gran daño.

Estás describiendo a Ruby.

  • Buena metaprogtwigció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 extender y modificar los primitivos existentes en tiempo de ejecución. En ruby ​​todo es un objeto, cadenas, enteros, incluso funciones.

También puede crear accesos directos para el azúcar sintáctica, por ejemplo con class_eval .

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

Ruby sigue el principio de menos sorpresa , y al comparar el código de 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.

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

  • Un lenguaje interesante que realmente afecta la manera en que uno piensa acerca de la progtwigción.

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

He probado Python y no encaja con tus puntos importantes.

Tus 4 puntos “importantes” llevan a Ruby exactamente, mientras que los 2 puntos “algo importantes” están regidos por Python. Que así sea.

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

Ruby :

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

Ruby sería mejor que Lisp en términos de ser “convencional” (lo que sea que realmente signifique, pero una preocupación realista es lo fácil que sería encontrar respuestas a sus preguntas sobre la progtwigción de Lisp si tuviera que seguir con eso). En cualquier caso , Encontré a Ruby muy fácil de recoger. En la misma cantidad de tiempo que pasé aprendiendo Python por primera vez (u otros idiomas), pronto estaba escribiendo un mejor código de manera mucho más eficiente que nunca. Sin embargo, esa es solo la opinión de una persona; tomarlo con un grano de sal, supongo. En este punto, sé mucho más acerca de Ruby que de Python o Lisp, pero debes saber que fui una persona de Python durante bastante tiempo antes de cambiar.

Lisp es definitivamente muy bueno y vale la pena mirar; Como dijiste, el tamaño de la comunidad, etc. puede cambiar bastante rápidamente. Dicho esto, el tamaño en sí no es tan importante como la calidad de la comunidad. Por ejemplo, el canal #ruby-lang todavía está lleno de gente increíblemente inteligente. Lisp parece atraer también a algunas personas realmente inteligentes. No puedo hablar mucho sobre la comunidad de Python ya que no tengo mucha experiencia de primera mano, pero a veces parece ser “demasiado grande”. (Recuerdo que las personas fueron bastante groseras en su canal de IRC, y por lo que he escuchado de amigos que están realmente interesados ​​en Python, esa parece ser la regla y no la excepción).

De todos modos, algunos recursos que pueden resultarte ú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 quieres descargarlo y ver qué estarías aprendiendo).

2) En Lisp por Paul Graham ( http://www.paulgraham.com/onlisp.html ). Es un poco viejo, pero es un clásico (y descargable de forma gratuita).

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

importante:

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

Algo importante:

  1. Rendimiento: Bueno, es un lenguaje de scripting. 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 graduado, es posible que desee leer este documento y afirmar que Python es todo lo que un científico necesita . Desafortunadamente no puedo comparar Python con Ruby, ya que nunca usé ese lenguaje.

Saludos, Dennis

@Jason, respectivamente, estoy en desacuerdo. Existen diferencias que hacen que Ruby sea superior a Python para la metaprogtwigción, tanto filosófica como pragmática. Para empezar, Ruby obtiene la herencia correcta con herencia única y Mixins . Y cuando se trata de la metaprogtwigción, simplemente necesitas entender que se trata del yo . La diferencia canónica aquí es que en Ruby tienes acceso al objeto propio en tiempo de ejecución, ¡en Python no lo tienes!

A diferencia de Python, en Ruby no hay una fase separada de comstackción o tiempo de ejecución. En Ruby, cada línea de código se ejecuta contra un objeto propio particular. En Ruby, cada clase hereda de un objeto y de una metaclase oculta. Esto hace para algunas dinámicas interesantes:

 class Ninja def rank puts "Orange Clan" end self.name #=> "Ninja" end 

Usando self.name accede al método de nombre de metaclase de las clases de Ninja para devolver el nombre de clase de Ninja. ¿La metaprogtwigción florece tan hermosa en Python? Sinceramente lo dudo!

Bueno, si no te gusta la syntax lisp, tal vez el ensamblador sea el camino a seguir. 🙂

Sin duda, tiene una distinción mínima entre el código y los datos, es un paradigma múltiple (o tal vez es un no paradigma) y es una experiencia de expansión mental (aunque tediosa) tanto en términos de aprendizaje como de trucos que puede hacer.

Io satisface todos tus puntos “importantes”. No creo que haya un lenguaje mejor por ahí para hacer una meta-piratería loca.

uno que admita los hacks de metaprogtwigción que simplemente no se pueden realizar en un lenguaje comstackdo estáticamente

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

Lisp puede ser comstackdo.

¿Has probado Rebol?

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

Realmente no hay mucho que separar a Python y Ruby. Diría que la comunidad Python es más grande y más madura que la comunidad Ruby, y eso es muy 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 en estos dos idiomas, así que lanzaré una tercera opción al ring. ¿Qué tal JavaScript?

JavaScript fue originalmente diseñado para ser Scheme para la web, y está basado en un prototipo, lo que es una ventaja sobre Python y Ruby en lo que respecta a multiprotogtwigs y metaprogtwigciones. La syntax no es tan buena como las otras dos, pero es probablemente el lenguaje más implementado y el rendimiento está mejorando cada día.

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

Ya sea que se califique como un “lenguaje moderno y divertido de usar”, dejaré que otros lo juzguen. 😉

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

¿Qué pasa con OCaml?

Características de OCaml: un sistema de tipo estático, inferencia de tipo, polymorphism paramétrico, recursión de la 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 es 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 manera en que uno piensa acerca de la progtwigción.

Algo importante:

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

He usado Python un poco, pero mucho más Ruby. Sin embargo, yo diría que ambos proporcionan lo que pediste.

Si veo todos sus cuatro puntos, al menos puede consultar: http://www.iolanguage.com/

Y Mozart / Oz puede ser interesante para ti también: http://mozart.github.io/

Saludos Friedrich

Para la syntax de estilo python y las macros tipo lisp (macros que son código real) y un buen DSL, vea la convergencia .

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

Si amas a la rosa, tienes que aprender a vivir con las espinas 🙂

Te recomendaría que fueras con Ruby.

Cuando empecé a aprenderlo, encontré que era muy fácil de aprender.

No mezcle Ruby Programming Language con Ruby Implementations, pensando que los hilos POSIX no son posibles en ruby.

Simplemente puede comstackr 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 simple. Si te gusta lisp, probablemente preferirás Ruby. O, lo que quieras.

Te sugiero que pruebes ambos idiomas y elijas el que más te guste. Python y Ruby pueden hacer lo que quieras.

También lea este hilo .

Vaya con JS solo revise AJS (Sintaxis de JavaScript alternativa) en mi github http://github.com/visionmedia que le dará algunos cierres de apariencia más limpia, etc.: D

Con respecto a su punto principal (meta-progtwigción): La versión 1.6 de Groovy tiene progtwigción AST (árbol de syntax abstracta) incorporada como una característica estándar e integrada. Ruby tiene RubyParser, pero es un complemento.