La metaprogramación es un tipo de programación asociada con la creación de programas que generan otros programas como resultado de su trabajo [1] (en particular, en la etapa de compilación de su código fuente ) o programas que se modifican a sí mismos en tiempo de ejecución ( código automodificable). ). El primero te permite obtener programas con menos tiempo y esfuerzo de codificación que si el programador los escribiera completamente a mano, el segundo te permite mejorar las propiedades del código (tamaño y velocidad).
Con este enfoque, el código del programa no se escribe manualmente, sino que lo crea automáticamente un programa generador basado en otro programa.
Este enfoque tiene sentido si se desarrollan varias reglas adicionales durante la programación ( paradigmas de nivel superior , cumplimiento de los requisitos de bibliotecas externas, métodos estereotipados para implementar ciertas funciones, etc.). En este caso, parte del código (o de los datos) pierde su significado significativo y se convierte solo en una implementación mecánica de las reglas. Cuando esta parte se vuelve significativa, surge la idea de configurar manualmente solo la parte de contenido, y agregar el resto automáticamente. Esto es lo que hace el generador.
Hay dos tipos fundamentalmente diferentes de generación de código:
El ejemplo más común y obvio del primer caso son los constructores de GUI , donde el metaprograma está dirigido a la programación del usuario , lo que permite a los ergonomistas que no programan participar directamente en el desarrollo de productos de software. En este caso, el metaprograma resulta obviamente mucho más complejo, grande y lento de desarrollar que el código que genera, y su desarrollo se justifica por la frecuencia de su uso. Cabe señalar que en la práctica, por regla general (pero no necesariamente), dichos metaprogramas se escriben en lenguajes imperativos para su uso en lenguajes imperativos, y se suministran en forma compilada. La desventaja de este método es la imposibilidad de reutilizar el código del metaprograma al desarrollar nuevos metaprogramas más complejos.
Otros ejemplos son los generadores de parser y lexer como Lex , YACC , ANTLR , bison .
El segundo caso es la incrustación de lenguaje y se implementa mediante tres métodos estáticos que utilizan macros de lenguaje o incrustación pura. En este caso, la experiencia acumulada en el proceso de desarrollo de metaprogramas puede ser reutilizada intensivamente en el futuro para el desarrollo de nuevos metaprogramas [2] .
Otros ejemplos:
La capacidad de modificarse o agregarse a sí mismo en tiempo de ejecución convierte al programa en una máquina virtual . Aunque tal posibilidad existió durante mucho tiempo a nivel de códigos de máquina (y se usó activamente, por ejemplo, al crear virus polimórficos ), la metaprogramación generalmente se asocia con la transferencia de tales tecnologías a lenguajes de alto nivel.
Principales métodos de implementación:
En el lenguaje Prolog , la metaprogramación le permite automatizar el desarrollo y la verificación (verificación de propiedades) de los programas Prolog. Los metaprogramas consideran los programas de Prolog como términos y le permiten analizar sus propiedades y relaciones, crear programas para controlar otros programas de Prolog [4] .