El proceso de diseñar, codificar, depurar y mantener el código fuente de programas computacionales se conoce como programación. El propósito de la programación es crear programas que exhiban un comportamiento deseado. El proceso de escribir código requiere frecuentemente conocimientos en varias áreas distintas, además del dominio del lenguaje a utilizar, algoritmos especializados y lógica formal. Programar no involucra necesariamente otras tareas tales como el análisis y diseño de la aplicación (pero sí el diseño del código), aunque sí suelen estar fusionadas en el desarrollo de pequeñas aplicaciones.
Del proceso de programación surge lo que comúnmente se conoce como software (conjunto de programas), aunque estrictamente esta última abarca mucho más que sólo la programación. Sin embargo la metaprogramacion, es la programación sobre la programación, o también se puede ver como programas que construyen programas. Uno de los principales objetivos de esta técnica es llevar a tiempo de compilación cálculos que habitualmente se hacen en tiempo de ejecución.
La metaprogramación no es una nueva idea -
Nació hace ya más de 40 años, con el lenguaje Lisp, y se popularizó
tremendamente en el lenguaje Smalltalk, a principios de los 80.
La metaprogramación
consiste en ver al cerebro y/o mente humana como si fuese un computador, el
cual consta de “hardware” y “software”. Partiendo de esa premisa podemos ver
que el software con que se maneja nuestra mente el día de hoy, y por ende
nuestra vida, no es único ni menos último, sino que podemos cambiarlo a
consciencia a través de múltiples técnicas. A esta toma de consciencia y al
ejercicio de cambio es lo que se denomina metaprogramación.
La metaprogramacion, es la programación sobre
la programación, o también se puede ver como programas que construyen
programas. Uno de los principales objetivos de esta técnica es llevar a tiempo
de compilación cálculos que habitualmente se hacen en tiempo de ejecución.
• El idioma en que está escrito el metaprograma
se llama el metalenguaje. El idioma de los programas que se manipulan se llama
el lenguaje objeto. La capacidad de un lenguaje de programación para ser su
propio metalenguaje se llama reflexión o reflexividad.
• La reflexión es una característica del
lenguaje valiosa para facilitar metaprogramacion.
• Metaprogramación trabaja generalmente en una
de tres maneras
• 1. Consiste en exponer los componentes
internos del motor de tiempo de ejecución al código de programación a través de
interfaces de programación de aplicaciones.
• 2. la ejecución dinámica de las expresiones
que contienen comandos de programación, a menudo compuesto de cadenas, pero
también puede ser de otros métodos que utilizan argumentos y/o el contexto. Por
lo tanto, "los programas pueden escribir programas." Aunque ambos
enfoques pueden ser utilizados en el mismo idioma, la mayoría de los idiomas
tienden a inclinarse hacia uno o el otro.
La tercera forma es dar un paso fuera de la
lengua por completo. Sistemas de propósito general del programa de
transformación, que aceptan descripciones en lenguaje y puede llevar a cabo
transformaciones arbitrarias en esos idiomas, son implementaciones directas de
metaprogramación general. Esto permite metaprogramming a aplicar a prácticamente
cualquier idioma de destino sin importar que la lengua de destino tiene ninguna
habilidad metaprogramación propias
• Un compilador se puede pensar como
un programa que genera otro programa.
• Un formateador de código es un
programa que manipula otro programa.
• Una herramienta como javadoc utiliza
nuestro programa para generar su documentación.
REPASANDO CONCEPTOS
Un framework o infraestructura digital, es una estructura conceptual y tecnológica de soporte
definido, normalmente con artefactos o módulos de software concretos, que puede servir
de base para la organización y desarrollo de software. Típicamente, puede incluir soporte
de programas, bibliotecas, y un lenguaje
interpretado, entre
otras herramientas, para así ayudar a desarrollar y unir los diferentes
componentes de un proyecto.
Lisp es una familia de lenguajes
de programación de computadora de tipo multiparadigma con una larga historia y una sintaxis completamente entre paréntesis,
Lisp es el segundo lenguaje
de programación de alto nivel más viejo con un extenso uso hoy en día; solamente FORTRAN es más viejo. Al igual que FORTRAN, Lisp ha cambiado mucho desde sus
comienzos y han existido un gran número de dialectos en su historia. Hoy, los dialectos Lisp de propósito general más
ampliamente conocidos son Common
Lisp y Scheme.
Lisp se convirtió rápidamente en el
lenguaje de programación favorito en la investigación de la inteligencia
artificial (AI). Como uno de los primeros
lenguajes de programación, fue pionero en muchas ideas en ciencias
de la computación,
incluyendo las estructuras
de datos de árbol, el manejo
de almacenamiento automático, tipos dinámicos, y el compilador auto contenido.
Smalltalk es un lenguaje reflexivo de programación, orientado a objetos y con tipado dinámico. Por sus
características, Smalltalk puede ser considerado también como un entorno de
objetos, donde incluso el propio sistema es un objeto. Metafóricamente, se puede considerar que un Smalltalk
es un mundo virtual donde viven objetos que se comunican entre sí, mediante el envío de mensajes.
Eval en varios lenguajes
de programación, es
una función que evalúa el contenido pasado como parámetro como si fuera una
expresión. Funciones como eval son más comunes en lenguajes de programación
interpretados que compilados, puesto que incluyendo esa función en un lenguaje
compilado requiere incluir un intérprete o compilador con el programa, y más información sobre la ejecución
(como por ejemplo los nombres de las variables). Algunos lenguajes compilados
tienen instrucciones similares a eval.
¿Para qué se usa la
metaprogramación?
En general la metaprogramación se utiliza más
fuertemente en el desarrollo de frameworks. Simplemente porque un framework va a resolver cierta
problemática de una aplicación, pero no va a estar diseñador para ninguna en
particular. Es decir, la idea de framework es
que se va a poder aplicar y utilizar en diferentes dominios desconocidos para
el creador del framework. Entonces estos frameworks van a manipular objetos,
sin conocerlos de antemano.
Ejemplos:
Ejemplos:
- ORM's como hibernate: que
van a encargarse de persistir las instancias de nuestras clases sin
siquiera conocerlas de antemano.
- Frameworks de UI: que
deberán saber mostras cualquier objeto.
- Frameworks de Testing, como
JUnit suelen usar metaprogramación para analizar la clase de Test y
encontrar los tests que se deben correr.
- Otras herramientas:
- javadoc: es una
herramienta como el compilador de java, que lee el código fuente y genera
documentación html.
- code coverage: herramientas
que miden cuánto de nuestro código es realmente ejecutado al correr los
tests, y cuales lineas no.
o
Analizadores de código: que evalúan nuestro código y genera métrics o miden
violaciones a reglas definidas.
Modelos y metamodelos
Así como todo programa construye un modelo
para describir su dominio. El domino de un metaprograma es otro programa
denominado programa objeto o base y tendrá un modelo que describe a ese
programa, al que llamamos metamodelo.
En el siguiente ejemplo, nuestro dominio
contiene diferentes tipos de animales, entre ellos perros y humanos.
El programa describe las características de
los elementos del dominio utilizando (por ejemplo) clases, métodos y atributos.
Entonces, el modelo contiene una
clase Perro, que modela a los perros en el domino. Y el programa manipula instancias de
la clase Perro.
Un metaprograma tendrá a su vez un
(meta)modelo que describe a su dominio, el programa base. Así como en el
dominio hay animales concretos, los habitantes del "metadominio" (=
programa base) serán los elementos del programa: por ejemplo, clases,
atributos, métodos.
Entonces el metamodelo deberá tener clases
que permitan describir esos conceptos, por ejemplo en el metamodelo de Java
encontraremos las clases Class, Method, Field. Este metamodelo describe la
estructura posible de un programa Java. En otro lenguaje, ese metamodelo
tendría diferentes elementos.
Así como el programa manipula las instancias
de las clases Perro o Animal, el metaprograma manipula las instancias de las
clases que conforman el metamodelo (Class, Method, Field, o las que fueran).
Reflection
Es un caso particular de metaprogramación, donde
"metaprogramamos" en el mismo lenguaje en que están escritos (o vamos
a escribir) los programas. Es decir, todo desde el mismo lenguaje.
Nota: Inicialmente el lenguaje "pionero" en cuanto a reflection fue LISP.
Nota: Inicialmente el lenguaje "pionero" en cuanto a reflection fue LISP.
El ejemplo más visible de esto es el caso de
smalltalk, donde no existe una diferenciación entre IDE y nuestro programa.
Ambos estan hechos en smalltalk, y de hecho viven en un mismo ambiente. Ambos
estan construidos con objetos y pueden interactuar entre sí.
De hecho muchos componentes del "IDE" Pharo son elementos de metaprogramación, y utilizan reflection para inspeccionar nuestras clases y objetos.
De hecho muchos componentes del "IDE" Pharo son elementos de metaprogramación, y utilizan reflection para inspeccionar nuestras clases y objetos.
Tipos de reflection
Para esto, generalmente, es necesario contar
con facilidades o herramientas específicas, digamos "soporte" del
lenguaje. Entonces reflection, además, abarca los siguientes items
que vamos a mencionar en esta lista:
- Introspection: se
refiere a la capacidad de un sistema, de analizarse a sí mismo. Algo así
como la introspección humana, pero en términos de programa. Para eso, el
lenguaje debe proveer ciertas herramientas, que le permitan al mismo
programa, "ver" o "reflejar" cada uno de sus componentes.
- Self-Modification: es
la capacidad de un programa de modificarse a sí mismo. Nuevamente esto
requiere cierto soporte del lenguaje. Y las limitaciones van a depender de
este soporte.
Intercession: es la
capacidad de modificar la semántica del modelo que estamos manipulando, desde el mismo lenguaje
La metaprogramación y los lenguajes dinámicos
Podemos categorizar a un lenguaje de dinámico
cuando no requiere de ciclos determinados y claramente separados de compilación
y ejecución. Mucha gente cree erróneamente que los lenguajes dinámicos (por
ejemplo, Perl, Ruby, Python o PHP, ampliamente utilizados en el mundo del
Software Libre) son interpretados - La realidad es completamente distinta, son
lenguajes que cuentan con compiladores tremendamente eficientes, que en
fracciones de segundo pueden convertir decenas de miles de líneas de código en
una representación binaria (bytecode para sus respectivas máquinas virtuales).
La característica que define estos lenguajes como dinámicos no es el
compilador ágil (aunque, claro está, lo requieren) - Es la presencia de la
instrucción (o familia de instrucciones) «eval».
En resumidas cuentas, eval recibe un
parámetro, típicamente una cadena, y lo evalúa como código fuente.
BIBLIOGRAFIA
Gunnar Wolf .México .Documento en línea. Disponible en: http://sg.com.mx/content/view/636
Varios. Documento en línea. Disponible en: https://sites.google.com/site/programacionhm/conceptos/metaprogramacion/intro
Wikipedia. Documento en linea.Disponible en: http://es.wikipedia.org/wiki/Lisp
Wikipedia. Documento en linea.Disponible en: http://es.wikipedia.org/wiki/Smalltalk
Wikipedia. Documento en linea.Disponible en: http://es.wikipedia.org/wiki/L%C3%ADnea_de_abonado_digital
Wikipedia. Documento en linea.Disponible en: http://es.wikipedia.org/wiki/Eval






