standard name estandar codification codificacion code java metaprogramming coding-style

name - methods naming convention java



Metaprogramación-código autoexplicativo-tutoriales, artículos, libros (7)

Bienvenido al maravilloso mundo de la meta-programación :) La meta programación se relaciona con muchas cosas. Intentaré enumerar lo que me viene a la mente:

  • Macro La capacidad de extender la sintaxis y la semántica de un lenguaje de programación se exploró primero en la macro terminología. Varios idiomas tienen construcciones que se parecen a la macro, pero la elección es, por supuesto, Lisp . Si está interesado en la meta-programación, entender Lisp y el sistema de macros (y la naturaleza homoicónica del lenguaje donde el código y los datos tienen la misma representación) es definitivamente una necesidad. Si desea un dialecto Lisp que se ejecute en la JVM, vaya a Clojure . Algunos recursos:

    De lo contrario, hay un montón de recursos sobre Lisp.

  • DSL . La capacidad de extender la sintaxis y la semántica de un idioma ahora se renombra bajo el término "DSL". La forma más fácil de crear un DSL es con el patrón de intérprete . Luego viene el DSL interno con interfaz fluida y el DSL externo (según la terminología de Fowler). Aquí hay un buen video que he visto recientemente:

    Las otras respuestas ya apuntaban a recursos en esta área.

  • La reflexion La metaprogramación también es una reflexión de forma inseparable. La capacidad de reflexionar sobre la estructura del programa en tiempo de ejecución es inmensamente poderosa. Es importante entonces entender qué son la introspection , la intercession y la reification . En mi humilde opinión, la reflexión permite dos amplias categorías de cosas: 1. la manipulación de datos cuya estructura no se conoce en el momento de la compilación (la estructura de los datos se proporciona en tiempo de ejecución y el programa aún funciona de manera reflexiva). 2. potentes patrones de programación como proxy dinámico , fábricas, etc. Smalltalk es la pieza elegida para explorar la reflexión, donde todo es reflexivo. Pero creo que Ruby también es un buen candidato para eso, con una comunidad que aprovecha la meta programación (pero yo mismo no sé mucho sobre Ruby).

    También hay una rica literatura sobre la reflexión.

  • Anotaciones . Las anotaciones se pueden ver como un subconjunto de las capacidades reflexivas de un lenguaje, pero creo que merece su propia categoría. Ya respondí una vez qué son las anotaciones y cómo pueden usarse . Las anotaciones son metadatos que se pueden procesar en tiempo de compilación o en tiempo de ejecución. Java tiene un buen soporte con la herramienta de procesador de anotaciones , la API de Procesamiento de Anotación Conectable y la API de réplica .

  • Byte-code o transformación AST . Esto se puede hacer en tiempo de compilación o en tiempo de ejecución. De alguna manera, se trata de un enfoque de bajo nivel, pero también puede considerarse una forma de metaprogramación (en cierto sentido, es lo mismo que macro para lenguaje no homoicónico).

Conclusión: la programación meta es la capacidad de un programa para razonar sobre sí mismo o para modificarse. Al igual que el desbordamiento de pila de metadatos es el lugar para hacer preguntas sobre el desbordamiento de pila en sí. La meta-programación no es una técnica específica, sino un conjunto de conceptos y técnicas.

Varias cosas caen bajo el paraguas de la meta-programación. Por su pregunta, parece más interesado en la parte de macro / DSL. Pero todo está relacionado en última instancia, por lo que los otros aspectos de la meta-programación también son definitivamente dignos de ver.

PD: Sé que la mayoría de los enlaces que he proporcionado no son tutoriales ni artículos introductorios. Estos son recursos que me gustan que describen el concepto y las ventajas de la meta-programación, que creo que es más interesante.

Estoy pensando en mejorar mis habilidades de programación (en realidad trato de hacer mi mejor esfuerzo para chupar menos cada año, como dijo Jeff Atwood), así que estaba pensando en leer cosas sobre metaprogramación y código autoexplicativo.

Estoy buscando algo como la guía de un idiota (libros gratuitos para descargar, recursos en línea). También quiero más que tu página de wiki promedio y también algo de lenguaje independiente o preferiblemente con ejemplos de Java.

¿Conoces esos recursos que te permitirán ponerlo en práctica de manera eficiente (sé que la experiencia tiene mucho que decir en todo esto, pero quiero construir una experiencia para evitar el flujo de malas decisiones - experiencia - buenas decisiones)?

EDITAR:

Algo así como este ejemplo del Programador Pragmático :

... implementar un mini-lenguaje para controlar un paquete de dibujo simple ... El lenguaje consiste en comandos de una sola letra. Algunos comandos son seguidos por un solo número. Por ejemplo, la siguiente entrada dibujaría un rectángulo:

P 2 # select pen 2 D # pen down W 2 # draw west 2cm N 1 # then north 1 E 2 # then east 2 S 1 # then back south U # pen up

¡Gracias!


Bueno, en el ecosistema de Java, creo que la forma más sencilla de implementar un mini-lenguaje es usar lenguajes de script, como Groovy o Ruby (sí, lo sé, Ruby no es un ciudadano nativo del ecosistema de Java). Ambos ofrecen un mecanismo de especificación DSL bastante bueno, que te permitirá hacerlo con mucha más simplicidad de lo que lo haría el lenguaje Java:

Sin embargo, existen puras alternativas de Java, pero creo que serán un poco más difíciles de implementar.



He mencionado la metaprogramación de la plantilla de C ++ en mi comentario anterior. Permítanme, por lo tanto, proporcionar un breve ejemplo utilizando la meta-programación de plantillas C ++ Soy consciente de que has marcado tu pregunta con java , pero esto puede ser perspicaz. Espero que puedas entender el código de C ++.

Demostración por ejemplo:

Considere la siguiente función recursiva, que genera la serie de Fibonacci (0, 1, 1, 2, 3, 5, 8, 13, ...):

unsigned int fib(unsigned int n) { return n >= 2 ? fib(n-2) + fib(n-1) : n; }

Para obtener un artículo de la serie Fibonacci, debe llamar a esta función, por ejemplo, fib(5) , y calculará el valor y se lo devolverá. Nada especial hasta ahora.

Pero ahora, en C ++, puede volver a escribir este código usando plantillas (algo similar a los genéricos en Java) para que la serie de Fibonacci no se genere en tiempo de ejecución , sino durante el tiempo de compilación :

// fib(n) := fib(n-2) + fib(n-1) template <unsigned int n> struct fib // <-- this is the generic version fib<n> { static const unsigned int value = fib<n-2>::value + fib<n-1>::value; }; // fib(0) := 0 template <> struct fib<0> // <-- this overrides the generic fib<n> for n = 0 { static const unsigned int value = 0; }; // fib(1) := 1 template <> struct fib<1> // <-- this overrides the generic fib<n> for n = 1 { static const unsigned int value = 1; };

Para obtener un artículo de la serie Fibonacci usando esta plantilla, simplemente recupere el valor constante, por ejemplo, fib<5>::value .

Conclusión ("¿Qué tiene esto que ver con la meta-programación?"):

En el ejemplo de plantilla, es el compilador C ++ que genera la serie de Fibonacci en tiempo de compilación, no su programa mientras se ejecuta. (Esto es obvio por el hecho de que en el primer ejemplo, usted llama una función, mientras que en el ejemplo de la plantilla, recupera un valor constante). ¡Obtiene sus números de Fibonacci sin escribir una función que los calcule! En lugar de programar esa función, has programado el compilador para que haga algo por ti para lo que no fue diseñado explícitamente ... lo que es bastante notable.

Esta es por lo tanto una forma de meta-programación:

La metaprogramación es la escritura de programas de computadora que escriben o manipulan otros programas (o ellos mismos) como sus datos, o que hacen parte del trabajo en tiempo de compilación que de otra manera se haría en tiempo de ejecución .

- Definición del Metaprogramming , énfasis agregado por mí.

(Tenga en cuenta también los efectos secundarios en el ejemplo de la plantilla anterior: al hacer que el compilador precalifique sus números de Fibonacci, deben almacenarse en algún lugar. El tamaño del binario de su programa aumentará proporcionalmente a la n más alta que se usa en expresiones que contienen el término fib<n>::value . Por el lado positivo, ahorra tiempo de cálculo en tiempo de ejecución.)


Por su ejemplo, parece que está hablando de lenguajes específicos de dominio (DSL), específicamente, DSL internos.

Here hay una gran lista de libros sobre DSL en general (sobre DSL como SQL).

Martin Fowler tiene un libro que está en progreso y actualmente está en online .

Ayende escribió un libro sobre DSL en boo .

Actualización : (siguiendo comentarios)

Metaprogramming consiste en crear programas que controlan otros programas (o sus datos), a veces utilizando un DSL. A este respecto, los archivos de proceso por lotes y los scripts de shell pueden considerarse metaprogramas, ya que invocan y controlan otros programas.

El ejemplo que tiene muestra un DSL que puede ser usado por un metaprograma para controlar un programa de pintura.



Tcl comenzó como una forma de crear lenguajes específicos de dominio que no apestaban a medida que crecían en complejidad hasta el punto en que necesitaban obtener capacidades de programación genéricas. Además, sigue siendo muy fácil agregar sus propios comandos, precisamente porque sigue siendo un caso de uso importante para el idioma.

Si desea una implementación integrada con Java, Jacl es una implementación de Tcl en Java que proporciona capacidad de script enfocada a DSL y también acceso para acceder a cualquier objeto Java.

(La metaprogramación es escribir programas que escriben programas. Algunos lenguajes lo hacen mucho más que otros. Para abordar algunos casos específicos, Lisp es el ejemplo clásico de un lenguaje que realiza mucha metaprogramación; C ++ tiende a relegarlo a las plantillas en lugar de eso lo permite en tiempo de ejecución; todos los lenguajes de secuencias de comandos tienden a encontrar la metaprogramación más fácil porque sus implementaciones se escriben para que sean más flexibles de esa manera, aunque eso es solo una cuestión de grado ...)