Aguilar Armenta Adilene adi_flor@hotmail.com

Anaya Corona Edgar Aarón lizardking_hs@hotmail.com

ABSTRACT

The metaprogramación is a very powerful and very relief in the field of dynamic languages. Can lead us to strongly reduce the total amount of code we write and what is more important to minimize the amount of code repeated unnecessarily. Clearly leads us to increase the quality and maintainability of your code.


The complexity of our programs is increasing with the problems we face. One way to give a solution, is to repeat over and over again the same structures as we are accustomed to programming or traditional imperative. This article explores the relationship between templates C + +, generic programming and the ability of developing static computation and code generation. Many developers of high-level languages used to develop applications in scientific computation, and the mechanism of templates in C + + allows them to solve important problems in the design of class libraries.


One of the most commonly used by programming techniques is to write programs that generate programs or parts of the program. Learn why it is necessary metaprogramming and look at some of the components of metaprogramming (textual macro languages, specialized code generators). See how to build a code generator and get a closer look at the macro programming language sensitive in the system.


Code-generation programs are sometimes called meta; writing this type of program is called metaprogramming. Write programs that write code has many applications.

RESUMEN

La metaprogramación es una técnica muy poderosa, y muy socorrida en el terreno de los lenguajes dinámicos. Puede llevarnos a reducir muy fuertemente el total de código que escribimos y lo que es mucho más importante, a minimizar la cantidad de código repetido innecesariamente. Nos lleva claramente a aumentar la calidad y mantenibilidad de nuestro código.

La complejidad de nuestros programas, va en aumento con los problemas a los que nos enfrentamos. Una forma de darle solución, es repetir una y otra vez las mismas estructuras, tal como nos acostumbró la programación tradicional o imperativa. Este artículo, explora las relaciones entre plantillas C++, la programación genérica y la habilidad de desarrollar computaciones estáticas y generación de código. Muchos desarrolladores usan lenguajes de alto nivel para desarrollar aplicaciones en computación científica; y el mecanismo de las plantillas en C++ les permite resolver importantes problemas en el diseño de librerías de clase.

Una de las más utilizadas en virtud de técnicas de programación es escribir programas que generan programas o partes del programa. Learn why metaprogramming is necessary and look at some of the components of metaprogramming (textual macro languages, specialized code generators). Sepa por qué es necesario metaprogramming y buscar en algunos de los componentes de la metaprogramming (textual macro idiomas, especializados generadores de código). See how to build a code generator and get a closer look at language-sensitive macro programming in Scheme. Véase cómo construir un generador de código y obtener una mirada más cercana en el lenguaje de programación macro sensible en el sistema.

Code-generating programs are sometimes called metaprograms ; writing such programs is called metaprogramming .Código de generación de programas se denominan a veces meta; escrito este tipo de programas se llama metaprogramming. Writing programs that write code has numerous applications. Escribir programas que escriben código tiene numerosas aplicaciones.

INTRODUCCION

Muchas veces programamos varios elementos, ya sean clases, funciones, paquetes,... uno a uno, y aunque tengan muchas cosas en común, a lo más que recurrimos es al copy-paste. Siendo un poco más puristas, llegamos a recurrir a una buena organización de jerarquía de herencia e interfaces que nos permite no repetir mucho código.

Pero, ¿que pasa con esas cosas que no se pueden heredar pero que son muy similares? por ejemplo uno tiene 50 clases, cada una con sus variables de instancia, y para cada una implementa las funciones de acceso (get set), claramente ese comportamiento no puede reaprovecharse de una variable a otra y mucho menpos de una clase a otra, por tanto la idea es la misma, pero tenemos que implementarla 300 veces, ahí no nos queda otra que ir al copy-paste y echarle unas cuantas horas. Otra cosa similar es por ejemplo rellenar un objeto con cosas que están en BD, eso de forma muy sencilla puede ser ejecutar una select o un procedimiento que devuelva una tupla, y variable a variable, asignar el valor correspondiente. A lo largo de las 50 clases necesitamos los mismos métodos de lectura, escritura, actualización y borrado, y es otra cosa que no puede reaprovecharse más allá del copy-paste, repitiendo de nuevo 50 veces lo mismo pero cambiando algunas cosas.

Esto tiene solución, yo lo llamo metaprogramación (no sé si ya tiene otro nombre el concepto que explico, pero yo lo llamaré así). Esto consiste en no implementar cada clase o cada método, sino programar más abstracto, haciendo una especie de plantillas que cambiando la definición de la clase nos genere la propia clase, lós métodos de acceso, los métodos de accedo a datos (select, deletes,...), incluso formularios para interaccionar con el usuario.

Metaprogramar es más complejo que programar, ya que estás escribiendo en un lenguaje, algo que generará código dependiendo de la definición de una clase y además posiblemente en otro lenguaje.

Por ilustar esto con un ejemplo, estoy metaprogramando una aplicación. Parto de la definición de tablas en BD, por lo que ahí tengo la información de las clases que debe haber, como se relacionan entre sí, que variables utiliza cada clase y el tipo de cada una.

En base a eso he metaprogramado en script de base de datos (PL/SQL o como queráis verlo), lo necesario para a partir de esa definición de tablas, generar clases que representen esas tablas, con sus métodos para acceder a las variables, navegación entre los objetos teniendo en cuenta las claves externas, métodos de acceso a datos, con el que cada objeto puede crearse en BD, eliminarse, actualizarse o leerse. Se crean controles de usuario para dar una interfaz de cada objeto y formularios que controlen la lista de objetos de un tipo dado. Estos formularios también tienen en cuenta las claves externas para montar combobox si hay que seleccionar una clave externa,... y muchas otras características que resuleven gran número de problemás y dan gran potencia al código generado.

Si todo esto se contruye con una buena arquitectura software, puede mezclarse la parte de generación de código automática gracias a la metaprogramación, con la programación directa para implementar los aspectos que no sean generales a todos los objetos o formularios.

Haciendo esto, y viendo lo que genera mi metaprogramación, estimo que en este proyecto en el que se manejan unas 30 clases, generaré 50.000 líneas de código a partir de 2.000 líneas de metaprograma, con la ventaja añadida de que en cualquier momento puedo añadir una pequeña funcionalidad y ésta se verá en todos los objetos y a todos los niveles, y por otra parte con la convicción de que si un objeto funciona, todos los demás también lo harán, ya que se generan de la misma forma.

Es bueno ser un buen programador, pero es mucho mejor programar de forma inteligente.

DESARROLLO

La metaprogramación consiste en escribir código que no ataca directamente al dominio del problema que queremos atacar, sino que al código que lo resolvería. Dicho sea de otro modo, el código que escribimos no modifica los datos o el estado de nuestra información, sino que el del programa.

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.

Ambos lenguajes fueron revolucionarios en diversos aspectos, y si no gozan hoy en dí­a de mayor popularidad, se debe a que, en sus implementaciones originales sufrí­an de problemas de rendimiento en el hardware de su época. Sin embargo, sus ideas básicas han servido para conformar a una gran cantidad de lenguajes que han ido adquiriendo una cada vez mayor popularidad y aceptación

En primer lugar, puede escribir programas que se pre-generar cuadros de datos para su uso en tiempo de ejecución. For example, if you are writing a game and want a quick lookup table for the sine of all 8-bit integers, you can either calculate each sine yourself and hand-code it, have your program build the table at startup at runtime, or write a program to build the custom code for the table before compile-time. Por ejemplo, si usted está escribiendo un juego y quiere un cuadro de búsqueda rápida de la condición de los 8 bits, se puede calcular cada sine usted y parte de código que, haga que su programa de construir el cuadro en el inicio en tiempo de ejecución, o escribir un programa para construir el código personalizado para la tabla antes de tiempo de compilación. While it may make sense to build the table at runtime for such a small set of numbers, other such tasks may cause program startup to be prohibitively slow. Si bien puede tener sentido para construir la tabla en tiempo de ejecución para un grupo tan pequeño conjunto de números, otras tareas puede provocar el arranque del programa a ser prohibitivamente lento. In such cases, writing a program to build static data tables is usually your best answer. En tales casos, la escritura de un programa para construir tablas de datos estática suele ser su mejor respuesta.

Second, if you have a large application where many of the functions include a lot of boilerplate code, you can create a mini-language that will do the boilerplate code for you and allow you to code only the important parts. En segundo lugar, si usted tiene una gran aplicación en muchas de las funciones incluyen una gran cantidad de código de lenguaje, puede crear un mini-lenguaje que hará el código de lenguaje para usted y le permitirá código sólo las partes importantes. Now, if you can, it's best to abstract out the boilerplate portions into a function. Ahora, si se puede, lo mejor es abstracto lenguaje de las porciones en una función. But often the boilerplate code isn't so pretty. Pero a menudo el código de lenguaje no es tan bonita. Maybe there's a list of variables to be declared in every instance, maybe you need to register error handlers, or maybe there are several pieces of the boilerplate that have to have code inserted in certain circumstances. Tal vez hay una lista de variables que se declaren en todos los casos, tal vez tendrá que registrar manejadores de error, o tal vez hay varias piezas del lenguaje que tiene que tener el código insertado en determinadas circunstancias. All of these make a simple function call impossible. Todos estos hacer una simple llamada a función imposible. In such cases, it is often a good idea to create a mini-language that allows you to work with your boilerplate code in an easier fashion. En tales casos, a menudo es una buena idea para crear un mini-lenguaje que le permite trabajar con su lenguaje en código de una manera más fácil. This mini-language will then be converted into your regular source code language before compiling. Este mini-lenguaje de entonces se convertirá en su código fuente regular de idiomas antes de compilar.

Finally, a lot of programming languages make you write really verbose statements to do really simple things. Por último, una gran cantidad de lenguajes de programación que se escribe realmente detallado declaraciones a realmente hacer las cosas simples. Code-generating programs allow you to abbreviate such statements and save a lot of typing, which also prevents a lot of mistakes because there is less chance of mistyping. Código de generación de los programas le permiten abreviar esas declaraciones y guardar una gran cantidad de mecanografía, que también evita un montón de errores porque hay menos posibilidades de mistyping.

As languages acquire more features, code-generating programs get less appealing. Como adquirir las lenguas más características, el código de generación de programas de obtener menos atractivo. What is available as a standard feature of one language may be available only through a code-generating program in another language. ¿Qué está disponible como una característica estándar de un idioma puede estar disponible sólo a través de un código de generación de programa en otro idioma. However, inadequate language design is not the only reason for needing code-generating programs. Sin embargo, la insuficiencia de lenguaje de diseño no es la única razón de que necesitan el código de generación de programas. Easier maintenance is also a reason. Mantenimiento más fácil es también una razón.

Se denomina metaprogramación, al proceso por el cual un programa trata a los programas como datos. La metaprogramación es una práctica común en la programación en LISP, debido a que la estructura central del lenguaje es una estructura lista. La metaprogramación es codificar programas que a su vez codifican otros programas: Write programs to generate other programs.

En Teoría de Lenguajes, se define un metalenguaje como un lenguaje usado para describir otro lenguaje. Un BNF (Backus-Naur Form) es un metalenguaje para lenguajes de programación. La forma Backus-Naur fue desarrollada para Algol y desde allí es utilizada para describir los lenguajes por medio de gramáticas formales.

Los programas YACC y LEX, el primero escrito por Steve Johnson; son una muestra de programas analizadores que convierten la especificación gramatical de un lenguaje en un analizador(para nuestro caso sintáctico y lexical)[5] y [6]. La entrada a YACC es una gramática de libre contexto en la forma extendida BNF(EBNF) y su salida es un programa que efectúa un parser a la gramática. YACC es un metaprograma y las especificaciones son denominadas metadatos, que no están escritas en C, sino en un metalenguaje.

El nombre de metaprogramación, nace en el intento de LISP de contar con una notación cercana a FORTRAN. Esta notación fue denominada notación M o metalenguaje(de M-language). Según McCarthy el autor de LISP, el procesamiento de listas sería usado para el estudio de la computabilidad, el cual en esos días se estudiaba con las máquinas de Turing. Mas tarde la notación fue cambiada a lambda para la especificación de las definiciones de funciones.

Todas las estructuras LISP(datos y código) son denominadas S-expression. En la práctica expresiones significa S-expression.

Una S-expression es cualquiera:
Un número,
un string,
un identificador, o
una secuencia de S-expression entre paréntesis, (S-expression1 ... S-expressionn).

Las excepciones a estas reglas, definen las denominadas formas especiales.

En Scheme, la forma especial define, une los identificadores a los valores.

(define pi 3.14159) ; constant 'pi'
(define (sqr x) ; function 'square' (* x x) )

Las expresiones condicionales son implementadas por la forma especial if de acuerdo a la sintaxis:

( if <predicado> <consecuente> <alternativa> )

Las plantillas de metaprogramación, son programas C++, interpretados en tiempos de compilación[7]; y fueron inventadas por Todo Veldhuizen.

En el año de 1994, Todd Veldhuizen leyó un programa en C++ que había escrito Erwin Unruh y que circuló en el C++ standards committee meeting. El programa imprimía una lista de números primos en tiempo de compilación. Esto fue lo que le llevó a inventar las plantillas de metaprogramas. Un metaprograma es un programa que manipula otros programas; tal como ocurre con los compiladores y generadores de parser.

Erwin Unruh había inventado la programación de plantillas en tiempos de compilación; y desde este trabajo, Todd Veldhuizen inventa las plantillas de metaprogramación. La metaprogramación había sido descubierta por accidente, al reconocer que el mecanismo de la plantilla provee una rica facilidad para la computación en compile-time.

La metaprogramación es utilizada para generar códigos mas eficientes, o para desarrollar algunas evaluaciones en tiempo de compilación; evaluaciones que normalmente son postergadas hasta el run-time.

CONCLUCION

La parametrización en los algoritmos, es un aporte a las técnicas de programación, y permite resolver nuevos problemas.

La programación genérica está mucho más centrada en los algoritmos que en los datos y su postulado fundamental puede sintetizarse en una palabra: generalización.

La Metaprogramación es el proceso por el cual un programa trata a los programas como datos. La metaprogramación es codificar programas que a su vez codifican otros programas.

La motivación por la metaprogramación radica en la combinación de tres factores: eficiencia, expresión y corrección. Todo lo cual es opuesto a la programación tradicional, donde siempre existen conflictos entre expresión y corrección.

BIBLIOGRAFIA