2011-10-03 20 views
17

Solía ​​pensar que la metaprogramación implicaba modificar el programa, y ​​(al igual que algunas respuestas al What is reflection and why is it useful?) que la reflexión consistía meramente en la introspección de un programa. Sin embargo, la etiqueta de reflexión wiki dice¿La metaprogramación es un subconjunto de la reflexión?

reflexión es el proceso por el cual un programa puede observar y modificar su propia estructura y el comportamiento en tiempo de ejecución.

La reflexión es el proceso mediante el cual un programa puede realizar una introspección de . Esta introspección generalmente implica la capacidad de observar y modificar su propia estructura y comportamiento en tiempo de ejecución. Desde , la reflexión de la perspectiva teórica se refiere al hecho de que las instrucciones del programa se almacenan como datos. La distinción entre el código de programa y los datos es una cuestión de cómo se trata la información. Por lo tanto, los programas pueden tratar sus propios códigos como datos y observar o modificarlos.

[énfasis añadido]

Y la descripción de metaprogramming es

Metaprogramación está escribiendo programas que escriben o manipulan otros programas como sus datos.

La metaprogramación es útil porque puede ahorrar a los programadores valioso tiempo . Algunos lenguajes tienen soporte para metaprogramarse y este permite crear código con gran poder expresivo.

(supongo que "escribir" no significa que la escritura de código fuente a un archivo, ya que eso sería la generación de código.)

haría esto metaprogramming simplemente un subconjunto de reflexión?

¿O son los términos distintos porque algunos lenguajes de programación son metaprogramados por otro idioma, en cuyo caso ocurre metaprogramación pero no reflexión? (Hubo una sola oración sin cita que afirma esto en el metaprogramming Wikipedia article)

¿O los términos "reflexión" y "metaprogramación" se usan de manera diferente dependiendo de qué lenguaje de programación está usando la persona?

Respuesta

12

No. Por el contrario, la reflexión proporciona instalaciones que son un subconjunto de lo que puede hacer la metaprogramación.

La metaprogramación es "programas que graban programas". Esto incluye programas que leen el texto de los programas (que podría incluirse pero que es bastante raro), analiza ese código y realiza cambios. Sí, incluye escribir el texto fuente en los archivos. La generación de código es un caso especial de metaprogramación.

Reflexión, según tengo entendido, es la capacidad de un programa para consultar sobre su propia estructura. En casi todos los sistemas que he visto en los que la reflexión es posible (con el caso realmente excepcional de Lisp y variantes equivalentes), la maquinaria de reflexión proporcionaba solo un medio limitado de introspección. Java y C# le permitirán encontrar los nombres de clases y métodos, pero no puede solicitar a estos sistemas el contenido de un método, declaración o declaración local.Tampoco puede pedirle a la mayoría de estos lenguajes reflexivos que realmente cambien su estructura, es decir, no puede agregar nuevas clases o campos usando las funciones de reflexión. La mayoría de los lenguajes (por ejemplo, C++) básicamente no tienen la capacidad incorporada de "reflejar". Si bien las utilidades de reflexión integradas en los lenguajes pueden ser útiles, tienden a ser idiosincrásicas con respecto a lo que los diseñadores de lenguaje/compiladores decidieron mantener durante el tiempo de ejecución.

Usted termina con una capacidad de "reflexión" mucho más poderosa si en el paso fuera de habla el idioma y el conjunto de restricciones que los diseñadores de idioma incorporaron. Un sistema de metaprogramación realmente bueno tiene acceso a toda la estructura del programa y, por lo tanto, puede responder preguntas arbitrarias sobre la estructura del programa (limitaciones del módulo de Turing).

Como ejemplo, nuestra DMS Software Reengineering Toolkit es una herramienta de transformación de programa que tiene acceso completo al árbol de sintaxis abstracta del programa y muchos otros hechos derivados por los diversos DMS language front ends. De modo que DMS puede "reflejar" (inspeccionar/analizar/razonar) bastante arbitrariamente sobre el idioma que está procesando. Y puede hacerlo para C, COBOL, Java, C# y C++; para muchos de estos lenguajes, no solo puede proporcionar acceso al AST, sino también acceder a la información de tablas de símbolos y a diversas formas de control y flujo de datos, que ninguna instalación de reflexión que alguna vez haya visto te ofrece.

Además, una herramienta de transformación de programas como DMS puede modificar el código basado en la "reflexión" para generar nuevo código, optimizar, reestructurar, instrumento, ... La variedad de efectos alcanzables esta manera es sorprendentemente amplio.

[Dado que DMS se implementa como un conjunto de DSL, de hecho puede razonar (y "razona") sobre su propio código. Utilizamos DMS para sintetizar grandes partes de sí mismo de sus DSL, incluida la generación de código con algunas optimizaciones muy interesantes, incluida la paralelización de trabajo.]

3

La reflexión también puede ocurrir durante la ejecución, cuando un programa puede inspeccionar su propia llamada stack (mirando dentro de los marcos de llamadas) Y la metaprogramación incluso podría cambiar las funciones que se han llamado (es decir, que tienen marcos más bajos en la pila de llamadas) junto con sus marcos de llamadas.

Puede considerar leer el libro de Jacques Pitrat en Artificial Beings - the conscience of a conscious machine que explica en detalles por qué es útil y cómo se puede implementar. Vea también his blog.

Cuestiones relacionadas