Metaprogramação

10

Acabei de iniciar minha jornada como desenvolvedor de C ++ e recentemente pesquisei um tópico chamado metaprogramação. Até agora, passei por muitas informações sobre o assunto e tenho poucas perguntas.

  1. Uso da reflexão em c ++: é possível? De acordo com meu entendimento, a reflexão é uma técnica de metaprogramação que tem a capacidade de manipular um estado de um programa e sua manipulação pode ser introspecção ou introcessão.

  2. Qual é a diferença entre arquitetura reflexiva e arquitetura de meta-nível? Em qual categoria a arquitetura de metaprogramação se enquadra?

  3. A metaprogramação vem em dois níveis: meta-nível e base. No meu entendimento, o programa de objetos ou o sistema sob investigação é o nível básico, e o meta programa que irá operar sobre o sistema sob investigação é o nível meta. Estou correcto?

Também me ajude, fornecendo algumas diretrizes sobre como trabalhar na metaprogramação de modelos em C ++.
Você pode me sugerir alguns exemplos viáveis ​​que eu possa procurar para trabalhar nessa técnica de programação?

ChrisF
fonte
2
Esta pergunta pode pertencer mais aos programadores do que ao stackoverflow. O primeiro sendo mais teórico, e o posterior mais prático. Algumas peças podem ser facilmente respondidas a partir de um ponto de vista prático C ++ não tem reflexo , mas outros não são código relacionado (diferença entre arquiteturas reflexivas e metanível, por exemplo)
David Rodríguez - dribeas
Esta resposta do SO aborda por que o C ++ não possui reflexão: stackoverflow.com/q/359237/120163 e algumas técnicas fracas do C ++ para simulá-lo mal.
perfil completo de Ira Baxter
Se você está muito interessado em metaprogramação, sugiro que você dê uma olhada na linguagem D, que é mais clara que o C ++ nesse ponto.
deadalnix

Respostas:

10

Metaprogramação significa simplesmente que você tem os meios para escrever código que escreve outro código (em um sentido amplo). O C ++ faz isso através do mecanismo de modelo, que é basicamente uma linguagem de macro com segurança de tipo. É perfeitamente possível aplicar apenas a etapa de expansão do modelo, e o resultado será um código C ++ sem modelo válido.

Reflexão é a capacidade de uma linguagem de programação e / ou ambiente de tempo de execução para inspecionar (e freqüentemente modificar) seus próprios elementos de linguagem em tempo de execução. Normalmente, as linguagens reflexivas oferecem estruturas de dados que representam elementos da linguagem, como classes, métodos, variáveis, parâmetros, etc., bem como rotinas ou classes para inspecionar, modificar e criá-las. A capacidade de modificação faz da reflexão um tipo de metaprogramação, pois permite escrever código que gera outro código.

Outros exemplos de metaprogramação incluem geradores de código, binários auto-modificadores (apesar de não serem tão populares hoje em dia como eram há duas décadas), macros C; poder-se-ia argumentar que o curry e técnicas semelhantes de programação funcional também são uma espécie de metaprogramação.

tdammers
fonte
+1 Gosto muito da sua resposta e quero perguntar sobre o uso do compilador como um serviço, como em C #, ou sobre o uso de um mecanismo de script, como em Java, para executar o código construído em tempo de execução. Isso também não é uma forma de metaprogramação?
precisa
Então, quem cria um intérprete Python em C é metaprogramador? E a implementação de um ORM que mapeia uma linguagem orientada a objetos para SQL? Todo framework da web é um exemplo de metaprogramação?
Kojiro
1
  1. Não. Não é. Os programas C ++ são compilados no código da máquina e todas as informações sobre classes etc. são perdidas (a menos que você use C ++ / CLI para o ambiente .NET, mas não seja C ++ puro).

2-3. Não sei - aguarde outra resposta que ajude com isso :-)

Meta programação usando modelos C ++ é muito poderosa, mas também complexa. A expansão do modelo requer um estilo funcional de programação, em vez de uma programação imperativa que o C ++ usa. Se você não tem experiência anterior com programação funcional, recomendo que você faça um desvio e aprenda um pouco de linguagem, haskell ou esquema.

Anders Abel
fonte