Penso a metaprogamming come "programmi che scrivono (o modificano) altri programmi". (Un'altra risposta diceva "fabbriche che fabbricano fabbriche", bella analogia).
persone trovare tutti i tipi di usi per questo: le applicazioni di personalizzazione, la generazione di codice standard, ottimizzare un programma per circostanze particolari, DSL attuazione, inserendo il codice per gestire i problemi di progettazione ortogonali ("aspetti") ...
Ciò che è notevole è il modo in cui molti meccanismi sono stati inventati per fare questo frammentario: modelli di testo, macro, condizionali del preprocessore, generici, C++ - modelli, aspetti, riflessione, ... E di solito alcuni di questi meccanismi sono incorporati in alcuni lingue e altri meccanismi in altre lingue e la maggior parte delle lingue non ha alcun supporto per la metaprogrammazione. Questa distribuzione di funzionalità a dispersione significa che potresti essere in grado di fare alcuni tipi di metaprogrammazione in una lingua, con limitazioni, e tuttavia non essere in grado di farlo in un'altra. Ecco aggravante: -}
un'osservazione che ho seguito fino in fondo è che si può costruire generico macchinari metaprogrammazione che funziona con qualsiasi linguaggio in forma di program transformations. Una trasformazione di programma è un modello parametrizzato: "se vedi la sintassi , sostituisci con la sintassi".
Una trasformazione di per sé in genere non è impressionante, ma decine o centinaia possono rendere spettacolari le modifiche allo codice. Poiché le trasformazioni del programma (sofisticate) possono, nell'effetto , simulare una macchina di Turing, possono eseguire modifiche arbitrarie del codice, tra cui tutte quelle tecniche point-wise che si trovano sparse in giro.
Uno strumento che accetta le definizioni di lingua. Trasformazioni specifiche della lingua e genera un altro per applicare quelle trasformazioni è un meta -metaprogramming strumento: un programma per scrivere "programmi che scrivono programmi".
Il valore è che è possibile applicare tale strumento per eseguire un'ampia varietà di modifiche in codice arbitrario. E non hai bisogno del comitato di design linguistico per rendersi conto che hai bisogno di un particolare tipo di supporto per la metaprogrammazione e di affrettarti per fornirtelo così puoi andare avanti con il tuo lavoro oggi.
Una lezione interessante è che tali macchine necessitano di una forte analisi del programma (simbolo tabelle, controllo e analisi del flusso di dati, ecc.) supporto per concentrarsi su dove sono i problemi nel codice, in modo che la metaprogrammazione dei macchinari possa fare qualcosa in quel punto (un esempio molto debole di questo sono le specifiche punto-taglio in aspetti, che dicono "apportare modifiche a posti che assomigliano a questo ").
L'OP ha richiesto esempi specifici su dove è stata applicata la metaprogrammazione. Abbiamo utilizzato il nostro strumento "meta" -metaprogramming (DMS Software Reengineering Toolkit) di svolgere le seguenti attività sul grandi basi di codice automaticamente:
- migrazione Lingua
- Implementazione copertura di test e Profilers
- Clone Implementazione rilevamento
- architettura Massive reingegnerizzazione
generazione
- codice per il controllo della fabbrica
- SOAization di controller di rete integrati
- Architettura di estrazione per il software mainframe
- Generazione di istruzioni SIMD vettoriali da calcoli di matrice
- reverse engineering del codice di tornare ai concetti
attraverso molti linguaggi, inclusi Java, C#, C++, PHP, ...
L'OP ha anche chiesto: "Perché è stato meglio dell'alternativa?" La risposta ha a che fare con la scala, il tempo e la precisione.
Per le applicazioni di grandi dimensioni, la dimensione pura della base di codice significa che non si dispone delle risorse o del tempo per effettuare tali analisi o modifiche manualmente.
Per le attività di generazione o ottimizzazione del codice, è possibile eseguire manualmente lo strumento , ma gli strumenti possono farlo molto più rapidamente e con maggiore precisione.
In sostanza, questi strumenti fanno ciò che gli esseri umani semplicemente non possono.
Vale la pena notare che gli strumenti non hanno creatività; hai ancora bisogno degli umani per determinare cosa fare, ad es. per decidere quale attività (vedi sopra l'elenco per gli esempi) e determinare come definire le analisi/trasformazioni per ottenere l'effetto. Hai ancora bisogno di meta -programmatori. Tuttavia, quando un meta-programmatore arma uno strumento con le giuste conoscenze, il codice risultante può essere creato da un programmatore esperto incredibilmente veloce, creativo, come .
Il tuo secondo link sembra abbastanza chiaro, qual è la tua comprensione dei due concetti, per vedere se c'è qualche confusione fondamentale da parte tua, altrimenti la tua domanda è IMO troppo ampia e soggettiva. –
La mia domanda è una questione di praticità: perché metaprogrammare meglio di, ad esempio, scrivere alcune parti di query SQL parametrizzate e incollarle in base a determinate condizioni? O * è * che metaprogramming? (Io non * penso * così, ma è per questo che sto facendo la domanda - È diverso e perché è meglio?). –
Perché a volte non sai nemmeno quale tabella stai per interrogare o quali colonne restituirai prima del tempo (forse dipende da una combinazione di input dell'utente, troppo difficile da precalcolare tutte le possibilità prima del tempo), quindi usi l'SQL dinamico (che forse potrebbe essere pensato come una forma di metaprogrammazione). – FrustratedWithFormsDesigner