Metaprogramación

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).

Generación de código

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:

  1. un generador es un programa binario físicamente separado, no necesariamente escrito en el idioma de destino.
  2. el idioma de destino es también el idioma de implementación del generador, por lo que el metaprograma forma un todo único con el programa de destino.

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:

Código automodificable

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:

Le permite ver, crear y modificar definiciones de tipo, la pila de llamadas en tiempo de ejecución , acceder a una variable por un nombre obtenido dinámicamente, etc.

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] .

Véase también

Notas

  1. Jonathan Bartlett, El arte de la metaprogramación, Parte 1: Introducción a la metaprogramación . Consultado el 4 de octubre de 2012. Archivado desde el original el 24 de diciembre de 2013.
  2. Paul Hudak. Herramientas y lenguajes específicos de dominio modular . — IEEE Computer Society Press, Departamento de Ciencias de la Computación, Universidad de Yale, 1998. Archivado desde el original el 17 de octubre de 2013.
  3. Lingua::Romana::Perligata - search.cpan.org
  4. Metakides, G. y Nerode, A. (1998): Principios de lógica y programación lógica (traducción al rumano). Editorial Técnica, Bucarest.

Enlaces