2010-05-21 15 views
13

¿Cuál es el mejor lenguaje (en términos de simplicidad, legibilidad de código y legibilidad) en su opinión, para aprender y trabajar con metaprogramación?Idioma para aprender la metaprogramación

Creo que la metaprogramación es el "futuro de la codificación". No dice que el código se extinguirá, pero podemos ver que este escenario está llegando a las nuevas tecnologías.

+4

Puede que quieras hacer de esta una pregunta wiki comunitaria para evitar el cierre sobre la base subjetiva y argumentativa . –

+1

Ahora es wiki de la comunidad. – Erup

+2

+1 Buena pregunta. Es una lástima que esto fue cerrado porque hay mucho que decir sobre el tema. Lisp (1960) es la madre de todos los lenguajes de metaprogramación. Scheme es un Lisp fácil de aprender. La familia de lenguajes MetaLanguage (ML, 1970) se diseñó específicamente para la metaprogramación y los derivados modernos (OCaml, Haskell, F #) tienen un gran respaldo. Consulte los idiomas que le permiten orientar sus VM como .NET pero también LLVM. Las expresiones regulares son un ejemplo práctico convincente de la utilidad de la metaprogramación. –

Respuesta

2

Ruby tiene capacidades de metaprogramación muy potentes y flexibles.

+4

Ruby sigue siendo aclamado como un metalenguaje, pero no tiene un marco de meta-programación bien estructurado. Simplemente usa su naturaleza dinámica, como Python. La meta-programación de aprendizaje en mi humilde opinión merece una revisión de las metaclases y los lenguajes autorreflexivos, incluso si la práctica común es utilizar un lenguaje dinámico basado en hash. –

0

No sé si tenemos la misma definición de "meta programación" pero ciertamente no hay UN mejor lenguaje para aprender. Yo propondría que tenga una visión más profunda de la programación funcional. El idioma que debe elegir depende de su entorno de trabajo y antecedentes. Yo elegiría F # en este momento, pero Haskel también debería ser una buena opción.

aplausos, Achim

4

¿Qué entiende usted por metaprogramming? La metaprogramación es un conjunto de conceptos, en lugar de una técnica específica.

Consulte this answer donde he enumerado varios conceptos y lenguajes relacionados. He aquí un resumen:

  • Metaprogramación con macro -> Lisp
  • Metaprogramación con DSL -> Muchos lenguajes de DSL interno, externo DSL es más complicado
  • Reflexión -> Smalltalk, Ruby
  • Anotaciones -> Java
  • de código byte o AST transformación -> Groovy

Ver la respuesta completa para más detalles. En términos generales, creo que un buen OO todoterreno es Ruby. De lo contrario, cualquier tipo de Lisp hará el trabajo: es como masilla en tus manos. Pero eso dependerá de lo que quiera hacer ...

+0

Pensando en las aplicaciones empresariales y el conjunto de conceptos, no solo una técnica, sino todo lo que se puede hacer con la metaprogramación. Quiero decir, usando una tecnología fácil de aprender y aprender. Ruby seens para ser una buena opción. – Erup

+0

Como @Jay aparece, la técnica de metaprogramación de sintaxis parece ser mejor en un entorno empresarial, en mi opinión. Manipular en tiempo de ejecución no es adecuado, a veces (como Ruby?). – Erup

5

Los Lisp son prácticamente el lenguaje de elección para una amplia variedad de técnicas de metaprogramación. De los Lisps modernos disponibles, recomendaría Clojure como un Lisp más accesible que tenga acceso a una biblioteca positivamente ENORME (cualquier cosa en Java) si desea que algo que sea tan poderoso como y sea inmediatamente útil.

Para otros enfoques de metaprogramación, casi cualquier lenguaje funcional hará el truco. Haskell es una buena opción para técnicas de aprendizaje y programación funcional, pero no es lo que yo llamaría el lenguaje más práctico para hacer un trabajo real en este momento. Erlang es más práctico, pero no tan fácil de metaprogramar. OCaml es otra opción posible, pero también tiene algo de práctico. Sin embargo, es más accesible que Haskell en muchos aspectos.

En el mundo del lenguaje de scripting Ruby es un lenguaje en el que la metaprogramación es una técnica popular. Su enfoque es vagamente similar a Lisp, pero con una sintaxis mucho más convencional. Sin embargo, carece de toda la potencia y flexibilidad de los Lisp, pero, por otro lado, con la excepción de Clojure anterior, tiene una utilidad práctica mucho más inmediata.

2

Hay varios idiomas que recomendaría para el estudio de la metaprogramación.

El primero es Prolog. Un programa Prolog es una base de datos. El "código" de Prolog, las cláusulas, son parte de los datos. El programa puede leerlos, incluido su contenido. También puede generar un nuevo código como una estructura de datos y afirmarlo, cambiando así mismo en tiempo de ejecución. Todo esto sin usar la expansión de términos, que es el sistema de macros inteligentes de Prolog. Algunos libros de Prolog AI comienzan con la implementación de un meta-intérprete en Prolog y luego cambian según la necesidad.

El segundo es, como se mencionó, Lisp, y particularmente CLOS (Common List Object System), que incluye comandos para meta-OOP.

Finalmente, Python admite un mecanismo agradable y no demasiado oscuro para la meta-programación en tiempo de ejecución, que son sus meta-clases (clases que crean clases).

8

Primero - No creo que esté de acuerdo con su afirmación de que "la metaprogramación es el 'futuro de la codificación'". Es una gran herramienta, pero no a todos les gusta (por ejemplo, los diseñadores de Java dejaron las macros fuera del lenguaje intencionalmente, no es que me guste Java, pero las personas do tienen motivos para oponerse a la metaprogramación).

De todos modos ... Puedo pensar en dos maneras diferentes de hacer metaprogramación: en el nivel sintáctico y en el tiempo de ejecución.

Para la metaprogramación de sintaxis, creo que Scheme es una buena opción (si no hubieras mencionado la simplicidad, te sugiero Common Lisp). Para la metaprogramación en tiempo de ejecución Supongo que tanto Prolog como Smalltalk son muy muy interesantes. (Puede agregar, cambiar y eliminar hechos en una base de datos Prolog sobre la marcha, y puede cambiar objetos Smalltalk sobre la marcha). Probablemente también puedas hacer metaprogramación en tiempo de ejecución en Ruby, pero no conozco a Ruby.

Por lo tanto, hay diferentes métodos de metaprogramación en Scheme (diferentes sistemas de macros). Le sugiero que eche un vistazo a un libro de Scheme básico y luego lea sobre dos macro sistemas diferentes.

Algunos buenos libros: Esquema

implementaciones de Scheme son muy diferentes entre sí, por lo que también va a utilizar el manual de aplicación Esquema de una mucho también

Algunos lugares para aprender acerca de las macros de Scheme:

Si decide utilizar un lenguaje que es más grande y más desordenado que el esquema, tratar de Common Lisp . Hay tres libros que sugeriría:

  • Primero, "Practical Common Lisp" por Peter seibel.Eso te permitirá comenzar con Common Lisp y macros;
  • Segundo, "On Lisp" por Paul Graham. Luego aprenderá que las macros son más poderosas de lo que había pensado antes, y aprenderá técnicas realmente agradables;
  • En tercer lugar, "Let Over Lambda" por Doug Hoyte. Un libro avanzado, mejor leído después de Graham's On Lisp.

Por Prolog, se puede leer "La programación en Prolog" por Clocksin y Mellish (obtener la última edición!) Y luego pasar a "Programación Prolog en Profundidad", de Covington, Vellino y Nute. Consulte el capítulo 6.

Hay muchos buenos libros de Smalltalk. Me gusta "El arte y la ciencia de Smalltalk" por Simon Lewis. También hay un muy buen free tutorial/primer by Canol Gokel sobre Smalltalk (pero no llega tan lejos como para enseñar metaprogramación).

+1

Me gustó la forma en que cubrió el tema. Además, pensando en las aplicaciones de enterpise y el conjunto de conceptos, la implementación y la mantenibilidad (trabajando en un equipo), entiendo que la tecnología de metaprogramación de sintaxis (como usted describió) es una mejor opción que el tiempo de ejecución. – Erup

+1

@Erup: No estudies conceptos usando un lenguaje que tu equipo usará ahora. Estudie conceptos para aprender los conceptos, utilice la herramienta que mejor lo ayude, luego elija su idioma una vez que comprenda el concepto. Puede hacer metaprogramación en C++, por ejemplo, si es muy bueno con las plantillas, pero la metaprogramación de APRENDIZAJE a través de C++ sería ... no trivial. –

+0

Gracias @JUST MI OPINIÓN correcta, aprender los conceptos es lo que quiero. Cuando dije "trabajar en equipo", me refiero a la idea de utilizar una tecnología con la que sea fácil trabajar. ¡Todo el equipo tendrá que aprender! – Erup

2

Estoy sorprendido de que nadie haya mencionado ML. ML significa Meta Language. entonces ... sí ... CaML es una implementación estándar. (OCaML, que SOLO mi OPINIO correcto mencionó es la versión OO de CaML, que probablemente agrega características que hacen que la meta-programación sea menos obvia ...)

Aparte de eso, soy un gran admirador de Scheme, pero bastante cualquier lenguaje de programación funcional es bueno para esto ... Siempre está el Little Lisper, eh, lo siento, el pequeño Schemer ...

+2

Las personas que programan en OCaml tienden a soltar la parte O muy, muy rápido, dejando atrás solo a Caml. No creo que ningún programador de OCaml serio use las partes orientadas a objetos con ninguna frecuencia. –

Cuestiones relacionadas