La metaprogrammazione si riferisce a una varietà di modi in cui un programma ha conoscenza di se stesso o può manipolare se stesso.
In linguaggi come C#, la riflessione è una forma di metaprogrammazione poiché il programma può esaminare informazioni su se stesso. Per esempio restituendo una lista di tutte le proprietà di un oggetto.
In linguaggi come ActionScript, è possibile valutare funzioni in fase di esecuzione 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. Questo permette un livello di flessibilità per prendere decisioni a runtime che è molto difficile nella maggior parte dei linguaggi popolari oggi.
E’ anche da notare che ai bei vecchi tempi della programmazione in assembly, i programmi che si alteravano a runtime erano necessari e molto comuni.
Dal saggio di Paul Graham “What Made Lisp Different”:
Molti linguaggi hanno qualcosa chiamato macro. Ma le macro Lisp sono uniche. E che ci crediate o no, quello che fanno è legato alle parentesi. I progettisti del Lisp non hanno messo tutte quelle parentesi nel linguaggio solo per essere diversi. Per il programmatore Blub, il codice Lisp sembra strano. Ma quelle parentesi sono lì per una ragione. Sono l’evidenza esteriore di una differenza fondamentale tra Lisp e gli altri linguaggi.
Il codice Lisp è fatto di oggetti dati Lisp. E non nel senso banale che i file sorgente contengono caratteri, e le stringhe sono uno dei tipi di dati supportati dal linguaggio. Il codice Lisp, dopo che è stato letto dal parser, è fatto di strutture di dati che si possono attraversare.
Se capite come funzionano i compilatori, ciò che sta realmente accadendo non è tanto che il Lisp ha una strana sintassi quanto che il Lisp non ha sintassi. Si scrivono programmi negli alberi di analisi che vengono generati all’interno del compilatore quando altri linguaggi vengono analizzati. Ma questi alberi di analisi sono completamente accessibili ai vostri programmi. Potete scrivere programmi che li manipolano. In Lisp, questi programmi sono chiamati macro. Sono programmi che scrivono programmi.
Programmi che scrivono programmi? Quando mai vorreste farlo? Non molto spesso, se si pensa in Cobol. Sempre, se si pensa in Lisp. Sarebbe comodo qui se potessi fare un esempio di una macro potente, e dire: ecco, che ne dite? Ma se lo facessi, sembrerebbe solo un borbottio per qualcuno che non conosce il Lisp; non c’è spazio qui per spiegare tutto quello che si dovrebbe sapere per capire cosa significa. In Ansi Common Lisp ho cercato di andare avanti il più velocemente possibile, e anche così non sono arrivato alle macro fino a pagina 160.
Ma penso di poter dare un tipo di argomento che potrebbe essere convincente. Il codice sorgente dell’editor Viaweb era probabilmente circa il 20-25% di macro. Le macro sono più difficili da scrivere delle 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 sta facendo cose che non si possono 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 renderlo curioso. Non stavamo scrivendo questo codice per il nostro divertimento. Eravamo una piccola startup, che programmava il più duramente possibile per mettere barriere tecniche tra noi e i nostri concorrenti.
Una persona sospettosa potrebbe iniziare a chiedersi se c’era qualche correlazione qui. Una grossa fetta del nostro codice faceva cose che sono molto difficili da fare in altri linguaggi. Il software risultante faceva cose che il software dei nostri concorrenti non poteva fare. Forse c’era qualche tipo di connessione. Vi incoraggio a seguire quel filo. In quel vecchio che zoppica con le sue stampelle potrebbe esserci più di quanto non appaia a prima vista.