Meta-programmazione


10

Ho appena iniziato il mio viaggio come sviluppatore C ++ e recentemente ho cercato un argomento chiamato meta-programmazione. Finora ho analizzato molte informazioni sull'argomento e ho alcune domande.

  1. Uso di Reflection in c ++: è possibile? Secondo la mia comprensione, la riflessione è una tecnica di meta-programmazione che ha la capacità di manipolare uno stato di un programma e la sua manipolazione può essere introspezione o introcessione.

  2. Qual è la differenza tra architettura riflettente e architettura meta-livello? In quale categoria rientra l'architettura della meta-programmazione?

  3. La meta-programmazione è disponibile in due livelli: livello meta e livello base. Secondo la mia comprensione, il programma oggetto o il sistema in esame è il livello base e il meta programma che funzionerà sul sistema in esame è il livello meta. Ho ragione?

Aiutami anche fornendo alcune linee guida su come lavorare sulla metaprogrammazione dei modelli in C ++.
Potresti suggerirmi alcuni esempi realizzabili che posso cercare per fare pratica con questa tecnica di programmazione?


2
Questa domanda potrebbe appartenere più ai programmatori che a StackOverflow. Il primo è più teorico e il secondo più pratico. Ad alcune parti si può facilmente rispondere da un punto di vista pratico Il C ++ non ha riflessione , ma altre non sono legate al codice (ad esempio, differenza tra architetture riflettenti e
metalevel

Questa risposta SO affronta il motivo per cui il C ++ non ha riflessione: stackoverflow.com/q/359237/120163 e alcune tecniche C ++ deboli per simularlo male.
Ira Baxter,

Se sei molto interessato alla metaprogrammazione, ti suggerisco di dare un'occhiata al linguaggio D, che è più chiaro del C ++ su questo punto.
deadalnix,

Risposte:


10

La metaprogrammazione significa semplicemente che hai i mezzi per scrivere codice che scrive altro codice (in senso lato). C ++ lo fa attraverso il meccanismo del modello, che è fondamentalmente un linguaggio macro sicuro per i tipi. È perfettamente possibile applicare solo il passaggio di espansione del modello e il risultato sarà un codice C ++ valido senza modello.

La riflessione è la capacità di un linguaggio di programmazione e / o di un ambiente di runtime di ispezionare (e spesso modificare) i propri elementi del linguaggio in fase di esecuzione. In genere, i linguaggi riflettenti offrono strutture di dati che rappresentano elementi di linguaggio come classi, metodi, variabili, parametri, ecc., Nonché routine o classi per ispezionarli, modificarli e crearli. La capacità di modifica rende la riflessione un tipo di meta-programmazione, poiché consente di scrivere codice che genera altro codice.

Altri esempi di metaprogrammazione includono generatori di codice, binari auto-modificanti (anche se questi non sono più così popolari oggi come lo erano due decenni fa), macro C; si potrebbe sostenere che anche il curry e simili tecniche di programmazione funzionale sono una sorta di metaprogrammazione.


+1 Mi piace molto la tua risposta e voglio chiedere informazioni sull'utilizzo del compilatore come servizio come in C # o sull'utilizzo di un motore di scripting come in Java per eseguire il codice che viene costruito in fase di esecuzione. Anche questa non è una forma di metaprogrammazione?
M.Sameer,

Quindi chiunque costruisca un interprete Python in C sta metaprogrammando? Che dire dell'implementazione di un ORM che associa un linguaggio orientato agli oggetti a SQL? Ogni framework web è un esempio di metaprogrammazione?
Kojiro,

1
  1. No. Non lo è. I programmi C ++ vengono compilati in codice macchina e tutte le informazioni sulle classi ecc. Vanno perse (a meno che non si usi C ++ / CLI per l'ambiente .NET, ma questo non è C ++ puro).

2-3. Non lo so - aspetta un'altra risposta che ti aiuti a farlo :-)

La meta-programmazione mediante modelli C ++ è molto potente, ma anche complessa. L'espansione del modello richiede uno stile funzionale di programmazione piuttosto che una programmazione imperativa che utilizza C ++. Se non hai precedenti esperienze con la programmazione funzionale, ti consiglio di fare una deviazione e imparare qualcosa di base, haskell o schema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.