Publicidad

domingo, 5 de octubre de 2008

¿Que Es Lo Que Hace Metaprogramación Especial?

Me fascinó tanto la entrada sobre metaprogramación que en vez de hacer un comentário decidí escribir también sobre este tema. No entendí muy bien la explicación de como metaprogramación hace su “mágica”. Pero las reflecciones abajo me convincieron que cualquiera “mágica” que tiene metaprogramación viene no del hecho de producir programas “automaticamente” pero del hecho de que no se puede prognosticar el conteudo del programa generado solo de ver el código del programa generador y esto es la misma “mágica” que tiene cualquier programa interactivo.

Un Metaprograma Como Un Sistema Abierto

Metaprogramación es el ato de criar un programa (que se llama “metaprograma”) que cuando se executa escribe otro programa. También se llama un metaprograma un programa que analisa o modifica otros programas, incluindo se mismo.

Hoy en dia un programa no es suficiente en si mismo para generar resultados. Requiere datos del usúario y bibliotecas escrito por otros. También un usuario puede, en efecto, hacer una llamada a una función, o por media de escoger un item de un menu o de hacer cliq en un icon. Y el programa puede buscar datos en un otro lado para dar una respuesta al pedido del usuario. Entonces, el programa actua como intermediario entre un o más usuarios y una o más fuentes otros fuentes de datos y funciones. El resultado de ejecutar el programa normalmente no us un otro programa, pero si una actuación que no se puede prognosticar del puro código del programa. En efecto, el programa funcione como un tipo de intérprete para el usuario, similar a un shell o un intérprete de un lenguaje interpretado.

En contraste con un intérprete, un compilador si “escribe un programa” (de código máquina) como respuesta a un entrada de un usuario. Asi, se considera un compilador como un metaprograma. La salida de un intérprete (o casi cualquier otro programa) es una (o más) accion(es). La salida de un compilador es un programa, una cadena que se llama código. Pero se puede ver la salida de un compilador también como una acción, la acción de “escribir un programa”. Asi se puede ver que es un caso especial de lo que hace cualquier programa interactivo, producir un resultado que depende en fuentes afuera del próprio programa, un fuente siendo, por ejemplo, un usuario o un servidor web.

Imagine un programa que “escribe otro programa” pero sin entradas de un usuario. El programa simplemente tiene código del forma:

string x ;
x = “main(){...}”
print x;

Este es un metaprograma, pero no agrega nada de valor al programa entre comillas. Seria mejor solo escribir el programa entre comillas que imprimir este programa. Lo que hace una metaprograma útil (y interesante) es que su salida depende de entradas de afuera del próprio programa. Pero esto es también lo que hace útil la gran mayoría de programas hoy en dia.

Metaprogramación y Inteligéncia Artificial

Lo que hace un programa, sea o no metaprograma, poderoso y interesante para mi no es solo su interactividad. También estoy estudiando la inteligéncia artificial y existen dos tipos que se puede incorporar en varios programas, incluindo metaprogramas.

Programas que Hacen Inferencias

Hay programas como de Prolog en lo cual el usuario puede introducir hechos como “Socrates es en un hombre” y “todo los hombres son mortales” y reglas como “si x es un hombre, entonces x es mortal” Prolog puede deducir de esto que Socrates es mortal.

Herencia ayuda un computador a hacer algo parecido. El programa puede decir que un clase A1 herede de un otro clase A. Entonces el compilador (un metaprograma) infere que A2 tiene los mismos métodos de A, aunque el programa no dice esta. Entonces el compilador genera código de máquina para implementar esto.

Programas que Aprenden: Algoritmos Genéticos

Wikipedia describe algoritmos genéticos asi:

Estos algoritmos hacen evolucionar una población de individuos sometiéndola a acciones aleatorias semejantes a las que actúan en la evolución biológica (mutaciones y recombinaciones genéticas), así como también a una Selección de acuerdo con algún criterio, en función del cual se decide cuáles son los individuos más adaptados, que sobreviven, y cuáles los menos aptos, que son descartados. (http://es.wikipedia.org/wiki/Algoritmos_genéticos)

El resultado de aplicar un algoritmo genético sobre muchas “generaciones” es una población de “individuos” más “aptos”. El programador no sabia como especificar directamente el conteudo de un individuo más apto, pero la “evolución” disparada con la ejecución del programa cria estes individuos.
Hay una aplicación a metaprogramación de esto. Se llama “programación genética”. En este caso los “individuos” a ser evoluidos son programas. Quiere decir que un algoritmo genética está aplicado a una “población” de programas para evoluir una población de programas más aptos.

2 comentarios:

dios o demonio dijo...

Hola Bret, me parece muy interesante que hables sobre temas tan interesantes como los que tiene la inteligencia artificial, como mencionaste el caso de la metaprogramacion lo cual me parece un buen tema que se puede discutir en clase, ya que es un debate no solo en inteligencia artificial si no que tambien a la prog de sistemas porque ahora estamos en los inicios como corriente de la programcion heuristica, el cual es un gran reto para generar programas que ayuden al sistema a generar codigo de maquina para instrucciones o datos de manera paralela...

Bueno, aunque este tema es muy rico para poder charlar sobre el, pues mejor lo dejamos para una sesion en la clase si el maestro da chance, pero bueno hasta luego..

jimmy dijo...

bueno bred tu investigastes un poco mas sobre la metaprogramación y que mas te puedo decir, esta me ayudó a saber mas de lo que yo encontre.
Bien, buena informacio...