Metaprogramación

Post date: Sep 7, 2010 7:54:45 AM

Metaprogramación es la escritura de programas informáticos que escriben o manipulan otros programas o a ellos mismos. Su objetivo es facilitar la escritura de programas dejando que sean otros programas los que escriban una parte importante del código a desarrollar. Igualmente, la metaprogramación puede permitir a un programa adaptarse para manejar nuevas situaciones sin tener que recompilarse.

El lenguaje en el que se realiza la metaprogramación es generalmente llamado un metalenguaje y el lenguaje manipulado es el lenguaje objeto. La habilidad de un lenguaje de ser su propio metalenguaje es generalmente llamada reflexión o reflexividad.

Los lenguajes reflexivos tienen la habilidad de crear o modificar partes de programas existentes, crear nuevas construcciones, extenderlas, etc. Para ello deben tener acceso a la representación de sí mismos como una estructura de datos que eventualmente pueden modificar.

El lenguaje de programación Ruby permite que los programas modifiques durante la ejecución algunos aspectos de su propia estructura que en otros lenguajes serían "intocables", tales como la definiciones de clases y métodos. Este tipo de metaprogramación puede usarse para escribir código más conciso y así extender de manera más efectiva el lenguaje.

Por ejemplo, el siguiente programa en Ruby genera nuevos métodos para la clase predefinida String, basándose en una lista de colores. Los métodos envuelven una cadena de caracteres con marcas HTML que cambian el estilo del texto para que utilice ese color.

COLORS = { :black => "000", :red => "f00", :green => "0f0", :yellow => "ff0", :blue => "00f", :magenta => "f0f", :cyan => "0ff", :white => "fff" } class String COLORS.each do |color,code| define_method "in_#{color}" do "<span style=\"color: ##{code}\">#{self}</span>" end end end

De esta forma cualquiera de los nuevos métodos de la clase String, in_red, in_blue, in:magenta, etc. pueden utilizarse de la siguiente forma:

"Hello, World!".in_blue => "<span style=\"color: #00f\">Hello, World!</span>"

Para implementar el equivalente en otros lenguajes, el programador tendría que escribir el código de cada método (in_black, in_red, in_green, etc.) a mano.

Enlaces relacionados

Cursos relacionados