Metaprogramación

10

Acabo de comenzar mi viaje como desarrollador de C ++, y recientemente he estado investigando un tema llamado metaprogramación. Hasta ahora, he revisado mucha información sobre el tema y tengo pocas preguntas.

  1. Uso de Reflection en c ++: ¿es posible? Según mi comprensión, la reflexión es una técnica de metaprogramación que tiene la capacidad de manipular el estado de un programa, y ​​su manipulación puede ser introspección o introcesión.

  2. ¿Cuál es la diferencia entre arquitectura reflexiva y arquitectura de nivel meta? ¿En qué categoría se encuentra la arquitectura de metaprogramación?

  3. La metaprogramación viene en dos niveles: nivel meta y nivel base. Según tengo entendido, el programa objeto o el sistema bajo investigación es el nivel base, y el metaprograma que operará sobre el sistema bajo investigación es el nivel meta. ¿Estoy en lo correcto?

También ayúdame proporcionando algunas pautas sobre cómo trabajar en la metaprogramación de plantillas en C ++.
¿Puede sugerirme algunos ejemplos viables que pueda buscar para poner en práctica esta técnica de programación?

ChrisF
fuente
2
Esta pregunta podría pertenecer más a los programadores que a stackoverflow. El primero es más teórico y el segundo más práctico. Algunas partes se pueden responder fácilmente desde un punto de vista práctico. C ++ no tiene reflejo , pero otras no están relacionadas con el código (diferencia entre arquitecturas reflexivas y de metanivel, por ejemplo)
David Rodríguez - dribeas
Esta respuesta SO aborda por qué C ++ no tiene reflejo: stackoverflow.com/q/359237/120163 , y algunas técnicas débiles de C ++ para simularlo mal.
Ira Baxter
Si está muy interesado en la metaprogramación, le sugiero que eche un vistazo al lenguaje D, que es más claro que C ++ en este punto.
deadalnix

Respuestas:

10

La metaprogramación simplemente significa que tiene los medios para escribir código que escribe otro código (en un sentido amplio). C ++ hace esto a través del mecanismo de plantilla, que es básicamente un lenguaje de macros de tipo seguro. Es perfectamente posible simplemente aplicar el paso de expansión de plantilla, y el resultado será un código C ++ válido sin plantilla.

La reflexión es la capacidad de un lenguaje de programación y / o entorno de tiempo de ejecución para inspeccionar (y a menudo modificar) sus propios elementos de lenguaje en tiempo de ejecución. Típicamente, los lenguajes reflexivos ofrecen estructuras de datos que representan elementos del lenguaje como clases, métodos, variables, parámetros, etc., así como rutinas o clases para inspeccionarlos, modificarlos y crearlos. La capacidad de modificación hace que la reflexión sea un tipo de metaprogramación, ya que le permite escribir código que genera otro código.

Otros ejemplos de metaprogramación incluyen generadores de código, binarios auto modificables (aunque estos ya no son tan populares hoy como lo fueron hace dos décadas), macros C; se podría argumentar que el currículum y técnicas similares de programación funcional también son una especie de metaprogramación.

tdammers
fuente
+1 Realmente me gusta su respuesta y quiero preguntar sobre el uso del compilador como un servicio como en C # o el uso de un motor de secuencias de comandos como en Java para ejecutar el código construido en tiempo de ejecución. ¿No es esto también una forma de metaprogramación?
M.Sameer
Entonces, ¿alguien que construye un intérprete de Python en C está metaprogramando? ¿Qué pasa con la implementación de un ORM que asigna un lenguaje orientado a objetos a SQL? ¿Es cada marco web un ejemplo de metaprogramación?
kojiro
1
  1. No. No lo es. Los programas de C ++ se compilan en código máquina y se pierde toda la información sobre las clases, etc. (a menos que se use C ++ / CLI para el entorno .NET, pero eso no es puro C ++).

2-3. No sé, espera otra respuesta que ayude con eso :-)

La meta programación usando plantillas C ++ es muy poderosa, pero también compleja. La expansión de la plantilla requiere un estilo funcional de programación en lugar de la programación imperativa que usa C ++. Si no tiene experiencia previa en programación funcional, le recomendaría que se desvíe y aprenda algunos pasos básicos, haskell o esquemas.

Anders Abel
fuente