A metaprogramação refere-se a várias maneiras pelas quais um programa tem conhecimento de si mesmo ou pode se manipular.
Em linguagens como C #, a reflexão é uma forma de metaprogramação, pois o programa pode examinar informações sobre si mesmo. Por exemplo, retornando uma lista de todas as propriedades de um objeto.
Em linguagens como o ActionScript, você pode avaliar funções em tempo de execução para criar novos programas como eval ("x" + i). DoSomething () afetaria um objeto chamado x1 quando i for 1 e x2 quando i for 2.
Finalmente, outra forma comum de metaprogramação é quando o programa pode mudar de forma não-trivial. O LISP é bem conhecido por isso e é algo que Paul Graham defendeu cerca de uma década atrás. Vou ter que procurar alguns de seus ensaios específicos. Mas a idéia é que o programa mudaria outra parte do programa com base em seu estado. Isso permite um nível de flexibilidade para tomar decisões em tempo de execução que é muito difícil na maioria dos idiomas populares atualmente.
Também é importante notar que, nos bons e velhos tempos da programação em montagem direta, os programas que se alteravam em tempo de execução eram necessários e muito comuns.
Do ensaio de Paul Graham "What Made Lisp Different" :
Muitos idiomas têm algo chamado macro. Mas as macros Lisp são únicas. E, acredite ou não, o que eles fazem está relacionado aos parênteses. Os designers do Lisp não colocaram todos esses parênteses na linguagem apenas para serem diferentes. Para o programador Blub, o código Lisp parece estranho. Mas esses parênteses estão lá por uma razão. Eles são a evidência externa de uma diferença fundamental entre o Lisp e outras línguas.
O código Lisp é feito de objetos de dados Lisp. E não no sentido trivial de que os arquivos de origem contenham caracteres, e as strings são um dos tipos de dados suportados pelo idioma. O código Lisp, depois de lido pelo analisador, é feito de estruturas de dados que você pode percorrer.
Se você entende como os compiladores funcionam, o que realmente está acontecendo não é tanto o Lisp ter uma sintaxe estranha quanto o Lisp não ter a sintaxe. Você escreve programas nas árvores de análise que são geradas no compilador quando outros idiomas são analisados. Mas essas árvores de análise são totalmente acessíveis aos seus programas. Você pode escrever programas que os manipulam. No Lisp, esses programas são chamados de macros. Eles são programas que escrevem programas.
Programas que escrevem programas? Quando você gostaria de fazer isso? Não muito frequentemente, se você pensa em Cobol. O tempo todo, se você pensa em Lisp. Seria conveniente aqui se eu pudesse dar um exemplo de uma macro poderosa e dizer lá! que tal isso? Mas se eu soubesse, pareceria algo sem sentido para alguém que não conhecia Lisp; não há espaço aqui para explicar tudo o que você precisa saber para entender o que isso significava. No Ansi Common Lisp , tentei mover as coisas o mais rápido possível, e mesmo assim não cheguei às macros até a página 160.
Mas acho que posso dar um tipo de argumento que pode ser convincente. O código fonte do editor da Viaweb era provavelmente de 20 a 25% de macros. As macros são mais difíceis de escrever do que as funções comuns do Lisp, e é considerado um estilo ruim usá-las quando não são necessárias. Portanto, toda macro nesse código está lá porque precisa estar. O que isso significa é que pelo menos 20 a 25% do código deste programa está fazendo coisas que você não pode fazer facilmente em qualquer outro idioma. Por mais cético que o programador Blub possa estar sobre minhas reivindicações pelos poderes misteriosos de Lisp, isso deve deixá-lo curioso. Nós não estávamos escrevendo este código para nossa própria diversão. Éramos uma pequena startup, programando o máximo possível para colocar barreiras técnicas entre nós e nossos concorrentes.
Uma pessoa suspeita pode começar a se perguntar se havia alguma correlação aqui. Uma grande parte do nosso código estava fazendo coisas que são muito difíceis de fazer em outros idiomas. O software resultante fez coisas que o software de nossos concorrentes não podia fazer. Talvez houvesse algum tipo de conexão. Convido você a seguir esse tópico. Pode haver mais para aquele velho mancando de muletas do que aparenta.