Metaprogramación y Macros
La metaprogramación trata los programas como datos que otros programas pueden generar, inspeccionar o transformar, y las macros proporcionan una abstracción sintáctica controlada en tiempo de compilación.
Definition
La metaprogramación es la escritura de programas que producen, analizan o transforman otros programas (o a sí mismos); las macros son una facilidad de metaprogramación que reescribe la sintaxis fuente en código expandido antes o durante la compilación.
Scope
Este tema abarca las técnicas mediante las cuales los programas manipulan programas: macros léxicas y sintácticas, expansión de macros higiénicas, generación de código en tiempo de compilación, programación multi-etapa, reflexión y sistemas de plantillas. Aborda cómo estos mecanismos extienden la sintaxis y las abstracciones de un lenguaje mientras preservan la corrección, especialmente con respecto a la captura y el enlace de variables.
Core questions
- ¿Cómo puede la abstracción sintáctica extender un lenguaje sin una captura de nombres insegura?
- ¿Qué distingue la metaprogramación en tiempo de compilación de la reflexión en tiempo de ejecución?
- ¿Cómo separa la programación multi-etapa la generación de programas de la ejecución?
- ¿Cuándo mejora la metaprogramación la abstracción en lugar de perjudicar la legibilidad y las herramientas?
Key theories
- Expansión de macros higiénicas
- Kohlbecker y sus colegas introdujeron las macros higiénicas, que renombran automáticamente las variables enlazadas durante la expansión para que el código generado por la macro no pueda capturar accidentalmente o ser capturado por nombres en el sitio de uso.
- Programación multi-etapa
- Taha y Sheard formalizaron la computación por etapas con anotaciones explícitas, proporcionando una descripción tipada de la generación y ejecución de código a través de distintas etapas de evaluación.
- Metaprogramación de plantillas
- Sheard y Peyton Jones agregaron metaprogramación tipada en tiempo de compilación a Haskell, permitiendo que los programas construyan y empalmen sintaxis abstracta en tiempo de compilación.
Clinical relevance
Las macros y la metaprogramación permiten a los autores de bibliotecas crear abstracciones específicas de dominio, eliminar código repetitivo y realizar especializaciones en tiempo de compilación para mejorar el rendimiento. La higiene y la disciplina de las etapas son lo que hace que estas potentes facilidades sean lo suficientemente seguras para el uso diario.
History
Las macros se remontan a los primeros Lisp y al ensamblador, pero las macros Lisp no higiénicas eran propensas a la captura accidental de variables. La expansión higiénica de Kohlbecker en 1986 resolvió esto, influyendo en las reglas de sintaxis de Scheme. El trabajo posterior formalizó la programación multi-etapa (MetaML) y llevó la metaprogramación tipada en tiempo de compilación a lenguajes como Haskell, Scala y Rust.
Debates
- Poder versus comprensibilidad de las macros
- Los diseñadores de lenguajes sopesan el poder expresivo de la abstracción sintáctica sin restricciones frente a la dificultad que crea para los lectores, depuradores y herramientas, lo que motiva la higiene y los sistemas de macros disciplinados.
Key figures
- Eugene Kohlbecker
- Matthias Felleisen
- Walid Taha
- Tim Sheard
- Simon Peyton Jones
Related topics
Seminal works
- kohlbecker1986
- taha2000
- sheard2002
- abelson1996
Frequently asked questions
- ¿Qué hace que un sistema de macros sea higiénico?
- Un sistema de macros higiénico garantiza que los identificadores introducidos por una macro no capturen o enmascaren involuntariamente los identificadores en el sitio de la llamada, y viceversa, renombrando sistemáticamente las variables enlazadas durante la expansión.
- ¿En qué se diferencia la metaprogramación de las funciones ordinarias?
- Las funciones ordinarias operan sobre valores en tiempo de ejecución, mientras que la metaprogramación opera sobre representaciones de programas, generando o transformando código, a menudo en tiempo de compilación, antes de que existan valores en tiempo de ejecución.