A lo largo de mi experiencia como programador he ido trabajando con meta-programación en diferentes lenguajes y con diferentes aproximaciones. Y me gustaría aprovechar todo el conocimiento adquirido para escribir un artículo sobre el tema.

Citando a la wikipedia:

La metaprogramación consiste en escribir programas que escriben o manipulan otros programas (o a sí mismos) como datos, o que hacen en tiempo de compilación parte del trabajo que, de otra forma, se haría en tiempo de ejecución. Esto permite al programador ahorrar tiempo en la producción de código.

En casi todos los lenguajes de programación hay alguna forma de hacer algún tipo de metaprogramación:

  • En C, C++ y ensamblador tienes el preprocesador (macros) (metalenguaje)
  • En C++, D, Java y C# tienes los templates o tipos genéricos
  • En D tienes template mixins y funciones puras ejecutadas en tiempo de compilación
  • En PHP, ActionScript 3, Java y C# tienes Reflexión
  • En Python, Squirrel, ActionScript 3, Java y C# tienes Anotaciones o Atributos Personalizados
  • En PHP y Javascript tienes eval o include a archivos generados (sistemas de templates)
  • En C#, Java y Actionscript (y en todos los lenguajes con una máquina virtual) puedes emitir bytecodes de la máquina virtual y ejecutarlos
  • En muchos lenguajes puedes, de alguna forma, generar código nativo de la plataforma en tiempo de ejecución y ejecutarlo JIT (Just In Time) y dynarec (Recompilación dinámica).
  • En C#, J# y otros lenguajes, puedes acceder al código de los delegados como árboles abstractos (Expression Trees). Muy útil para LINQ (Language INtegrated Query)

Iré hablando en próximos artículos sobre todas las formas de meta-programación. Sus usos, sus bondades, sus problemas y casos prácticos en los que la he usado.

La meta-programación es uno de los aspectos más avanzados de la programación, así que esta serie de artículos está orientada a los programadores más veteranos.