Metaprogramação e Macros
Metaprogramação trata programas como dados que outros programas podem gerar, inspecionar ou transformar, com macros fornecendo abstração sintática controlada em tempo de compilação.
Definition
Metaprogramação é a escrita de programas que produzem, analisam ou transformam outros programas (ou a si mesmos); macros são uma facilidade de metaprogramação que reescreve a sintaxe da fonte em código expandido antes ou durante a compilação.
Scope
Este tópico abrange técnicas pelas quais os programas manipulam programas: macros lexicais e sintáticas, expansão de macro higiênica, geração de código em tempo de compilação, programação multiestágio, reflexão e sistemas de template. Ele aborda como esses mecanismos estendem a sintaxe e as abstrações de uma linguagem, preservando a correção, especialmente em relação à captura e ligação de variáveis.
Core questions
- Como a abstração sintática pode estender uma linguagem sem captura de nome insegura?
- O que distingue a metaprogramação em tempo de compilação da reflexão em tempo de execução?
- Como a programação multiestágio separa a geração de programas da execução?
- Quando a metaprogramação melhora a abstração em vez de prejudicar a legibilidade e as ferramentas?
Key theories
- Expansão de macro higiênica
- Kohlbecker e colegas introduziram macros higiênicas, que renomeiam automaticamente as variáveis ligadas durante a expansão para que o código gerado por macro não possa acidentalmente capturar ou ser capturado por nomes no local de uso.
- Programação multiestágio
- Taha e Sheard formalizaram a computação em estágios com anotações explícitas, fornecendo uma descrição tipada da geração e execução de código em distintas fases de avaliação.
- Metaprogramação de template
- Sheard e Peyton Jones adicionaram metaprogramação tipada em tempo de compilação ao Haskell, permitindo que os programas construam e insiram sintaxe abstrata em tempo de compilação.
Clinical relevance
Macros e metaprogramação permitem que autores de bibliotecas criem abstrações específicas de domínio, eliminem código repetitivo (boilerplate) e realizem especialização em tempo de compilação para melhor desempenho. A higiene e a disciplina de estágio são o que tornam essas poderosas facilidades seguras o suficiente para o uso diário.
History
As macros datam do início do Lisp e da linguagem assembly, mas as macros Lisp não higiênicas eram propensas à captura acidental de variáveis. A expansão higiênica de Kohlbecker em 1986 resolveu isso, influenciando as regras de sintaxe do Scheme. Trabalhos subsequentes formalizaram a programação multiestágio (MetaML) e trouxeram a metaprogramação tipada em tempo de compilação para linguagens como Haskell, Scala e Rust.
Debates
- Poder versus compreensibilidade das macros
- Os projetistas de linguagem ponderam o poder expressivo da abstração sintática irrestrita contra a dificuldade que ela cria para leitores, depuradores e ferramentas, motivando a higiene e sistemas de macro 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
- O que torna um sistema de macros higiênico?
- Um sistema de macros higiênico garante que os identificadores introduzidos por uma macro não capturem ou sombreiem acidentalmente os identificadores no local da chamada, e vice-versa, renomeando sistematicamente as variáveis ligadas durante a expansão.
- Como a metaprogramação difere das funções comuns?
- Funções comuns operam em valores de tempo de execução, enquanto a metaprogramação opera em representações de programas, gerando ou transformando código, frequentemente em tempo de compilação, antes que quaisquer valores de tempo de execução existam.