Metaprogramação
# Metaprogramação

Metaprogramação é a programação de programas que escrevem ou manipulam outros programas (ou a si próprios) assim como seus dados, ou que fazem parte do trabalho em tempo de compilação. Em alguns casos, isso permite que os programadores sejam mais produtivos ao evitar que parte do código seja escrita manualmente.
A linguagem em que o metaprograma é escrito é chamada metalinguagem. A linguagem dos programas que são manipulados é chamada linguagem objeto. A habilidade de uma linguagem de programação de ser sua própria metalinguagem é chamada reflexão. A reflexão facilita a metaprogramação, assim como ter uma linguagem de programação que é um tipo de dado de primeira classe de si mesma. Por exemplo, a programação genérica invoca a metaprogramação na própria linguagem.
A metaprogramação é geralmente implementada através de duas formas. A primeira é a exposição do mecanismo interno de execução ao código através de uma API. A segunda é a execução dinâmica de expressões de texto que contém comandos de programação.

## Exemplos

Um exemplo de metaprogramação é o script bash abaixo, que demonstra a programação automática:
Esse código gera um novo programa com 993 linhas que imprime os números da faixa 1–992. Nem toda metaprogramação envolve programação automática. Se os programas são modificados em tempo de execução, então existem técnicas que realizam a metaprogramação sem realmente gerar código fonte como no exemplo anterior.
A ferramenta mais comum de metaprogramação é um compilador, que permite escrever pequenos programas em uma linguagem de alto nível a fim de gerar programas em linguagem de máquina. É uma ferramenta essencial já que na maioria dos casos é impraticável escrever manualmente um programa em linguagem de máquina. Outro exemplo comum de metaprogramação é o uso de lex e yacc, duas ferramentas usadas para gerar analisadores léxicos e sintáticos. Yacc é frequentemente usado como um compilador de compilador, uma ferramenta que gera uma ferramenta que traduz programas entre linguagens.
Um quine é um tipo especial de metaprograma que produz seu próprio código fonte como saída.