miércoles, mayo 03, 2006

metaprogramacion

Comenzando mis estudios universitarios, me encontre con el termino meta, el cual me explicaron era la creacion de un elemento nuevo mas grande que el anterior, estaba basado en la potencia de 2 a la 11 aproximadamente, aunque mi memoria puede fallar, pero la idea es simple, cuando tienes una unidad que definiremos t, y cada una de ellas funciona independientemente de forma correcta y ademas interactua con las demas, tenemos un conjunto de t, que puede expresarce como una sociedad, organismo, sistema, etc. pero cuando llega al numero de 2 a la 11, se produce un cambio y se genera una nueva superestructura que se denomina meta-t, entonces si hablamos de atomos, podemos evolucionar a elementos como moleculas, y luego a elementos como celulas, organos, sistemas, seres humanos, sociedad. Pero esto tambien lo podemos ver como atomos, planetas, sistemas solares, galaxias, etc. cada uno esta conformado por una gran cantidad de elementos minimos, iguales pero con funcionalidades distintas. Este nuevo elemento denominado meta-t, contiene caracteristica muy diferentes a las expresadas o mostradas por elementos como t o como puede ser un meta-meta-t.

Hablar de un modelo de programacion, podemos expresar los lenguajes como elementos t, o tal vez los mismos programas, o posiblemente cada vez que se corre un programa, pero desde hace mucho tiempo conociamos las limitaciones de el modelo de programacion que utilizamos actualmente y aunque se han desarrollado algunos avances para permitir que los modelos de programacion sigan siendo utiles, es muy posible que cada vez estemos llegando al limite del manejo que tenemos de nuestros programas, no soy neurocientifico, pero seguramente la mente humana tiene limites de comprencion definidos, donde en algun momento tiene que empezar a escoger lo que le interesa y dejar algunos elementos fuera de su analisis. Esto puede pasar en algunos de los programas que manejamos actualmente como puede ser linux, gnome, kde, bsds, etc... y tambien en proyectos privados, donde es necesario la subdivision del proyecto y dejar encargados de cada una de las partes y luego tratar de manejar el software desde ese otro punto de vista, pero se vuelve humanamente imposible que una persona pueda manejar todo el conjunto simultanemente y mucho menos si se trabaja con la variable tiempo o cambios.

Una alternativa que salio hace algun tiempo son modelos de programacion que necesitan menos codigo, el codigo de objetos que aleja al programador de la necesidad de conocer el funcionamiento de un objeto internamente (encapsulacion), tambien aparece la programacion orientada a aspectos que encapsula el comportamiento de los objetos, pero a mi me parece que la alternativa de la metaprogramacion es uno de los caminos mas adecuados, es como un trabajo por capas, donde se generan unas bases bien fundamentadas, al igual que lo genera nuestro cerebro cuando comienza a hablar, caminar o respirar, inicialmente lo tiene que aprender de manera conciente, luego lo vuelve un proceso mecanico y lo utilizamos a voluntad pero sin necesidad de darnos cuenta, asi mismo podemos crear un paralelo con la metaprogramacion.

Normalmente tomamos la metaprogramacion como un modelo donde un programa crea otro programa, pero no en el sentido de un compilador, aunque es un buen ejemplo, sino otro mas generico, tambien podemos ver el caso en el modelo de lenguajes de macros o algunos casos de lenguajes de scripting. pero la ventaja de la metaprogramacion es que nos da libertad abusoluta de los modelos que queremos manejar pero tenemos muy claro cada uno de los paradigmas que estamos utilizando. Si vamos a mirar el modelo en la actualidad con los lenguajes de programacion, lo podemos identificar claramente en cada uno de los niveles del lenguaje.

Nivel 0: Codigo de maquina, 1 y 0s

Nivel 1: Ensamblador

Nivel 2: Programacion estructurada

Nivel 3: Programacion orientada a objetos, logica, funcional, etc...

Nivel 4: Modelos RAD donde encontramos muchos lenguajes propietarios, pero un buen ejemplo puede ser el SQL, XML.

Posiblmente la anterior clasificacion este lejos de un modelo correcto, pero sirve esto como idea inicial para el tema de la metaprogramacion, donde ubicamos lo siguiente.

1) Tenemos definidas las herramientas que nos presenta cada nivel, que podemos hacer con cada una y podemos saber cuando estamos utilizando herramientas que no le pertenecen, por ejemplo si cuando programamos en codigo de maquina, y empezamos a utilizar algunas palabras clave para facilitar la programacion o un modelo hexadecimal de excritura, estamos aumentando a un lenguaje tal vez 0.1 o 0.2, pero si llegamos a crear nemotecnicos para cada una de las funciones y generamos un asembler sabemos que llegamos a el nivel 1. si en assemble empezamos a utilizar variables, secuencias, ciclos, desiciones, pasara a un nivel 2, etc. Pero finalmente tenemos una idea de las caracteristicas que tiene cada sistema.

2) El ide de desarrollo, o las herramientas que se utilicen para programar no tiene nada que ver con el nivel de lenguaje que estemos utilizando, por ejemplo porgramar en c, sea en un editor de texto, en una hoja de papel o en el ide mas avanzado que podamos crear, no modifica en ningun sentido la potencial del lenguaje, tal vez podamos trabajar mas rapido o con menos errores segun el entorno de desarrollo, pero no podemos decir que hacemos mas cosas en un entorno x o y.

3) Algo curioso que pasa cuando dividimos algo en capas es la comunicacion que hay entre ellas, aunque todos se puede romper y en eso somos expertos los humanos, una capa se comunica claramente con sus 2 adyacentes, por tanto es muy raro ver una combinacion de lenguaje sql con elementos de ensamblador, mientras que la combinacion entre sql y modelos de objetos o funciones lo podemos ver claramente y hasta se encuentran herramientas comerciales con estas caracteristicas.

Los intentos actuales de la estructuracion de los programas por medio de capas se estan dado a travez de las casas de desarrollo de software de desarrollo de software con los nuevos modelos de programacion que estan desarrollando cada vez mas especificos para las necesidades del cliente, pero no hay mejor entidad que defina las necesidades de programacion y de sistema que tiene cada uno que el mismo cliente, por lo tanto entrar en la cultura de desarrollar los lenguajes que resuelva mis problemas sera el siguiente paso. Algunas empresas estan dando sus primeros pasos en este sentidos una de la mas representativa es JetBrains, esta empresa esta desarrollando un ide que permite a los usuarios crear sus propios lenguajes en un ide excelente ademas le permite crear los ide para los lenguajes generados.

Este modelo no es nuevo, y como muchas cosas en sistemas, son caracteristicas que fueron investigadas hace ya varias decadas, como el caso de la programacion a objetos de smalltalk o compilacion en tiempo real de lisp, etc. Pero mirar la alternativa de la metaprogramacion en la actualidad, donde el poder de computo nos permite mirar de nuevo esas metodologias de una manera mucho mas sencilla sin restricciones de tiempo o simplemete como hobbies y no proyectos de investigacion costosos, puede ser una alternativa cuando no se tiene nada que hacer.

Entonces la metaprogramacion puede llegar a ser realmente el termino explicado en el principio, donde creamos una metodologia distinta donde podamos crear modelos nuevos y tener herramientas nuevas que nos simplifique las labores de programacion y asi crear programas mucho mas complicados sin por eso perder las riendas del proyecto.

No hay comentarios.: