Metaprogrammering henviser til en række forskellige måder, hvorpå et program har viden om sig selv eller kan manipulere sig selv.
I sprog som C# er refleksion en form for metaprogrammering, da programmet kan undersøge oplysninger om sig selv. F.eks. at returnere en liste over alle egenskaberne for et objekt.
I sprog som ActionScript kan du evaluere funktioner på køretid for at oprette nye programmer som f.eks. eval(“x” + i). DoSomething() ville påvirke et objekt kaldet x1, når i er 1, og x2, når i er 2.
Endeligt er en anden almindelig form for metaprogrammering, når programmet kan ændre sig selv på ikke-trivielle måder. LISP er velkendt for dette, og det er noget, som Paul Graham var fortaler for for omkring ti år siden. Jeg bliver nødt til at slå nogle af hans specifikke essays op. Men ideen er, at programmet ændrer en anden del af programmet på baggrund af dets tilstand. Dette giver en grad af fleksibilitet til at træffe beslutninger på køretid, som er meget vanskelig i de fleste populære sprog i dag.
Det er også værd at bemærke, at tilbage i de gode gamle dage med programmering i ren assembler var programmer, der ændrede sig selv på køretid, nødvendige og meget almindelige.
Fra Paul Grahams essay “What Made Lisp Different”:
Mange sprog har noget, der hedder en makro. Men Lisp-makroer er unikke. Og tro det eller ej, men det, de gør, er relateret til parenteserne. Designerne af Lisp har ikke sat alle disse parenteser ind i sproget bare for at være anderledes. For Blub-programmøren ser Lisp-kode underlig ud. Men der er en grund til, at disse parenteser er der. De er det ydre bevis på en grundlæggende forskel mellem Lisp og andre sprog.
Lisp-kode er lavet af Lisp-dataobjekter. Og ikke i den trivielle forstand, at kildefilerne indeholder tegn, og at strenge er en af de datatyper, der understøttes af sproget. Lisp-kode er, efter at den er blevet læst af parseren, lavet af datastrukturer, som man kan gennemløbe.
Hvis man forstår, hvordan compilere fungerer, er det, der i virkeligheden foregår, ikke så meget, at Lisp har en mærkelig syntaks, som at Lisp ikke har nogen syntaks. Man skriver programmer i de parse-træer, der bliver genereret i compileren, når andre sprog parses. Men disse parse trees er fuldt tilgængelige for dine programmer. Du kan skrive programmer, der manipulerer dem. I Lisp kaldes disse programmer for makroer. De er programmer, der skriver programmer.
Programmer, der skriver programmer? Hvornår ville du nogensinde have lyst til at gøre det? Ikke særlig ofte, hvis man tænker i Cobol. Hele tiden, hvis man tænker i Lisp. Det ville være praktisk her, hvis jeg kunne give et eksempel på en kraftfuld makro, og sige der! hvad med det? Men hvis jeg gjorde det, ville det bare ligne sludder for en person, der ikke kender Lisp; der er ikke plads her til at forklare alt det, man skal vide for at forstå, hvad det betyder. I Ansi Common Lisp forsøgte jeg at bevæge mig så hurtigt som muligt, og alligevel kom jeg først til makroer på side 160.
Men jeg tror, at jeg kan give en slags argumentation, der måske kan være overbevisende. Kildekoden til Viaweb-editoren bestod nok af ca. 20-25% makroer. Makroer er sværere at skrive end almindelige Lisp-funktioner, og det anses for at være dårlig stil at bruge dem, når de ikke er nødvendige. Så alle makroer i denne kode er der, fordi de er nødt til at være der. Det betyder, at mindst 20-25% af koden i dette program gør ting, som man ikke let kan gøre i andre sprog. Uanset hvor skeptisk Blub-programmøren måtte være over for mine påstande om Lisp’ mystiske kræfter, så burde dette gøre ham nysgerrig. Vi skrev ikke denne kode for vores egen fornøjelses skyld. Vi var en lille startup, der programmerede så hårdt, som vi kunne, for at sætte tekniske barrierer mellem os og vores konkurrenter.
En mistænksom person kunne begynde at spekulere på, om der var en sammenhæng her. En stor del af vores kode gjorde ting, som er meget svære at gøre i andre sprog. Den resulterende software gjorde ting, som vores konkurrenters software ikke kunne gøre. Måske var der en eller anden form for sammenhæng. Jeg opfordrer dig til at følge denne tråd. Der er måske mere i den gamle mand, der humpler rundt på sine krykker, end man umiddelbart kan se.