ScholarGate
Assistant

Métaprogrammation et Macros

La métaprogrammation considère les programmes comme des données que d'autres programmes peuvent générer, inspecter ou transformer, les macros offrant une abstraction syntaxique contrôlée au moment de la compilation.

Trouver un sujet avec PaperMindBientôtFind papers & topics
Tools & resources
Télécharger les diapositives
Learn & explore
VidéoBientôt

Definition

La métaprogrammation est l'écriture de programmes qui produisent, analysent ou transforment d'autres programmes (ou eux-mêmes) ; les macros sont une fonctionnalité de métaprogrammation qui réécrit la syntaxe source en code étendu avant ou pendant la compilation.

Scope

Ce sujet couvre les techniques par lesquelles les programmes manipulent d'autres programmes : les macros lexicales et syntaxiques, l'expansion de macros hygiéniques, la génération de code au moment de la compilation, la programmation multi-étapes, la réflexion et les systèmes de gabarits (templates). Il aborde la manière dont ces mécanismes étendent la syntaxe et les abstractions d'un langage tout en préservant la correction, notamment en ce qui concerne la capture et la liaison de variables.

Core questions

  • Comment l'abstraction syntaxique peut-elle étendre un langage sans capture de nom dangereuse ?
  • Qu'est-ce qui distingue la métaprogrammation au moment de la compilation de la réflexion à l'exécution ?
  • Comment la programmation multi-étapes sépare-t-elle la génération de programmes de leur exécution ?
  • Quand la métaprogrammation améliore-t-elle l'abstraction par rapport à la lisibilité et aux outils (tooling) ?

Key theories

Expansion de macros hygiéniques
Kohlbecker et ses collègues ont introduit les macros hygiéniques, qui renomment automatiquement les variables liées lors de l'expansion afin que le code généré par la macro ne puisse pas capturer accidentellement ou être capturé par des noms présents sur le site d'utilisation.
Programmation multi-étapes
Taha et Sheard ont formalisé le calcul étagé avec des annotations explicites, offrant une description typée de la génération et de l'exécution de code à travers différentes étapes d'évaluation.
Métaprogrammation par gabarits (templates)
Sheard et Peyton Jones ont ajouté la métaprogrammation typée au moment de la compilation à Haskell, permettant aux programmes de construire et d'insérer de la syntaxe abstraite au moment de la compilation.

Clinical relevance

Les macros et la métaprogrammation permettent aux auteurs de bibliothèques de créer des abstractions spécifiques à un domaine, d'éliminer le code répétitif (boilerplate) et d'effectuer une spécialisation au moment de la compilation pour améliorer les performances. L'hygiène et la discipline de l'étagement (staging) sont ce qui rend ces puissantes fonctionnalités suffisamment sûres pour une utilisation quotidienne.

History

Les macros remontent aux débuts de Lisp et de l'assembleur, mais les macros Lisp non hygiéniques étaient sujettes à la capture accidentelle de variables. L'expansion hygiénique de Kohlbecker en 1986 a résolu ce problème, influençant les règles de syntaxe de Scheme. Des travaux ultérieurs ont formalisé la programmation multi-étapes (MetaML) et ont introduit la métaprogrammation typée au moment de la compilation dans des langages tels que Haskell, Scala et Rust.

Debates

Puissance versus compréhensibilité des macros
Les concepteurs de langages évaluent la puissance expressive de l'abstraction syntaxique illimitée par rapport à la difficulté qu'elle engendre pour les lecteurs, les débogueurs et les outils (tooling), ce qui motive l'hygiène et les systèmes de macros disciplinés.

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'est-ce qui rend un système de macros hygiénique ?
Un système de macros hygiénique garantit que les identificateurs introduits par une macro ne capturent pas ou n'occultent pas involontairement les identificateurs sur le site d'appel, et vice versa, en renommant systématiquement les variables liées lors de l'expansion.
En quoi la métaprogrammation diffère-t-elle des fonctions ordinaires ?
Les fonctions ordinaires opèrent sur des valeurs d'exécution, tandis que la métaprogrammation opère sur des représentations de programmes, générant ou transformant du code, souvent au moment de la compilation, avant l'existence de toute valeur d'exécution.

Methods for this concept

Related concepts