reflexiva programacion metaprogramacion reflection metaprogramming terminology

reflection - programacion - ¿La metaprogramación es un subconjunto de la reflexión?



metaprogramacion ruby (2)

La reflexión también puede ocurrir durante la ejecución, cuando un programa puede inspeccionar su propia pila de llamadas (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 inferiores en la pila de llamadas) ) junto con sus marcos de llamadas.

Puede considerar leer el libro de Jacques Pitrat sobre Seres artificiales: la conciencia de una máquina consciente que explica en detalle por qué es útil y cómo puede implementarse. Ver también su blog .

Yo solía pensar que la metaprogramación implicaba modificar el programa y (al igual que algunas respuestas a ¿Qué es el reflejo y por qué es útil? ) Que la reflexión consistía meramente en la introspección de un programa. Sin embargo, la etiqueta de reflexión wiki dice

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

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

[énfasis añadido]

Y la descripción para la metaprogramación es

La metaprogramación es escribir programas que escriben o manipulan otros programas como sus datos.

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

(Supongo que "escribir" no significa escribir código fuente en un archivo, porque eso sería generación de código).

¿Esto haría que la metaprogramación sea simplemente un subconjunto de la reflexión?

¿O los términos son distintos porque algunos lenguajes de programación son metaprogramados por otro idioma, en cuyo caso ocurre metaprogramación pero no reflexión? (Había una sola oración sin cita que decía esto en el artículo de la metaprogramación de Wikipedia )

¿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?


No. Más bien, la reflexión proporciona instalaciones que son un subconjunto de lo que puede hacer la metaprogramación.

La metaprogramación es "programas que escriben 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.

La reflexión, tal como lo entiendo, 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 dichos lenguajes reflexivos que realmente cambien su estructura, es decir, no puede agregar nuevas clases o campos usando las facilidades de reflexión. La mayoría de los lenguajes (p. Ej., 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 se sale del idioma y del conjunto de restricciones que los diseñadores de lenguaje 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, nuestro DMS Software Reengineering Toolkit es una herramienta de transformación de programas que tiene acceso completo al árbol de sintaxis abstracta del programa y muchos otros hechos derivados de los diversos front end del lenguaje DMS . 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 código nuevo, optimizar, reestructurar, instrumentar, ... La variedad de efectos que se pueden lograr de esta manera es sorprendentemente amplia.

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