La metaprogrammazione si riferisce a una varietà di modi in cui un programma conosce se stesso o può manipolarsi.
In linguaggi come C #, la riflessione è una forma di metaprogrammazione poiché il programma può esaminare le informazioni su se stesso. Ad esempio restituendo un elenco di tutte le proprietà di un oggetto.
In linguaggi come ActionScript, puoi valutare le funzioni in fase di runtime per creare nuovi programmi come eval ("x" + i). DoSomething () influenzerebbe un oggetto chiamato x1 quando i è 1 e x2 quando i è 2.
Infine, un'altra forma comune di metaprogrammazione è quando il programma può cambiare se stesso in modi non banali. LISP è ben noto per questo ed è qualcosa che Paul Graham ha sostenuto circa un decennio fa. Dovrò cercare alcuni dei suoi saggi specifici. Ma l'idea è che il programma cambierebbe un'altra parte del programma in base al suo stato. Ciò consente un livello di flessibilità per prendere decisioni in fase di esecuzione che è molto difficile oggi nelle lingue più diffuse.
Vale anche la pena notare che nei bei vecchi tempi della programmazione in assembly diretto, i programmi che si alteravano in fase di esecuzione erano necessari e molto comuni.
Dal saggio di Paul Graham "What Made Lisp Different" :
Molte lingue hanno qualcosa chiamato macro. Ma le macro Lisp sono uniche. E che tu ci creda o no, quello che fanno è legato alle parentesi. I progettisti di Lisp non hanno messo tutte quelle parentesi nella lingua solo per essere diversi. Per il programmatore Blub, il codice Lisp sembra strano. Ma quelle parentesi ci sono per un motivo. Sono la prova esteriore di una differenza fondamentale tra Lisp e altre lingue.
Il codice Lisp è composto da oggetti dati Lisp. E non nel senso banale che i file di origine contengono caratteri e le stringhe sono uno dei tipi di dati supportati dal linguaggio. Il codice Lisp, dopo essere stato letto dal parser, è costituito da strutture di dati che puoi attraversare.
Se capisci come funzionano i compilatori, quello che sta realmente succedendo non è tanto che Lisp ha una sintassi strana quanto che Lisp non ha sintassi. Scrivete programmi negli alberi di analisi che vengono generati all'interno del compilatore quando vengono analizzati altri linguaggi. Ma questi alberi di analisi sono completamente accessibili ai tuoi programmi. Puoi scrivere programmi che li manipolano. In Lisp, questi programmi sono chiamati macro. Sono programmi che scrivono programmi.
Programmi che scrivono programmi? Quando mai vorresti farlo? Non molto spesso, se pensi in Cobol. Tutto il tempo, se pensi in Lisp. Sarebbe conveniente qui se potessi fare un esempio di una potente macro, e dire lì! che ne dici di quello? Ma se lo facessi, sembrerebbe semplicemente incomprensibile a qualcuno che non conosce Lisp; non c'è spazio qui per spiegare tutto ciò che avresti bisogno di sapere per capire cosa significava. In Ansi Common Lisp ho cercato di spostare le cose il più velocemente possibile, e anche così non sono arrivato alle macro fino a pagina 160.
Ma penso di poter fornire una sorta di argomento che potrebbe essere convincente. Il codice sorgente dell'editor di Viaweb era probabilmente circa il 20-25% di macro. Le macro sono più difficili da scrivere rispetto alle normali funzioni Lisp, ed è considerato un cattivo stile usarle quando non sono necessarie. Quindi ogni macro in quel codice è lì perché deve esserci. Ciò significa che almeno il 20-25% del codice in questo programma fa cose che non puoi fare facilmente in nessun altro linguaggio. Per quanto scettico possa essere il programmatore di Blub riguardo alle mie affermazioni sui misteriosi poteri del Lisp, questo dovrebbe incuriosirlo. Non stavamo scrivendo questo codice per il nostro divertimento. Eravamo una piccola startup, programmando il più duramente possibile per mettere barriere tecniche tra noi ei nostri concorrenti.
Una persona sospettosa potrebbe iniziare a chiedersi se ci fosse qualche correlazione qui. Una grossa fetta del nostro codice stava facendo cose che sono molto difficili da fare in altre lingue. Il software risultante ha fatto cose che il software dei nostri concorrenti non poteva fare. Forse c'era qualche tipo di connessione. Ti incoraggio a seguire quel filo. Potrebbe esserci di più in quel vecchio che zoppica con le stampelle di quanto sembri.