Gran pregunta Lamento mucho ver que ninguna de las respuestas actualmente responde a su pregunta correctamente. Quizás pueda ayudar ...
La definición de metaprogramación es realmente bastante simple: significa programas que manipulan programas.
Su respuesta aceptada dice programas que se manipulan a sí mismos. Esos son de hecho metaprogramas, pero son un subconjunto de todos los metaprogramas.
Todas:
- Analizadores
- Idiomas específicos del dominio (DSL)
- Lenguajes específicos de dominio incorporado (EDSL)
- Compiladores
- Intérpretes
- Reescritores de términos
- El teorema prueba
son metaprogramas Entonces, el compilador GCC es un metaprograma, el intérprete de CPython es un metaprograma, el sistema de álgebra computacional de Mathematica es un metaprograma, el probador del teorema de Coq es un metaprograma y así sucesivamente.
Otras respuestas han afirmado que los metaprogramas son programas que generan otros programas. Esos son de hecho metaprogramas pero, nuevamente, son un subconjunto de todos los metaprogramas. La biblioteca de la Transformada de Fourier más rápida en el oeste (FFTW) es un ejemplo de dicho metaprograma. El código fuente está escrito principalmente en OCaml y genera bits de código C (llamados codelets) que se combinan para crear rutinas Fast Fourier Transform de alto rendimiento optimizadas para máquinas específicas. Esa biblioteca se usa realmente para proporcionar las rutinas FFT en Matlab. La gente ha estado escribiendo programas para generar métodos numéricos durante décadas, desde los primeros días de FORTRAN .
El primer lenguaje de programación que integró el soporte para la metaprogramación fue el lenguaje LISt Processor (LISP) a fines de la década de 1950. LISP 1.5 incluyó una serie de características que facilitaron la metaprogramación. En primer lugar, el tipo de datos centrales de LISP son listas anidadas, es decir, árboles (a (b c) d)
, lo que significa que cualquier código LISP puede expresarse de forma nativa como una estructura de datos. Esto se conoce como homoiconicidad. En segundo lugar, el código LISP se puede convertir en datos fácilmente usando QUOTE. Por ejemplo, (+ 1 2 3)
agrega 1 + 2 + 3 y (QUOTE (+ 1 2 3))
crea una expresión que agrega 1 + 2 + 3 cuando se evalúa. En tercer lugar, LISP proporcionó un evaluador meta-circular que le permite utilizar el intérprete o compilador de host para evaluar el código LISP en tiempo de ejecución, incluido el código LISP generado en tiempo de ejecución. Los descendientes de LISP incluyen Scheme y Clojure. En todos estos lenguajes, la metaprogramación se ve más comúnmente en forma de programas que se modifican a sí mismos, generalmente usando macros.
En la década de 1970, Robin Milner desarrolló un MetaLanguage (ML) que evolucionó a la familia ML de lenguajes de programación que incluye ML estándar y OCaml e influyó fuertemente en Haskell y F # . Estos idiomas facilitan la expresión de otros idiomas. En estos idiomas, los metaprogramas se ven más comúnmente en forma de lexers, analizadores, intérpretes y compiladores.
En 1994, Erwin Unruh descubrió que el sistema de plantillas C ++ estaba completo y podía usarse para ejecutar programas arbitrarios en tiempo de compilación . La metaprogramación de plantilla C ++ trajo la metaprogramación a las masas sin lavar que (ab) la usaron para muchas cosas diferentes, incluida la generación de métodos numéricos en la biblioteca Blitz ++ .